Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mygah-00005L-7U for pgsql-hackers@arkaria.postgresql.org; Sat, 18 Dec 2021 20:46:03 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1myga8-0006lb-B7 for pgsql-hackers@arkaria.postgresql.org; Sat, 18 Dec 2021 20:45:28 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1myga7-0006lR-JF for pgsql-hackers@lists.postgresql.org; Sat, 18 Dec 2021 20:45:28 +0000 Received: from mail-ed1-x530.google.com ([2a00:1450:4864:20::530]) by magus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1mygZy-0001fo-LZ for pgsql-hackers@lists.postgresql.org; Sat, 18 Dec 2021 20:45:26 +0000 Received: by mail-ed1-x530.google.com with SMTP id t5so21869467edd.0 for ; Sat, 18 Dec 2021 12:45:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; h=message-id:date:mime-version:user-agent:subject:content-language :from:to:cc:references:in-reply-to; bh=rjtyeaXFVg9ey031XXoEHuRQLMt+et6nKSv1pN3eRM0=; b=FrDVYE8AIu5uA8JdNby8ZbybR3Z15oLrjihSvMRdBizqetY2ARp9VgsaLpLQwmD4NG 6L4tV/8clpkqN8yB75xr9ugLLUlelK+gWk9Uo4mpr3t/qTal+Y6kWuw/qxv23BFRYPvj CEKrfqbzJ3hbmVHEctg1mfdk2IktNMZl0f+UAWjEGCDE7xI7ErMpJP0Cx2E3FKRR4aka rn1r+7yOX0OOM6AldRfCRgGMhmZ2wcESB+WQ560YIcHJW/TIZaQeJLOdn6vq9YYDSMuC rgeSA2JQNbhu5XjwXUmf1ysfQ8z1RFuvb4WH9Z33uRxe48qXGo+uEWdZ2PlZnsQcg1Qb BD3w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:from:to:cc:references:in-reply-to; bh=rjtyeaXFVg9ey031XXoEHuRQLMt+et6nKSv1pN3eRM0=; b=b6DN+jzuXPhwxbEm2mOMi+st739UsukLnZiXZvVheNp58t+t5Nop1f4UcAbCEDfjS8 UMnA+NM/OFiTmQXgSME7Y2r0E3RB/qIDij2t8fX2vGQFRrk041r8BPjiwxPPcYpVEYIJ jD3uMTpqwjCtUw9C0qfPW1EOyumUmoSwmBGsBkrvPXFajvW79oJof3G2lL+N+jx8n0Vb T/FeLpCB/KxVCo4XbEPdaWSEeZJPjor4wqLcoM9HZgRYbEGdvig4E8xz1QJ74YpI62PX C3T/1LnzmsFfSY21rl58XnA85uaYQPVQPMarWkcNeVTXoLd11YSQ5J5dq8keE2rIAH5X WlZQ== X-Gm-Message-State: AOAM532Apvn+/uWdwPDgjuhkzw0/XmX8t0KJGDxk31M0Chof5sBXLjo/ oetmI1tglhr5IMzOXq/ZlISox6S1OMiW8tPRQkU0NsERGh1iAIXDohDjyd3jlZMb8aESwyAofEp A1Ns8v0Magr+TRid9CDng5gcOEPjPzPykUYQx75GBN2Ulugd6JT3mvaRW6PYCbbXj68MrqpgP6l n80DLeN5uKMrboyifsm7/apEp9TAnOLQ8QXN9no+z7RoWSfM7hGk2GS3ng8GuF X-Google-Smtp-Source: ABdhPJwOQPZ411W/kmgapx+xVRu5oiB4UmuxMfgQBrKvShLmWA4i+FWbtN7SGXqbZkYa68x2c8wPTA== X-Received: by 2002:a50:bb2c:: with SMTP id y41mr4356836ede.58.1639860314594; Sat, 18 Dec 2021 12:45:14 -0800 (PST) Received: from [10.137.0.18] (ip-86-49-251-241.net.upcbroadband.cz. [86.49.251.241]) by smtp.gmail.com with ESMTPSA id i1sm3927919ejo.149.2021.12.18.12.45.13 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 18 Dec 2021 12:45:14 -0800 (PST) Content-Type: multipart/mixed; boundary="------------0etbKK7JqOS0RDwsWHBYrJuY" Message-ID: <7869761b-fdc7-6f7d-dc95-9ba8315a8ecf@enterprisedb.com> Date: Sat, 18 Dec 2021 21:45:09 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.2.0 Subject: Re: sequences vs. synchronous replication Content-Language: en-US From: Tomas Vondra To: Tom Lane Cc: PostgreSQL Hackers References: <712cad46-a9c8-1389-aef8-faf0203c9be9@enterprisedb.com> <1452362.1639803168@sss.pgh.pa.us> <38a6a779-ee8d-de3c-fbd7-709285be88fa@enterprisedb.com> In-Reply-To: <38a6a779-ee8d-de3c-fbd7-709285be88fa@enterprisedb.com> X-CLOUD-SEC-AV-Info: enterprisedb,google_mail,monitor X-CLOUD-SEC-AV-Sent: true X-Gm-Spam: 0 X-Gm-Phishy: 0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------0etbKK7JqOS0RDwsWHBYrJuY Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 12/18/21 07:00, Tomas Vondra wrote: > > > On 12/18/21 05:52, Tom Lane wrote: >> Tomas Vondra writes: >>> The problem is exactly the same as in [1] - the aborted transaction >>> generated WAL, but RecordTransactionAbort() ignores that and does not >>> update LogwrtResult.Write, with the reasoning that aborted transactions >>> do not matter. But sequences violate that, because we only write WAL >>> once every 32 increments, so the following nextval() gets "committed" >>> without waiting for the replica (because it did not produce WAL). >> >> Ugh. >> >>> I'm not sure this is a clear data corruption bug, but it surely walks >>> and quacks like one. My proposal is to fix this by tracking the lsn of >>> the last LSN for a sequence increment, and then check that LSN in >>> RecordTransactionCommit() before calling XLogFlush(). >> >> (1) Does that work if the aborted increment was in a different >> session?  I think it is okay but I'm tired enough to not be sure. >> > > Good point - it doesn't :-( At least not by simply storing LSN in a > global variable or something like that. > > The second backend needs to know the LSN of the last WAL-logged sequence > increment, but only the first backend knows that. So we'd need to share > that between backends somehow. I doubt we want to track LSN for every > individual sequence (because for clusters with many dbs / sequences that > may be a lot). > > Perhaps we could track just a fixed number o LSN values in shared memory > (say, 1024), and update/read just the element determined by hash(oid). > That is, the backend WAL-logging sequence with given oid would set the > current LSN to array[hash(oid) % 1024], and backend doing nextval() > would simply remember the LSN in that slot. Yes, if there are conflicts > that'll flush more than needed. > Here's a PoC demonstrating this idea. I'm not convinced it's the right way to deal with this - it surely seems more like a duct tape fix than a clean solution. But it does the trick. I wonder if storing this in shmem is good enough - we lose the LSN info on restart, but the checkpoint should trigger FPI which makes it OK. A bigger question is whether sequences are the only thing affected by this. If you look at RecordTransactionCommit() then we skip flush/wait in two cases: 1) !wrote_xlog - if the xact did not produce WAL 2) !markXidCommitted - if the xact does not have a valid XID Both apply to sequences, and the PoC patch tweaks them. But maybe there are other places where we don't generate WAL and/or assign XID in some cases, to save time? regards -- Tomas Vondra EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company --------------0etbKK7JqOS0RDwsWHBYrJuY Content-Type: text/x-patch; charset=UTF-8; name="sequences-track-lsn-poc.patch" Content-Disposition: attachment; filename="sequences-track-lsn-poc.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hhY3QuYyBiL3NyYy9i YWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hhY3QuYwppbmRleCBlN2IwYmM4MDRkLi5jNmEwYzA3 ODQ2IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94YWN0LmMKKysr IGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGFjdC5jCkBAIC0zNSw2ICszNSw3IEBA CiAjaW5jbHVkZSAiY2F0YWxvZy9wZ19lbnVtLmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9zdG9y YWdlLmgiCiAjaW5jbHVkZSAiY29tbWFuZHMvYXN5bmMuaCIKKyNpbmNsdWRlICJjb21tYW5k cy9zZXF1ZW5jZS5oIgogI2luY2x1ZGUgImNvbW1hbmRzL3RhYmxlY21kcy5oIgogI2luY2x1 ZGUgImNvbW1hbmRzL3RyaWdnZXIuaCIKICNpbmNsdWRlICJjb21tb24vcGdfcHJuZy5oIgpA QCAtMTI4OSw2ICsxMjkwLDEzIEBAIFJlY29yZFRyYW5zYWN0aW9uQ29tbWl0KHZvaWQpCiAJ Ym9vbAkJUmVsY2FjaGVJbml0RmlsZUludmFsID0gZmFsc2U7CiAJYm9vbAkJd3JvdGVfeGxv ZzsKIAorCS8qCisJICogRm9yY2UgZmx1c2ggYW5kIHN5bmNocm9ub3VzIHJlcGxpY2F0aW9u IGV2ZW4gaWYgbm8gWElEIHdhcyBhc3NpZ25lZC4KKwkgKiBUaGlzIGlzIG5lZWRlZCB3aGVu IGRlcGVuZGluZyBvbiBXQUwgcHJvZHVjZWQgYnkgYW5vdGhlciB0cmFuc2FjdGlvbgorCSAq IChwb3NzaWJseSBpbiBhIGRpZmZlcmVudCBiYWNrZW5kKS4gU2VxdWVuY2VzIG5lZWQgdGhp cywgZm9yIGV4YW1wbGUuCisJICovCisJYm9vbAkJZm9yY2Vfc3luYyA9IGZhbHNlOworCiAJ LyoKIAkgKiBMb2cgcGVuZGluZyBpbnZhbGlkYXRpb25zIGZvciBsb2dpY2FsIGRlY29kaW5n IG9mIGluLXByb2dyZXNzCiAJICogdHJhbnNhY3Rpb25zLiAgTm9ybWFsbHkgZm9yIERETHMs IHdlIGxvZyB0aGlzIGF0IGVhY2ggY29tbWFuZCBlbmQsCkBAIC0xMjk5LDYgKzEzMDcsMjQg QEAgUmVjb3JkVHJhbnNhY3Rpb25Db21taXQodm9pZCkKIAlpZiAoWExvZ0xvZ2ljYWxJbmZv QWN0aXZlKCkpCiAJCUxvZ0xvZ2ljYWxJbnZhbGlkYXRpb25zKCk7CiAKKwkvKgorCSAqIENo ZWNrIHRoZSBMU04gb2YgaW5jcmVtZW50cyBmb3Igc2VxdWVuY2VzIHdlIHRvdWNoZWQgaW4g dGhpcyB0cmFuc2FjdGlvbi4KKwkgKiBJZiBpdCdzIGhpZ2hlciB0aGFuIFhhY3RMYXN0UmVj RW5kLCB3ZSBuZWVkIHRvIGZvcmNlIGZsdXNoL3N5bmMuCisJICovCisJeworCQkvKiBTZXBh cmF0ZSBjYWxsLCBzbyB0aGF0IHdlIGNhbiBjb21wYXJlIHRvIFhhY3RMYXN0UmVjRW5kLiAq LworCQlYTG9nUmVjUHRyIHRtcHB0ciA9IFNlcXVlbmNlR2V0TGFzdExTTigpOworCisJCS8q CisJCSAqIElmIGhpZ2hlciB0aGFuIFhhY3RMYXN0UmVjRW5kLCBtYWtlIHN1cmUgd2UgZmx1 c2ggZXZlbiB3aXRob3V0CisJCSAqIGEgWElEIGFzc2lnbmVkLgorCQkgKi8KKwkJZm9yY2Vf c3luYyA9ICh0bXBwdHIgPiBYYWN0TGFzdFJlY0VuZCk7CisKKwkJLyogT3ZlcnJpZGUgdGhl IFhhY3RMYXN0UmVjRW5kIHZhbHVlLiAqLworCQlYYWN0TGFzdFJlY0VuZCA9IE1heChYYWN0 TGFzdFJlY0VuZCwgdG1wcHRyKTsKKwl9CisKIAkvKiBHZXQgZGF0YSBuZWVkZWQgZm9yIGNv bW1pdCByZWNvcmQgKi8KIAlucmVscyA9IHNtZ3JHZXRQZW5kaW5nRGVsZXRlcyh0cnVlLCAm cmVscyk7CiAJbmNoaWxkcmVuID0geGFjdEdldENvbW1pdHRlZENoaWxkcmVuKCZjaGlsZHJl bik7CkBAIC0xNDQ2LDcgKzE0NzIsNyBAQCBSZWNvcmRUcmFuc2FjdGlvbkNvbW1pdCh2b2lk KQogCSAqIGlmIGFsbCB0by1iZS1kZWxldGVkIHRhYmxlcyBhcmUgdGVtcG9yYXJ5IHRob3Vn aCwgc2luY2UgdGhleSBhcmUgbG9zdAogCSAqIGFueXdheSBpZiB3ZSBjcmFzaC4pCiAJICov Ci0JaWYgKCh3cm90ZV94bG9nICYmIG1hcmtYaWRDb21taXR0ZWQgJiYKKwlpZiAoKHdyb3Rl X3hsb2cgJiYgKG1hcmtYaWRDb21taXR0ZWQgfHwgZm9yY2Vfc3luYykgJiYKIAkJIHN5bmNo cm9ub3VzX2NvbW1pdCA+IFNZTkNIUk9OT1VTX0NPTU1JVF9PRkYpIHx8CiAJCWZvcmNlU3lu Y0NvbW1pdCB8fCBucmVscyA+IDApCiAJewpAQCAtMTUwNCw3ICsxNTMwLDcgQEAgUmVjb3Jk VHJhbnNhY3Rpb25Db21taXQodm9pZCkKIAkgKiBOb3RlIHRoYXQgYXQgdGhpcyBzdGFnZSB3 ZSBoYXZlIG1hcmtlZCBjbG9nLCBidXQgc3RpbGwgc2hvdyBhcyBydW5uaW5nCiAJICogaW4g dGhlIHByb2NhcnJheSBhbmQgY29udGludWUgdG8gaG9sZCBsb2Nrcy4KIAkgKi8KLQlpZiAo d3JvdGVfeGxvZyAmJiBtYXJrWGlkQ29tbWl0dGVkKQorCWlmICh3cm90ZV94bG9nICYmICht YXJrWGlkQ29tbWl0dGVkIHx8IGZvcmNlX3N5bmMpKQogCQlTeW5jUmVwV2FpdEZvckxTTihY YWN0TGFzdFJlY0VuZCwgdHJ1ZSk7CiAKIAkvKiByZW1lbWJlciBlbmQgb2YgbGFzdCBjb21t aXQgcmVjb3JkICovCkBAIC0xNTEyLDYgKzE1MzgsOCBAQCBSZWNvcmRUcmFuc2FjdGlvbkNv bW1pdCh2b2lkKQogCiAJLyogUmVzZXQgWGFjdExhc3RSZWNFbmQgdW50aWwgdGhlIG5leHQg dHJhbnNhY3Rpb24gd3JpdGVzIHNvbWV0aGluZyAqLwogCVhhY3RMYXN0UmVjRW5kID0gMDsK KwlTZXF1ZW5jZVJlc2V0TGFzdExTTigpOworCiBjbGVhbnVwOgogCS8qIENsZWFuIHVwIGxv Y2FsIGRhdGEgKi8KIAlpZiAocmVscykKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1h bmRzL3NlcXVlbmNlLmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9zZXF1ZW5jZS5jCmluZGV4 IDcyYmZkYzA3YTQuLjQzZmUxOTgzMWUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NvbW1h bmRzL3NlcXVlbmNlLmMKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvc2VxdWVuY2UuYwpA QCAtMTA5LDYgKzEwOSwxOSBAQCBzdGF0aWMgdm9pZCBpbml0X3BhcmFtcyhQYXJzZVN0YXRl ICpwc3RhdGUsIExpc3QgKm9wdGlvbnMsIGJvb2wgZm9yX2lkZW50aXR5LAogc3RhdGljIHZv aWQgZG9fc2V0dmFsKE9pZCByZWxpZCwgaW50NjQgbmV4dCwgYm9vbCBpc2NhbGxlZCk7CiBz dGF0aWMgdm9pZCBwcm9jZXNzX293bmVkX2J5KFJlbGF0aW9uIHNlcXJlbCwgTGlzdCAqb3du ZWRfYnksIGJvb2wgZm9yX2lkZW50aXR5KTsKIAorLyogaGFuZGxlIGZsdXNoL3N5bmMgZm9y IHNlcXVlbmNlcyAqLworI2RlZmluZSBTRVFVRU5DRV9MU05fQ09VTlQgMTAyNAorCit0eXBl ZGVmIHN0cnVjdCBTZXF1ZW5jZUxzblN0YXRlIHsKKwlzbG9ja190CQlsb2NrOworCVhMb2dS ZWNQdHIJbHNuW1NFUVVFTkNFX0xTTl9DT1VOVF07Cit9IFNlcXVlbmNlTHNuU3RhdGU7CisK K3N0YXRpYyBTZXF1ZW5jZUxzblN0YXRlICpTZXF1ZW5jZVNobWVtSW5mbyA9IE5VTEw7Citz dGF0aWMgWExvZ1JlY1B0ciBsYXN0U2VxdWVuY2VMU04gPSBJbnZhbGlkWExvZ1JlY1B0cjsK Kworc3RhdGljIHZvaWQgU2VxdWVuY2VTZXRMU04oT2lkIHJlbGlkLCBYTG9nUmVjUHRyIHJl Y3B0cik7CitzdGF0aWMgWExvZ1JlY1B0ciBTZXF1ZW5jZUdldExTTihPaWQgcmVsaWQpOwog CiAvKgogICogRGVmaW5lU2VxdWVuY2UKQEAgLTQwNiw3ICs0MTksMTIgQEAgZmlsbF9zZXFf d2l0aF9kYXRhKFJlbGF0aW9uIHJlbCwgSGVhcFR1cGxlIHR1cGxlKQogCQlyZWNwdHIgPSBY TG9nSW5zZXJ0KFJNX1NFUV9JRCwgWExPR19TRVFfTE9HKTsKIAogCQlQYWdlU2V0TFNOKHBh Z2UsIHJlY3B0cik7CisKKwkJU2VxdWVuY2VTZXRMU04ocmVsLT5yZF9pZCwgcmVjcHRyKTsK KwkJbGFzdFNlcXVlbmNlTFNOID0gcmVjcHRyOwogCX0KKwllbHNlCisJCWxhc3RTZXF1ZW5j ZUxTTiA9IFNlcXVlbmNlR2V0TFNOKHJlbC0+cmRfaWQpOwogCiAJRU5EX0NSSVRfU0VDVElP TigpOwogCkBAIC04MTAsNyArODI4LDEyIEBAIG5leHR2YWxfaW50ZXJuYWwoT2lkIHJlbGlk LCBib29sIGNoZWNrX3Blcm1pc3Npb25zKQogCQlyZWNwdHIgPSBYTG9nSW5zZXJ0KFJNX1NF UV9JRCwgWExPR19TRVFfTE9HKTsKIAogCQlQYWdlU2V0TFNOKHBhZ2UsIHJlY3B0cik7CisK KwkJU2VxdWVuY2VTZXRMU04ocmVsaWQsIHJlY3B0cik7CisJCWxhc3RTZXF1ZW5jZUxTTiA9 IHJlY3B0cjsKIAl9CisJZWxzZQorCQlsYXN0U2VxdWVuY2VMU04gPSBTZXF1ZW5jZUdldExT TihyZWxpZCk7CiAKIAkvKiBOb3cgdXBkYXRlIHNlcXVlbmNlIHR1cGxlIHRvIHRoZSBpbnRl bmRlZCBmaW5hbCBzdGF0ZSAqLwogCXNlcS0+bGFzdF92YWx1ZSA9IGxhc3Q7CQkvKiBsYXN0 IGZldGNoZWQgbnVtYmVyICovCkBAIC0xMDA1LDcgKzEwMjgsMTIgQEAgZG9fc2V0dmFsKE9p ZCByZWxpZCwgaW50NjQgbmV4dCwgYm9vbCBpc2NhbGxlZCkKIAkJcmVjcHRyID0gWExvZ0lu c2VydChSTV9TRVFfSUQsIFhMT0dfU0VRX0xPRyk7CiAKIAkJUGFnZVNldExTTihwYWdlLCBy ZWNwdHIpOworCisJCVNlcXVlbmNlU2V0TFNOKHJlbGlkLCByZWNwdHIpOworCQlsYXN0U2Vx dWVuY2VMU04gPSByZWNwdHI7CiAJfQorCWVsc2UKKwkJbGFzdFNlcXVlbmNlTFNOID0gU2Vx dWVuY2VHZXRMU04ocmVsaWQpOwogCiAJRU5EX0NSSVRfU0VDVElPTigpOwogCkBAIC0xOTI3 LDMgKzE5NTUsOTggQEAgc2VxX21hc2soY2hhciAqcGFnZSwgQmxvY2tOdW1iZXIgYmxrbm8p CiAKIAltYXNrX3VudXNlZF9zcGFjZShwYWdlKTsKIH0KKworCisvKgorICogSW5pdGlhbGl6 YXRpb24gb2Ygc2hhcmVkIG1lbW9yeSBmb3Igc2VxdWVuY2UgTFNOIHBvc2l0aW9ucy4KKyAq CisgKiBUbyB0cmFjayB0aGUgbGFzdCBMU04gZm9yIGVhY2ggc2VxdWVuY2Ugd2UgdXNlIGEg Zml4ZWQtbGVuZ3RoIGFycmF5LCBhbmQgdXNlCisgKiBPSUQgb2YgdGhlIHNlcXVlbmNlIHRv IHNlbGVjdCB0aGUgZWxlbWVudC4gVGhpcyBhbGxvd3MgdXMgdG8gaGFuZGxlIHVua25vd24K KyAqIG51bWJlciBvZiBzZXF1ZW5jZXMgaW4gYSBsaW1pdGVkIGFtb3VudCBvZiBzcGFjZSwg YnV0IGl0IG1heSBmb3JjZSB1cyB0bworICogc3luYyBhIGJpdCB0b28gbXVjaCBpZiB0d28g c2VxdWVuY2VzIGNvbmZsaWN0IChwaWNrIHRoZSBzYW1lIGFycmF5IGVsZW1lbnQpLgorICog QnV0IHRoYXQgc2VlbXMgbGlrZSBhY2NlcHRhYmxlIHRyYWRlb2ZmLgorICovCitTaXplCitT ZXF1ZW5jZVNobWVtU2l6ZSh2b2lkKQoreworCXJldHVybiBzaXplb2YoU2VxdWVuY2VMc25T dGF0ZSk7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBMU04gYXJyYXkgKHNldCBpdCB0 byBJbnZhbGlkWExvZ1JlY1B0cikuCisgKi8KK3ZvaWQKK1NlcXVlbmNlU2htZW1Jbml0KHZv aWQpCit7CisJYm9vbAkJZm91bmQ7CisJU2VxdWVuY2VTaG1lbUluZm8KKwkJPSAoU2VxdWVu Y2VMc25TdGF0ZSAqKSBTaG1lbUluaXRTdHJ1Y3QoIlNlcXVlbmNlcyBTaG1lbSIsIFNlcXVl bmNlU2htZW1TaXplKCksICZmb3VuZCk7CisKKwlpZiAoIWZvdW5kKQorCXsKKwkJLyogRmly c3QgdGltZSB0aHJvdWdoLCBzbyBpbml0aWFsaXplICovCisJCVNwaW5Mb2NrSW5pdCgmKFNl cXVlbmNlU2htZW1JbmZvLT5sb2NrKSk7CisJCU1lbVNldChTZXF1ZW5jZVNobWVtSW5mby0+ bHNuLCAwLCBTRVFVRU5DRV9MU05fQ09VTlQgKiBzaXplb2YoWExvZ1JlY1B0cikpOworCX0K K30KKworLyoKKyAqIFVwZGF0ZSBMU04gdHJhY2tlZCBmb3IgYSBzZXF1ZW5jZSB3aXRoIGEg Z2l2ZW4gT0lELgorICoKKyAqIFhYWCBNYXliZSBoYXNoIHRoZSBPSUQuCisgKi8KK3N0YXRp YyB2b2lkCitTZXF1ZW5jZVNldExTTihPaWQgcmVsaWQsIFhMb2dSZWNQdHIgcmVjcHRyKQor eworCWludAlpZHggPSAocmVsaWQgJSBTRVFVRU5DRV9MU05fQ09VTlQpOworCisJQXNzZXJ0 KFNlcXVlbmNlU2htZW1JbmZvKTsKKworCVNwaW5Mb2NrQWNxdWlyZSgmKFNlcXVlbmNlU2ht ZW1JbmZvLT5sb2NrKSk7CisJU2VxdWVuY2VTaG1lbUluZm8tPmxzbltpZHhdID0gTWF4KFNl cXVlbmNlU2htZW1JbmZvLT5sc25baWR4XSwgcmVjcHRyKTsKKwlTcGluTG9ja1JlbGVhc2Uo JihTZXF1ZW5jZVNobWVtSW5mby0+bG9jaykpOworfQorCisvKgorICogR2V0IExTTiB0cmFj a2VkIGZvciBhIHNlcXVlbmNlIHdpdGggYSBnaXZlbiBPSUQuCisgKgorICogWFhYIFdoYXQg aWYgdGhlIExTTiBpcyAwLzA/IFByZXN1bWFibHkgdGhhdCBtZWFucyB3ZSBkb24ndCBoYXZl IGFueSB2YWx1ZQorICogKGUuZy4gYWZ0ZXIgYSByZXN0YXJ0KS4gTWF5YmUgd2Ugc2hvdWxk IHVzZSBjdXJyZW50IGluc2VydCBMU04gaW4gdGhhdCBjYXNlPworICogQWx0aG91Z2gsIHNo dXRkb3duIGZvcmNlcyBjaGVja3BvaW50LCBhbmQgd2Ugd3JpdGUgRlBJIG9yIHNvbWV0aGlu Zz8KKyAqLworc3RhdGljIFhMb2dSZWNQdHIKK1NlcXVlbmNlR2V0TFNOKE9pZCByZWxpZCkK K3sKKwlpbnQJCQlpZHggPSAocmVsaWQgJSBTRVFVRU5DRV9MU05fQ09VTlQpOworCVhMb2dS ZWNQdHIJbHNuOworCisJQXNzZXJ0KFNlcXVlbmNlU2htZW1JbmZvKTsKKworCVNwaW5Mb2Nr QWNxdWlyZSgmKFNlcXVlbmNlU2htZW1JbmZvLT5sb2NrKSk7CisJbHNuID0gU2VxdWVuY2VT aG1lbUluZm8tPmxzbltpZHhdOworCVNwaW5Mb2NrUmVsZWFzZSgmKFNlcXVlbmNlU2htZW1J bmZvLT5sb2NrKSk7CisKKwlyZXR1cm4gbHNuOworfQorCisvKgorICogUmV0dXJuIHRoZSBo aWdoZXIgTFNOIGZvciBhbnkgc2VxdWVuY2Ugd2UgdG91Y2hlZCBpbiB0aGlzIHNlc3Npb24g KGVpdGhlcgorICogdGhlIFdBTCB3ZSB3cm90ZSwgb3IgV0FMIHByb2R1Y2VkIGJ5IG90aGVy IHRyYW5zYWN0aW9uIHdlIGRlcGVuZCBvbikuCisgKi8KK1hMb2dSZWNQdHIKK1NlcXVlbmNl R2V0TGFzdExTTih2b2lkKQoreworCXJldHVybiBsYXN0U2VxdWVuY2VMU047Cit9CisKKy8q CisgKiBSZXNldCB0aGUgbGFzdCBMU04gYWZ0ZXIgd2UgZmx1c2guCisgKgorICogWFhYIE5v dCBzdXJlIHdlIGFjdHVhbGx5IG5lZWQgdG8gZG8gdGhpcy4gTWF5YmUgd2UgZG9uJ3QgbmVl ZCB0cCByZXNldCBhbmQKKyAqIGtlZXBpbmcgdGhlIHZhbHVlIGZvcmV2ZXIgaXMgZmluZS4K KyAqLwordm9pZAorU2VxdWVuY2VSZXNldExhc3RMU04odm9pZCkKK3sKKwlsYXN0U2VxdWVu Y2VMU04gPSBJbnZhbGlkWExvZ1JlY1B0cjsKK30KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5k L3N0b3JhZ2UvaXBjL2lwY2kuYyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL2lwY2kuYwpp bmRleCA5ZmEzZTA2MzFlLi41MTdjY2E0NTBiIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9z dG9yYWdlL2lwYy9pcGNpLmMKKysrIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvaXBjaS5j CkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSAiYWNjZXNzL3N5bmNzY2FuLmgiCiAjaW5j bHVkZSAiYWNjZXNzL3R3b3BoYXNlLmgiCiAjaW5jbHVkZSAiY29tbWFuZHMvYXN5bmMuaCIK KyNpbmNsdWRlICJjb21tYW5kcy9zZXF1ZW5jZS5oIgogI2luY2x1ZGUgIm1pc2NhZG1pbi5o IgogI2luY2x1ZGUgInBnc3RhdC5oIgogI2luY2x1ZGUgInBvc3RtYXN0ZXIvYXV0b3ZhY3V1 bS5oIgpAQCAtMTQzLDYgKzE0NCw3IEBAIENhbGN1bGF0ZVNobWVtU2l6ZShpbnQgKm51bV9z ZW1hcGhvcmVzKQogCXNpemUgPSBhZGRfc2l6ZShzaXplLCBCVHJlZVNobWVtU2l6ZSgpKTsK IAlzaXplID0gYWRkX3NpemUoc2l6ZSwgU3luY1NjYW5TaG1lbVNpemUoKSk7CiAJc2l6ZSA9 IGFkZF9zaXplKHNpemUsIEFzeW5jU2htZW1TaXplKCkpOworCXNpemUgPSBhZGRfc2l6ZShz aXplLCBTZXF1ZW5jZVNobWVtU2l6ZSgpKTsKICNpZmRlZiBFWEVDX0JBQ0tFTkQKIAlzaXpl ID0gYWRkX3NpemUoc2l6ZSwgU2htZW1CYWNrZW5kQXJyYXlTaXplKCkpOwogI2VuZGlmCkBA IC0yOTMsNiArMjk1LDcgQEAgQ3JlYXRlU2hhcmVkTWVtb3J5QW5kU2VtYXBob3Jlcyh2b2lk KQogCUJUcmVlU2htZW1Jbml0KCk7CiAJU3luY1NjYW5TaG1lbUluaXQoKTsKIAlBc3luY1No bWVtSW5pdCgpOworCVNlcXVlbmNlU2htZW1Jbml0KCk7CiAKICNpZmRlZiBFWEVDX0JBQ0tF TkQKIApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvY29tbWFuZHMvc2VxdWVuY2UuaCBiL3Ny Yy9pbmNsdWRlL2NvbW1hbmRzL3NlcXVlbmNlLmgKaW5kZXggNDA1NDRkZDRjNy4uODVmYmMz Nzg5ZCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvY29tbWFuZHMvc2VxdWVuY2UuaAorKysg Yi9zcmMvaW5jbHVkZS9jb21tYW5kcy9zZXF1ZW5jZS5oCkBAIC02Niw0ICs2NiwxMCBAQCBl eHRlcm4gdm9pZCBzZXFfZGVzYyhTdHJpbmdJbmZvIGJ1ZiwgWExvZ1JlYWRlclN0YXRlICpy cHRyKTsKIGV4dGVybiBjb25zdCBjaGFyICpzZXFfaWRlbnRpZnkodWludDggaW5mbyk7CiBl eHRlcm4gdm9pZCBzZXFfbWFzayhjaGFyICpwYWdlZGF0YSwgQmxvY2tOdW1iZXIgYmxrbm8p OwogCisKK2V4dGVybiBTaXplIFNlcXVlbmNlU2htZW1TaXplKHZvaWQpOworZXh0ZXJuIHZv aWQgU2VxdWVuY2VTaG1lbUluaXQodm9pZCk7CitleHRlcm4gWExvZ1JlY1B0ciBTZXF1ZW5j ZUdldExhc3RMU04odm9pZCk7CitleHRlcm4gdm9pZCBTZXF1ZW5jZVJlc2V0TGFzdExTTih2 b2lkKTsKKwogI2VuZGlmCQkJCQkJCS8qIFNFUVVFTkNFX0ggKi8K --------------0etbKK7JqOS0RDwsWHBYrJuY--