Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1vAsz2-006vcY-CY for pgsql-hackers@arkaria.postgresql.org; Mon, 20 Oct 2025 16:43:43 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1vAsz1-002Kat-8I for pgsql-hackers@arkaria.postgresql.org; Mon, 20 Oct 2025 16:43:42 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1vAsz0-002Ka1-QJ for pgsql-hackers@lists.postgresql.org; Mon, 20 Oct 2025 16:43:41 +0000 Received: from mail-yx1-xb12a.google.com ([2607:f8b0:4864:20::b12a]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vAsyx-002p10-1m for pgsql-hackers@postgresql.org; Mon, 20 Oct 2025 16:43:40 +0000 Received: by mail-yx1-xb12a.google.com with SMTP id 956f58d0204a3-63e393c4a8aso1284069d50.2 for ; Mon, 20 Oct 2025 09:43:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760978619; x=1761583419; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=bTeDFdWl/+1pnY3k3LRdAT54t4neqYqOfTv7v/9fqCM=; b=OwzmmyrVfHhyMgMVpdCzuxBQ/xAEyy1SpLmTWfdpeEW52wtZkN4Ui10PSGGJQVx38k rY4CeZpZG9vNP6PETSV9U1OuzrYgs8I39zlaq6J5ZZrH2ut+xIWSDtN1k/auNCeCXaDt hGx4Ids57gTlTCS4XDpSTGM4/BEHE3v9obYlM21Jg5jdtgTsuUo1AoQ92fmNDm34RgUH WCnIenuACRlSdncaOrCVLuA8kPexz3aznu1zFynjetYcdp7qySKJsCc8vlw6NL+kDLFi /7Ec5BanZOBQ3vwMpDjUYtjlNhEZWusOHdATVN+4vKVxMJAMclhXp7crKzJYBnAY/4Ie GfEg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760978619; x=1761583419; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=bTeDFdWl/+1pnY3k3LRdAT54t4neqYqOfTv7v/9fqCM=; b=vZXBlUlMRK21w3aOJK76EzYrw6hTUfyA4B6yftbcDiiy50EHKNPKqaYIMJqRpUjJRF UHz2ytZDADwTfkhFqsT0nNNLIrn+fAA0vmRPabs1Z2KI5ZcyzEX274ZA5qSBokLAGryI BR344VTsbAK9VWI1NNV1Tixc8xGsuaL+mNyyKiyu67qHktFqaIj6faO5S1rkETLb+28V GnoOhREHeaKxYvw6YFvDA0Yf8QMTYa2PwxMIFsReeLT5AHEbS3mHWyJ/BMvRkU0y/pIH a+iCOb6/RmWVQ1mb/545IsN0+Q5yun4QVuO6ElNVq3w0VTIlx9ZrNgUK0UD36N2uegiP okZQ== X-Forwarded-Encrypted: i=1; AJvYcCWZofaReXkUuHE3b/xB3Jr4enu6cpn63euwL25v2ww9Bb/KepmK8LM6mE018ST+YyjHyc8sj4N5CqolPU3i@postgresql.org X-Gm-Message-State: AOJu0YxgrEfespdHMXSB637o4D4+8+h8UjikqoszXEVuJNP8O+RBi+yO 2NXJFud/MBgRmHyBEf41rnh1NTUS2aftDdKJUl/1+Rp0+hgE0BV+XCGsB615Nil2Q7hv7EoOOSS vMbv8KCfubgdsZC19QHYhzlcSL4wVLRI= X-Gm-Gg: ASbGncuI//OyBLm3uE22Dx7Ta3KUtWeu8Gj7V5bLVgy8CW7w7VAY5cAzC2sf4ioeXP5 sXRE8sGmXy7ueY8H8aTTkn0PVi3Yyru1vvK99Mr7bXLf/cSGVkjC9I02hK5owvaUui0Y9vlbyZW SdU5yViQx6xgngXQaOH/3K5a5P/gOVNlvcDZKFnK2aWrrnjH/9lzFd05SFFekCUhOan0VMJzDhq AVBMY5GyVgL0SuOTM1FPjPyxif0BSrw9NGkD81CT13BAmddLxhCGcTAz5qpAA== X-Google-Smtp-Source: AGHT+IHOnGiRXjEgbd76q9cczSgWi87e+qTNMaoJkkiqUB7KO+LyAFDKqr6LdpDsq7DsuwV4iPU/VnQvh7VnR4Y5+ds= X-Received: by 2002:a53:a0cc:0:b0:63c:f5a7:3fe with SMTP id 956f58d0204a3-63e1620cf7cmr7977112d50.66.1760978618473; Mon, 20 Oct 2025 09:43:38 -0700 (PDT) MIME-Version: 1.0 References: <6899c044-4a82-49be-8117-e6f669765f7e@app.fastmail.com> <165530.1752362320@sss.pgh.pa.us> <02a7cd37-e2fc-4212-8b19-f8c239c95fb8@app.fastmail.com> <96f00bf1-cc9d-4520-9d02-9e14e7767c88@app.fastmail.com> <30c2aa7d-dd6c-4b68-a2e4-f217a1a34acf@app.fastmail.com> <0b4d402a-9ac2-4aa8-acf8-8231dbe579ea@app.fastmail.com> <3095599.1758644879@sss.pgh.pa.us> <0dc6a2cc-5216-4dc1-9dd2-430cafc6095b@app.fastmail.com> <52CC167F-763B-4ECA-B0B4-DAB381816828@gmail.com> <9186C6D0-F7A9-482A-9183-89E530B57E36@gmail.com> <1073593.1759423179@sss.pgh.pa.us> <4bd5e6c4-6fa7-44bb-869d-59a32a331fa8@app.fastmail.com> <85828f29-e72e-4400-94f3-9a69bc8dc239@app.fastmail.com> <2495353.1759860890@sss.pgh.pa.us> <8aeae418-92a6-4bbd-9c06-9574c79e59f7@app.fastmail.com> <2531672.1759868124@sss.pgh.pa.us> <474efa78-337c-41cd-a73a-f845a0115109@app.fastmail.com> <2749343.1759949176@sss.pgh.pa.us> <8bfca2be-1ec0-4e15-aafb-0b7b661fe936@app.fastmail.com> <9eba307f-f2fb-48f0-9507-2e197f39ef9e@app.fastmail.com> <8c71183a-0d28-4bcf-a806-78446ff95404@app.fastmail.com> <1009807.1760476747@sss.pgh.pa.us> <1F7227F5-C33D-4E2C-8511-33F1468590D0@gmail.com> <0a5a20d3-4621-46b3-b2ab-903f63a20dea@app.fastmail.com> <6F913129-ABEF-4004-AAF3-F22FC34!29AE8@gmail.com> <1547585.1760645808@sss.pgh.pa.us> In-Reply-To: From: Arseniy Mukhin Date: Mon, 20 Oct 2025 19:43:27 +0300 X-Gm-Features: AS18NWDdAfLkS6ibL9NsTymR3KhuPda_6DkJ_mv5TWMXkIrXQaykondmq5wpU8k Message-ID: Subject: Re: Optimize LISTEN/NOTIFY To: Joel Jacobson Cc: Tom Lane , Chao Li , pgsql-hackers Content-Type: multipart/mixed; boundary="0000000000000317f3064199c969" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000000317f3064199c969 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Mon, Oct 20, 2025 at 1:07=E2=80=AFAM Joel Jacobson w= rote: > > > Minute of brainstorming > > > > I also thought about a workload that probably frequently can be met. > > Let's say we have sequence of notifications: > > > > F F F T F F F T F F F T > > > > Here F - notification from the channel we don't care about and T - the = opposite. > > It seems that after the first 'T' notification it will be more > > difficult for notifying backends to do 'direct advancement' as there > > will be some lag before the listener reads the notification and > > advances its position. Not sure if it's a problem, probably it depends > > on the intensity of notifications. > > Hmm, I realize both the advisoryPos and donePos ideas share a problem; > they both require listening backends to wakeup eventually anyway, > just to advance the 'pos'. > > The holy grail would be to avoid this context switching cost entirely, > and only need to wakeup listening backends when they are actually > interested in the queued notifications. I think the third idea, > alt3, is most promising in achieving this goal. > Yeah, it would be great. > > But maybe we can use a bit more > > sophisticated data structure here? Something like a list of skip > > ranges. Every entry in the list is the range (pos1, pos2) that the > > listener can skip during the reading. So instead of advancing > > advisoryPos every notifying backend should add skip range to the list. > > Notifying backends can merge neighbour ranges (pos1, pos2) & (pos2, > > pos3) -> (pos1, pos3). We also can limit the number of entries to 5 > > for example. Listeners on their side should clear the list before > > reading and skip all ranges from it. What do you think? Is it > > overkill? > > Hmm, maybe, but I'm a bit wary about too much complication. > Hopefully there is a simpler solution that avoids the need for this, > but sure, if we can't find one, then I'm positive to try this skip ranges= idea. > Yes, and it's probably worth doing a benchmarking to see if it's a problem at all before implementing anything. > >> > A different line of thought could be to get rid of > >> > asyncQueueReadAllNotifications's optimization of moving the > >> > queue pos only once, per > >> > > >> > * (We could alternatively retake NotifyQueueLock and move the= position > >> > * before handling each individual message, but that seems lik= e too much > >> > * lock traffic.) > >> > > >> > Since we only need shared lock to advance our own queue pos, > >> > maybe that wouldn't be too awful. Not sure. > >> > >> Above idea is implemented in 0002-optimize_listen_notify-v19-alt3.txt > >> > > > > Hmm, it seems we still have the race when in the beginning of > > asyncQueueReadAllNotifications we read pos into the local variable and > > release the lock. IIUC to avoid the race without introducing another > > field here, the listener needs to hold the lock until it updates its > > position so that the notifying backend cannot change it concurrently. > > *** 0002-optimize_listen_notify-v20-alt3.txt: > > * Fixed; the shared 'pos' is now only updated if the new position is ahea= d. > I managed to reproduce the race with v20-alt3. I tried to write a TAP test reproducing the issue, so it was easier to validate changes. Please find the attached TAP test. I added it to some random package for simplicity. Best regards, Arseniy Mukhin --0000000000000317f3064199c969 Content-Type: application/octet-stream; name="0001-TAP-test-with-listener-pos-race.patch.nocfbot" Content-Disposition: attachment; filename="0001-TAP-test-with-listener-pos-race.patch.nocfbot" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mgzd6ofw0 RnJvbSA4MDViNTNjY2NkNWE5MGU3ODc0NDc0OTU3NTNiNGRiOWVkMWVjNzY1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBcnNlbml5IE11a2hpbiA8YXJzZW5peS5tdWtoaW4uZGV2QGdt YWlsLmNvbT4KRGF0ZTogTW9uLCAyMCBPY3QgMjAyNSAxNToxNDozNiArMDMwMApTdWJqZWN0OiBb UEFUQ0hdIFRBUCB0ZXN0IHdpdGggbGlzdGVuZXIgcG9zIHJhY2UKCi0tLQogc3JjL2JhY2tlbmQv Y29tbWFuZHMvYXN5bmMuYyAgICAgICAgICAgICAgICAgIHwgIDUgKwogc3JjL3Rlc3QvYXV0aGVu dGljYXRpb24vbWVzb24uYnVpbGQgICAgICAgICAgIHwgIDEgKwogLi4uL2F1dGhlbnRpY2F0aW9u L3QvMDA4X2xpc3Rlbi1wb3MtcmFjZS5wbCAgIHwgOTEgKysrKysrKysrKysrKysrKysrKwogMyBm aWxlcyBjaGFuZ2VkLCA5NyBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rl c3QvYXV0aGVudGljYXRpb24vdC8wMDhfbGlzdGVuLXBvcy1yYWNlLnBsCgpkaWZmIC0tZ2l0IGEv c3JjL2JhY2tlbmQvY29tbWFuZHMvYXN5bmMuYyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2FzeW5j LmMKaW5kZXggNGU2NTU2ZmI4ZDEuLmU0ZTY1YjAyZTk4IDEwMDY0NAotLS0gYS9zcmMvYmFja2Vu ZC9jb21tYW5kcy9hc3luYy5jCisrKyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2FzeW5jLmMKQEAg LTE2Nyw2ICsxNjcsNyBAQAogI2luY2x1ZGUgInV0aWxzL3BzX3N0YXR1cy5oIgogI2luY2x1ZGUg InV0aWxzL3NuYXBtZ3IuaCIKICNpbmNsdWRlICJ1dGlscy90aW1lc3RhbXAuaCIKKyNpbmNsdWRl ICJ1dGlscy9pbmplY3Rpb25fcG9pbnQuaCIKIAogCiAvKgpAQCAtMTk1NCw2ICsxOTU1LDggQEAg U2lnbmFsQmFja2VuZHModm9pZCkKIAlpbnQJCQljb3VudDsKIAlMaXN0Q2VsbCAgICpsYzsKIAor CUlOSkVDVElPTl9QT0lOVCgibGlzdGVuLW5vdGlmeS1zaWduYWwtYmFja2VuZHMiLCBOVUxMKTsK KwogCS8qCiAJICogQXR0YWNoIHRvIHRoZSBjaGFubmVsIGhhc2ggaWYgbmVlZGVkLiAgV2UgbWln aHQgbm90IGhhdmUgb25lIGlmIHRoaXMKIAkgKiBiYWNrZW5kIGhhc24ndCBkb25lIExJU1RFTiwg YnV0IHdlIG5lZWQgaXQgdG8gZmluZCBsaXN0ZW5lcnMuCkBAIC0yMzIxLDYgKzIzMjQsOCBAQCBh c3luY1F1ZXVlUmVhZEFsbE5vdGlmaWNhdGlvbnModm9pZCkKIAloZWFkID0gUVVFVUVfSEVBRDsK IAlMV0xvY2tSZWxlYXNlKE5vdGlmeVF1ZXVlTG9jayk7CiAKKwlJTkpFQ1RJT05fUE9JTlQoImxp c3Rlbi1ub3RpZnktbG9jYWwtcG9zIiwgTlVMTCk7CisKIAlpZiAoUVVFVUVfUE9TX0VRVUFMKHBv cywgaGVhZCkpCiAJewogCQkvKiBOb3RoaW5nIHRvIGRvLCB3ZSBoYXZlIHJlYWQgYWxsIG5vdGlm aWNhdGlvbnMgYWxyZWFkeS4gKi8KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2F1dGhlbnRpY2F0aW9u L21lc29uLmJ1aWxkIGIvc3JjL3Rlc3QvYXV0aGVudGljYXRpb24vbWVzb24uYnVpbGQKaW5kZXgg ODAwYjNhNWZmNDAuLmMzM2YwMDY1YjFkIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9hdXRoZW50aWNh dGlvbi9tZXNvbi5idWlsZAorKysgYi9zcmMvdGVzdC9hdXRoZW50aWNhdGlvbi9tZXNvbi5idWls ZApAQCAtMTYsNiArMTYsNyBAQCB0ZXN0cyArPSB7CiAgICAgICAndC8wMDVfc3NwaS5wbCcsCiAg ICAgICAndC8wMDZfbG9naW5fdHJpZ2dlci5wbCcsCiAgICAgICAndC8wMDdfcHJlX2F1dGgucGwn LAorICAgICAgJ3QvMDA4X2xpc3Rlbi1wb3MtcmFjZS5wbCcsCiAgICAgXSwKICAgfSwKIH0KZGlm ZiAtLWdpdCBhL3NyYy90ZXN0L2F1dGhlbnRpY2F0aW9uL3QvMDA4X2xpc3Rlbi1wb3MtcmFjZS5w bCBiL3NyYy90ZXN0L2F1dGhlbnRpY2F0aW9uL3QvMDA4X2xpc3Rlbi1wb3MtcmFjZS5wbApuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uMDk5NDQ0MDdlNGYKLS0tIC9kZXYv bnVsbAorKysgYi9zcmMvdGVzdC9hdXRoZW50aWNhdGlvbi90LzAwOF9saXN0ZW4tcG9zLXJhY2Uu cGwKQEAgLTAsMCArMSw5MSBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMjEtMjAyNSwgUG9zdGdyZVNR TCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5ncyBG QVRBTCA9PiAnYWxsJzsKKwordXNlIFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXI7Cit1c2UgUG9z dGdyZVNRTDo6VGVzdDo6VXRpbHM7Cit1c2UgVGltZTo6SGlSZXMgcXcodXNsZWVwKTsKK3VzZSBU ZXN0OjpNb3JlOworCitpZiAoJEVOVntlbmFibGVfaW5qZWN0aW9uX3BvaW50c30gbmUgJ3llcycp IHsKKyAgICBwbGFuIHNraXBfYWxsID0+ICdJbmplY3Rpb24gcG9pbnRzIG5vdCBzdXBwb3J0ZWQg YnkgdGhpcyBidWlsZCc7Cit9CisKK215ICRub2RlID0gUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3Rl ci0+bmV3KCJ0ZXN0Iik7Ciskbm9kZS0+aW5pdDsKKyRub2RlLT5zdGFydDsKKworCitpZiAoISRu b2RlLT5jaGVja19leHRlbnNpb24oJ2luamVjdGlvbl9wb2ludHMnKSkgeworICAgIHBsYW4gc2tp cF9hbGwgPT4gJ0V4dGVuc2lvbiBpbmplY3Rpb25fcG9pbnRzIG5vdCBpbnN0YWxsZWQnOworfQor Ciskbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICdDUkVBVEUgRVhURU5TSU9OIGluamVjdGlv bl9wb2ludHMnKTsKKworbXkgJGxpc3RlbmVyID0gJG5vZGUtPmJhY2tncm91bmRfcHNxbCgncG9z dGdyZXMnKTsKK215ICRsaXN0ZW5lcl93aXRoX2ludmFsaWRfcG9zID0gJG5vZGUtPmJhY2tncm91 bmRfcHNxbCgncG9zdGdyZXMnKTsKK215ICRub3RpZnlpbmdfcHNxbCA9ICRub2RlLT5iYWNrZ3Jv dW5kX3BzcWwoJ3Bvc3RncmVzJyk7CisKKyMgc2V0dXAgaW5qZWN0aW9uIHBvaW50cworJG5vZGUt PnNhZmVfcHNxbCgncG9zdGdyZXMnLCAiU0VMRUNUIGluamVjdGlvbl9wb2ludHNfYXR0YWNoKCds aXN0ZW4tbm90aWZ5LXNpZ25hbC1iYWNrZW5kcycsICd3YWl0Jyk7Iik7CisKKyRsaXN0ZW5lcl93 aXRoX2ludmFsaWRfcG9zLT5xdWVyeV9zYWZlKAorICAgIHFxWworICAgICBTRUxFQ1QgaW5qZWN0 aW9uX3BvaW50c19zZXRfbG9jYWwoKTsKKyAgICAgU0VMRUNUIGluamVjdGlvbl9wb2ludHNfYXR0 YWNoKCdsaXN0ZW4tbm90aWZ5LWxvY2FsLXBvcycsICd3YWl0Jyk7CisgXSk7CisKKyMgbGlzdGVu ZXIgc3RhcnRzIGxpc3RlbmluZyB0byBjaGFubmVsIGNoLCBhbmQgc3RhcnRzIGEgdHJhbnNhY3Rp b24sCisjIHdoaWxlIGxpc3RlbmVyIGlzIHdpdGhpbiBhbiBhY3RpdmUgdHJhbnNhY3Rpb24sIGl0 cyBwb3Mgd2lsbCBiZSAwLAorIyBhbmQgdGhlcmVmb3JlIGFsbCBuZXcgbGlzdGVuZXJzIHdpbGwg aGF2ZSB0byBzdGFydCByZWFkaW5nIGZyb20gMCBwb3NpdGlvbiB0b28gYmVjYXVzZSBvZiBpdC4K KyRsaXN0ZW5lci0+cXVlcnlfc2FmZSgiTElTVEVOIGNoOyIpOworJGxpc3RlbmVyLT5xdWVyeV9z YWZlKCJCRUdJTjsiKTsKKworIyBjcmVhdGUgYSBsb3Qgb2Ygbm90aWZpY2F0aW9ucyBhbmQgc3Rh cnQgd2FpdGluZworIyBvbiBsaXN0ZW4tbm90aWZ5LXNpZ25hbC1iYWNrZW5kcyAoYmVmb3JlIGRp cmVjdCBhZHZhbmNlbWVudCkKKyRub3RpZnlpbmdfcHNxbC0+cXVlcnlfdW50aWwoCisgICAgcXIv c3RhcnQvLCBxKAorICAgXGVjaG8gc3RhcnQKKyAgIEJFR0lOOworICAgc2VsZWN0IHBnX25vdGlm eSgnY2gnLCByZXBlYXQoJ2EnLDMwMDApIHx8IHg6OnRleHQpIGZyb20gZ2VuZXJhdGVfc2VyaWVz KDEsMTAwKSBhcyB4OworICAgQ09NTUlUOworCispKTsKKyMgV2FpdCB1bnRpbCBub3RpZnlpbmdf cHNxbCBlbnRlcnMgdGhlIHdhaXQgaW5qZWN0aW9uIHBvaW50LgorJG5vZGUtPndhaXRfZm9yX2V2 ZW50KCdjbGllbnQgYmFja2VuZCcsCSdsaXN0ZW4tbm90aWZ5LXNpZ25hbC1iYWNrZW5kcycpOwor CisjIGxpc3RlbmVyX3dpdGhfaW52YWxpZF9wb3MgZXhlY3V0ZXMgTElTVEVOIGNvbW1hbmQgYW5k IHN0YXJ0cworIyB3YWl0aW5nIG9uIHRoZSBpbmplY3Rpb24gcG9pbnQgd2l0aCBwb3MgPSAwIGlu IGxvY2FsIHZhcmlhYmxlCiskbGlzdGVuZXJfd2l0aF9pbnZhbGlkX3Bvcy0+cXVlcnlfdW50aWwo CisgICAgcXIvc3RhcnQvLCBxKAorICAgXGVjaG8gc3RhcnQKKyAgIExJU1RFTiBjaDI7CispKTsK KyMgV2FpdCB1bnRpbCBsaXN0ZW5lcl93aXRoX2ludmFsaWRfcG9zIGVudGVycyB0aGUgd2FpdCBp bmplY3Rpb24gcG9pbnQuCiskbm9kZS0+d2FpdF9mb3JfZXZlbnQoJ2NsaWVudCBiYWNrZW5kJywJ J2xpc3Rlbi1ub3RpZnktbG9jYWwtcG9zJyk7CisKKyMgd2FrZSB1cCBub3RpZnlpbmcgYmFja2Vu ZC4gZGlyZWN0IGFkdmFuY2VtZW50IHNob3VsZCBiZSBhcHBsaWVkIG5vdyB0byBsaXN0ZW5lcl93 aXRoX2ludmFsaWRfcG9zCisjIGxpc3RlbmVyX3dpdGhfaW52YWxpZF9wb3MgaXMgc3RpbGwgd2Fp dGluZyBvbiBpbmplY3Rpb24gcG9pbnQgd2l0aCBsb2NhbCBwb3MgPSAwCiskbm9kZS0+c2FmZV9w c3FsKCdwb3N0Z3JlcycsICJTRUxFQ1QgaW5qZWN0aW9uX3BvaW50c193YWtldXAoJ2xpc3Rlbi1u b3RpZnktc2lnbmFsLWJhY2tlbmRzJyk7Iik7CisKKyNzbGVlcCBqdXN0IHRvIGJlIHN1cmUgdGhh dCBkaXJlY3QgYWR2YW5jZW1lbnQgd2FzIGFwcGxpZWQgdG8gbGlzdGVuZXJfd2l0aF9pbnZhbGlk X3Bvcworc2xlZXAgMTsKKworIyBsZXQgbGlzdGVuZXIgdG8gYWR2YW5jZSBpdHMgcG9zaXRpb24g dG8gdW5ibG9jayBxdWV1ZSB0cnVuY2F0aW5nCiskbGlzdGVuZXItPnF1ZXJ5X3NhZmUoIkNPTU1J VCIpOworCisjIHRydW5jYXRlIHRoZSBxdWV1ZQorJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMn LCAic2VsZWN0IHBnX25vdGlmaWNhdGlvbl9xdWV1ZV91c2FnZSgpOyIpOworCisKKyMgd2FrZSB1 cCBsaXN0ZW5lcl93aXRoX2ludmFsaWRfcG9zIHdpdGggbG9jYWwgY29weSBvZiBwb3MgPSAwLiBx dWV1ZSBoYXMgYmVlbiB0cnVuY2F0ZWQgYWxyZWFkeS4KKyMgdGVzdCBzaG91bGQgZmFpbCBhZnRl ciBpdC4gMDA4X2xpc3Rlbi1wb3MtcmFjZV90ZXN0LmxvZyBjb250YWlucyBlcnJvciBkZXRhaWxz Ciskbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsIlNFTEVDVCBpbmplY3Rpb25fcG9pbnRzX3dh a2V1cCgnbGlzdGVuLW5vdGlmeS1sb2NhbC1wb3MnKTsiKTsKKworCiskbGlzdGVuZXItPnF1aXQo KTsKKyRsaXN0ZW5lcl93aXRoX2ludmFsaWRfcG9zLT5xdWl0KCk7Ciskbm90aWZ5aW5nX3BzcWwt PnF1aXQoKTsKKworZG9uZV90ZXN0aW5nKCk7Ci0tIAoyLjQzLjAKCg== --0000000000000317f3064199c969--