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.96) (envelope-from ) id 1vKDla-003A9s-08 for pgsql-hackers@arkaria.postgresql.org; Sat, 15 Nov 2025 10:44:25 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vKDlW-0098eD-2M for pgsql-hackers@arkaria.postgresql.org; Sat, 15 Nov 2025 10:44:22 +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.96) (envelope-from ) id 1vKDlW-0098e4-0Z for pgsql-hackers@lists.postgresql.org; Sat, 15 Nov 2025 10:44:22 +0000 Received: from mail-wm1-x332.google.com ([2a00:1450:4864:20::332]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vKDlT-007FSP-2J for pgsql-hackers@postgresql.org; Sat, 15 Nov 2025 10:44:21 +0000 Received: by mail-wm1-x332.google.com with SMTP id 5b1f17b1804b1-47755de027eso20634185e9.0 for ; Sat, 15 Nov 2025 02:44:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1763203457; x=1763808257; darn=postgresql.org; h=in-reply-to:content-language:references:cc:to:from:subject :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=o53A0DHWABs0eB431gNAkEZ4X5D4VFZbSEdFZrGvqNk=; b=Fq+nEil+DT0XL16plqnC1lGA9Hf+Z5LZhMgX2suYv6t3u3af7m+EEaQ46owhKzxxo7 z8B8EFXGGv88EhY9lO1/nQLC+n5OLH98hTZp7YGXzurBYAGNopb0bIKGqo0UqZVlFujU g9LRKxfnvPHxNNbZBSAPmvPt9uRATd8/UrRAh3cQpd7OhfHlV6KzZCgP1Z2iS/TiWOC+ ay6t2gbFbz63N4bjR/OhdtDV7rKe87lrlwYQzRzE9/XrA1bGyTfNhwVegOr1myCnzJAi Hg5axXc2mjZEnkpuc3DJZKePrhH5LGcmJKMuDaTEip+TTZpRXfr3BVtJpN8SNFliUsTB NG+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763203457; x=1763808257; h=in-reply-to:content-language:references:cc:to:from:subject :user-agent:mime-version:date:message-id:x-gm-gg:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=o53A0DHWABs0eB431gNAkEZ4X5D4VFZbSEdFZrGvqNk=; b=OSN2r/II8ct9tk0DlUT1iX3sdbYw2n6rhr5AsSlSK8GihhlyKhsQnZbcgV5ub0clPu zygEwuFv71gX+Bl33ccVI3ilfuglWleQitgAP3eRgg8p06UZCIh9RNNM3lJRrEt+H8SS fphWLCETNAaWOqqaK7Bt2nDJROWIjn1XDJqp+Vie9ek+TCPpior1ac6PhFeYkgJkPQlA SLBwsjEQMPBcCvyo2x45yHtAg59loH6WEXVRakfg0dR5RZlSy7vGdE80iYuKdrZRtbqq QwlahBOkCRR+n/5jTBrN6SaP/WYX4I5oK74cPTTIhFozqqww09c7INBxAGawBlTWz01R 0/9g== X-Forwarded-Encrypted: i=1; AJvYcCULPDVqHRmGCPURjxo5Bc14exL5Pf4ubSdna7xp8sfg5PEsFXmxz7SqdaFYrvqgljB7PjHpbo+4litQQKdy@postgresql.org X-Gm-Message-State: AOJu0YwCDsODf0hj5lxsh3ctzUIybCn97TbjmMpuACw7YHgF1zf5vri/ XVgBoYKLYdE1iZepC5M7nS7b9kmDgmzI09zhtBPs7sZs8SfvPtTNWAYk X-Gm-Gg: ASbGnctS+DlIXPhAL74iPIhSzsw38XplaVgSlHjdVEBdiwD0nsDbPjoixJNeqtjEjQg Kok6PfaiSRA48P/s+59z62kcPME6sABKjpch/GdO1UXxuzKmabI/6HbHBPudcc/zoIIcfL84aBh De2aDhiCXaLCTNlzdDM11HiVOCbfx8lgS0hkQVDfEignl4qwb9u4B+880P4jzXqI2BFvUbExosc 1OI1UX3PicB5kS3cSyBG3zdmUW7dZhwT668+hU3erX9ZP4nEmOSXXu2iDsyRbTpkhqMlrzvlz1O oy6/weA+CDZEOuOT0LYA/UEV2i/DTzEoNjOmaZiRGGmZHJR3guevb4ifxRC9sAvtQm+ZEWzAE8P C+gU0SQ35+15Y5548fvLNf4RstCB6zdZ5XTdAtul5shJUxtMF+3m5WruUOrHE5HzbGv4fWp+CEW XAbOUtRDUWv26yBv4Pm7OhiQ== X-Google-Smtp-Source: AGHT+IEWQri3IOkCUpunOotzZ+fn9uVhacEbIqlISTjOvFwpwZ3AsUbEUKTrYGQfvokOSPbEMyZ6dQ== X-Received: by 2002:a05:600c:8b21:b0:471:13dd:bae7 with SMTP id 5b1f17b1804b1-4778fe883e3mr67253545e9.30.1763203456822; Sat, 15 Nov 2025 02:44:16 -0800 (PST) Received: from [192.168.15.139] ([80.251.191.198]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4778bcfa2e9sm65902145e9.12.2025.11.15.02.44.15 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 15 Nov 2025 02:44:16 -0800 (PST) Content-Type: multipart/mixed; boundary="------------BWJUMphC1n776Fnq8GBWrQ00" Message-ID: Date: Sat, 15 Nov 2025 11:44:15 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Comments on Custom RMGRs From: Andrei Lepikhov To: Michael Paquier , Danil Anisimow Cc: Jeff Davis , Robert Haas , Andres Freund , PostgreSQL Hackers , Dean Rasheed , Yurii Rashkovskii References: <0892cd00635c8bcd458de6d43d31cf61953da1b2.camel@j-davis.com> <727b0f3b48aec2a4f968bf11c6fa8ca6382b6cca.camel@j-davis.com> <22e756affaad88b77a52d67cb532ed2a544f2e36.camel@j-davis.com> <1e2256b744836aeb485c61954e9d8272f80141a0.camel@j-davis.com> Content-Language: en-US In-Reply-To: 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. --------------BWJUMphC1n776Fnq8GBWrQ00 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 14/10/2025 11:11, Andrei Lepikhov wrote: > For me, the ideal place for such a hook is CheckPointGuts, right between > the CheckPointBuffers call and fsyncs. I think that to demonstrate how > this hook can work, the pg_stat_statements storage may need to be > redesigned slightly. There are two patches: 0001, which is the checkpoint hook itself, and 0002, which includes an example and a trivial test. During development, I attempted to apply it in my different modules and realised that the hook is preferred over an RMGR callback - I don't actually want to be forced to register RMGR in each project and have it loadable on an instance startup. In lightweight modules, I want to keep my knowledge base relatively close to the current state of the instance. Nevertheless, the plan freezing extension (for example) needs to ensure that the user's query plan is 'frozen' after the function call. Therefore, we need to store the decision made in the WAL, which requires dumping the state into a file before performing the WAL cut. Additionally, I'd like to experiment with synchronising an extension state between master and replica through WAL records, as most optimisation recommendations are relevant to both instances. Patch 0001 contains a hook that is called once after all checkpoint preparations have finished. I recall that people mentioned it might be helpful for AMs as well - feel free to propose changes to this patch. Patch 2 adds an example to the test_dsm_registry module, as it is precisely the way I write the code: named DSM segment -> shared HTAB -> file dump. So, it looks natural and opens a room to extend this example by employing RMGR and xact callbacks to keep the extension state as close to the committed changes as possible. The test looks pretty trivial so far - feel free to propose ideas on how to extend it. -- regards, Andrei Lepikhov, pgEdge --------------BWJUMphC1n776Fnq8GBWrQ00 Content-Type: text/plain; charset=UTF-8; name="0001-Add-a-hook-for-Checkpoint-processing.patch" Content-Disposition: attachment; filename="0001-Add-a-hook-for-Checkpoint-processing.patch" Content-Transfer-Encoding: base64 RnJvbSBhMGU4ZDc1MjIzZmE5NWRiZWMxZTQyMmVhY2FlZjMzNmU0NWMyMDA4IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiQW5kcmVpIFYuIExlcGlraG92IiA8bGVwaWhvdkBn bWFpbC5jb20+CkRhdGU6IFRodSwgMTMgTm92IDIwMjUgMTU6MDA6NDMgKzAxMDAKU3ViamVj dDogW1BBVENIIDEvMl0gQWRkIGEgaG9vayBmb3IgQ2hlY2twb2ludCBwcm9jZXNzaW5nLgoK VGhlcmUgYXJlIG1hbnkgc2l0dWF0aW9ucyBpbiB3aGljaCBhIFBvc3RncmVzIHBsdWdpbiBt YXkgbmVlZCB0byBtYWludGFpbiBpdHMKaW50ZXJuYWwgc3RhdGUgYWNyb3NzIHJlc3RhcnRz IG9yIGNyYXNoZXMuIFNvbWV0aW1lcyBpdCB3YW50cyB0byBzeW5jaHJvbmlzZQppdHMgc3Rh dGUgb24gbG9naWNhbCByZXBsaWNhcyBvciBiZSBzYXZlZCBpbiBhIGJhY2t1cCBlbXBsb3lp bmcgY3VzdG9tIFJNR1IgYW5kCldBTCByZWNvcmRzLgoKRm9yIHN0YXRpc3RpY2FsIGV4dGVu c2lvbnMsIHN1Y2ggYXMgcGdfc3RhdF9zdGF0ZW1lbnRzLCBpdCBpcyBva2F5IHRvIHNhdmUK dGhlaXIgc3RhdGUgb24gcG9zdG1hc3RlciBzaHV0ZG93bi4gSG93ZXZlciwgYnVzaW5lc3Mg ZXh0ZW5zaW9ucyBtYXkgd2FudAp0byBtYWludGFpbiBtb3JlIGFjdHVhbCBzdGF0ZSwgcGVy aW9kaWNhbGx5IGR1bXBpbmcgaXQgdG8gYSBkaXNrIGZpbGUgb3IgdXNpbmcKV0FMIGFuZCB4 YWN0IGNhbGxiYWNrcyB0byBiZSBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byB0aGUgY3VycmVu dApkYXRhYmFzZSBzdGF0ZS4KCkNoZWNrcG9pbnQgaXMgYSBrZXkgbW9tZW50IHdoZXJlIHRo ZSBEQk1TIHBlcmZvcm1zIGRpc2sgc3luY2hyb25pc2F0aW9uIGFuZApjdXRzIHRoZSBXQUwu IEl0IGlzIGEgZ29vZCB0aW1lIHRvIGRvIHRoZSBzYW1lIHRoaW5nIGZvciBhIHBsdWdpbiwg dG9vLgpNb3Jlb3ZlciwgdGhlIHBsdWdpbiBpcyBzdXJlIHRoYXQgbm90aGluZyBpbXBvcnRh bnQgd2lsbCBiZSBsb3N0IHdpdGgKdGhlIFdBTCBjdXQuCgpEaXNjdXNzaW9uOiBodHRwczov L3d3dy5wb3N0Z3Jlc3FsLm9yZy9tZXNzYWdlLWlkL0NBTmJoVi1FNHBUV2VGLURzZGFHc09y akpORldQYVIlMkJEc3Rqcm5rcXZmOUpGRmdPS0tRJTQwbWFpbC5nbWFpbC5jb20KLS0tCiBz cmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9nLmMgfCAxNSArKysrKysrKysrKysrKysK IHNyYy9pbmNsdWRlL2FjY2Vzcy94bG9nLmggICAgICAgICB8ICA0ICsrKysKIHNyYy90b29s cy9wZ2luZGVudC90eXBlZGVmcy5saXN0ICB8ICAxICsKIDMgZmlsZXMgY2hhbmdlZCwgMjAg aW5zZXJ0aW9ucygrKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2Ft L3hsb2cuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2cuYwppbmRleCAyMmQw YTJlOGMzYS4uYzdjMGIyMjY3MjQgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy90 cmFuc2FtL3hsb2cuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9nLmMK QEAgLTE1Nyw2ICsxNTcsMTMgQEAgaW50CQkJd2FsX3NlZ21lbnRfc2l6ZSA9IERFRkFVTFRf WExPR19TRUdfU0laRTsKICAqLwogaW50CQkJQ2hlY2tQb2ludFNlZ21lbnRzOwogCisvKgor ICogSG9vayBmb3IgcGx1Z2lucyB0byB0YWtlIGNvbnRyb2wgZHVyaW5nIGNoZWNrcG9pbnQg cHJvY2Vzc2luZy4gQWxsCisgKiBwcmVwYXJhdGlvbiBwcm9jZWR1cmVzIGhhdmUgYWxyZWFk eSBiZWVuIGRvbmUsIGFuZCBvbmx5IHRoZSBzeW5jIG5lZWRzCisgKiB0byBiZSBkb25lLgor ICovCitDaGVja3BvaW50X2hvb2tfdHlwZSBDaGVja3BvaW50X2hvb2sgPSBOVUxMOworCiAv KiBFc3RpbWF0ZWQgZGlzdGFuY2UgYmV0d2VlbiBjaGVja3BvaW50cywgaW4gYnl0ZXMgKi8K IHN0YXRpYyBkb3VibGUgQ2hlY2tQb2ludERpc3RhbmNlRXN0aW1hdGUgPSAwOwogc3RhdGlj IGRvdWJsZSBQcmV2Q2hlY2tQb2ludERpc3RhbmNlID0gMDsKQEAgLTc1OTQsNiArNzYwMSwx NCBAQCBDaGVja1BvaW50R3V0cyhYTG9nUmVjUHRyIGNoZWNrUG9pbnRSZWRvLCBpbnQgZmxh Z3MpCiAJQ2hlY2tQb2ludFByZWRpY2F0ZSgpOwogCUNoZWNrUG9pbnRCdWZmZXJzKGZsYWdz KTsKIAorCS8qCisJICogQWxsb3cgYSBwbHVnaW4gdGhhdCBkZXBlbmRzIG9uIGEgY3VzdG9t IFJNR1IgdG8gcmV0YWluIGl0cyBzdGF0ZSB0aHJvdWdoCisJICogcmVib290cyBvciBjcmFz aGVzIGJ5IGZvbGxvd2luZyBzcGVjaWZpYyBzdGVwcywgZW5zdXJpbmcgdGhhdCBlc3NlbnRp YWwKKwkgKiBXQUwgcmVjb3JkcyBhcmUgbm90IHRydW5jYXRlZC4KKwkgKi8KKwlpZiAoQ2hl Y2twb2ludF9ob29rKQorCQlDaGVja3BvaW50X2hvb2soY2hlY2tQb2ludFJlZG8sIGZsYWdz KTsKKwogCS8qIFBlcmZvcm0gYWxsIHF1ZXVlZCB1cCBmc3luY3MgKi8KIAlUUkFDRV9QT1NU R1JFU1FMX0JVRkZFUl9DSEVDS1BPSU5UX1NZTkNfU1RBUlQoKTsKIAlDaGVja3BvaW50U3Rh dHMuY2twdF9zeW5jX3QgPSBHZXRDdXJyZW50VGltZXN0YW1wKCk7CmRpZmYgLS1naXQgYS9z cmMvaW5jbHVkZS9hY2Nlc3MveGxvZy5oIGIvc3JjL2luY2x1ZGUvYWNjZXNzL3hsb2cuaApp bmRleCA2MDUyODBlZDhmYi4uNWMwNzE5NzQ1NTcgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRl L2FjY2Vzcy94bG9nLmgKKysrIGIvc3JjL2luY2x1ZGUvYWNjZXNzL3hsb2cuaApAQCAtMTk4 LDYgKzE5OCwxMCBAQCB0eXBlZGVmIGVudW0gV0FMQXZhaWxhYmlsaXR5CiBzdHJ1Y3QgWExv Z1JlY0RhdGE7CiBzdHJ1Y3QgWExvZ1JlYWRlclN0YXRlOwogCisvKiBIb29rIGZvciBwbHVn aW5zIHRvIGdldCBjb250cm9sIGF0IHRoZSBlbmQgb2YgYSBDaGVja1BvaW50ICovCit0eXBl ZGVmIHZvaWQgKCpDaGVja3BvaW50X2hvb2tfdHlwZSkoWExvZ1JlY1B0ciBjaGVja1BvaW50 UmVkbywgaW50IGZsYWdzKTsKK2V4dGVybiBQR0RMTElNUE9SVCBDaGVja3BvaW50X2hvb2tf dHlwZSBDaGVja3BvaW50X2hvb2s7CisKIGV4dGVybiBYTG9nUmVjUHRyIFhMb2dJbnNlcnRS ZWNvcmQoc3RydWN0IFhMb2dSZWNEYXRhICpyZGF0YSwKIAkJCQkJCQkJICAgWExvZ1JlY1B0 ciBmcHdfbHNuLAogCQkJCQkJCQkgICB1aW50OCBmbGFncywKZGlmZiAtLWdpdCBhL3NyYy90 b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0IGIvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVk ZWZzLmxpc3QKaW5kZXggMjNiY2U3MmFlNjQuLjZjYTA1NDk5MDgxIDEwMDY0NAotLS0gYS9z cmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdAorKysgYi9zcmMvdG9vbHMvcGdpbmRl bnQvdHlwZWRlZnMubGlzdApAQCAtNDEzLDYgKzQxMyw3IEBAIENhdGFsb2dJbmRleFN0YXRl CiBDaGFuZ2VWYXJOb2Rlc19jYWxsYmFjawogQ2hhbmdlVmFyTm9kZXNfY29udGV4dAogQ2hl Y2tQb2ludAorQ2hlY2twb2ludF9ob29rX3R5cGUKIENoZWNrUG9pbnRTdG10CiBDaGVja3Bv aW50U3RhdHNEYXRhCiBDaGVja3BvaW50ZXJSZXF1ZXN0Ci0tIAoyLjUxLjIKCg== --------------BWJUMphC1n776Fnq8GBWrQ00 Content-Type: text/plain; charset=UTF-8; name="0002-Testing-module.patch" Content-Disposition: attachment; filename="0002-Testing-module.patch" Content-Transfer-Encoding: base64 RnJvbSBmOTJhYmJjYzM2NjcxMDM2Mjg2MDhkMjQ4ODcwODY3MjAwMDg3ZTE2IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiQW5kcmVpIFYuIExlcGlraG92IiA8bGVwaWhvdkBn bWFpbC5jb20+CkRhdGU6IEZyaSwgMTQgTm92IDIwMjUgMTY6MzU6MjEgKzAxMDAKU3ViamVj dDogW1BBVENIIDIvMl0gVGVzdGluZyBtb2R1bGUKCi0tLQogc3JjL3Rlc3QvbW9kdWxlcy90 ZXN0X2RzbV9yZWdpc3RyeS9NYWtlZmlsZSAgIHwgICAxICsKIC4uLi90ZXN0X2RzbV9yZWdp c3RyeS90LzAwMV9maWxlX3N0b3JhZ2UucGwgICB8ICAzMSArKysrCiAuLi4vdGVzdF9kc21f cmVnaXN0cnkvdGVzdF9kc21fcmVnaXN0cnkuYyAgICAgfCAxNjMgKysrKysrKysrKysrKysr KysrCiAzIGZpbGVzIGNoYW5nZWQsIDE5NSBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAx MDA2NDQgc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2RzbV9yZWdpc3RyeS90LzAwMV9maWxlX3N0 b3JhZ2UucGwKCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfZHNtX3JlZ2lz dHJ5L01ha2VmaWxlIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2RzbV9yZWdpc3RyeS9NYWtl ZmlsZQppbmRleCBiMTNlOTlhMzU0Zi4uOWFhZThiOThhYmEgMTAwNjQ0Ci0tLSBhL3NyYy90 ZXN0L21vZHVsZXMvdGVzdF9kc21fcmVnaXN0cnkvTWFrZWZpbGUKKysrIGIvc3JjL3Rlc3Qv bW9kdWxlcy90ZXN0X2RzbV9yZWdpc3RyeS9NYWtlZmlsZQpAQCAtMTAsNiArMTAsNyBAQCBF WFRFTlNJT04gPSB0ZXN0X2RzbV9yZWdpc3RyeQogREFUQSA9IHRlc3RfZHNtX3JlZ2lzdHJ5 LS0xLjAuc3FsCiAKIFJFR1JFU1MgPSB0ZXN0X2RzbV9yZWdpc3RyeQorVEFQX1RFU1RTID0g MQogCiBpZmRlZiBVU0VfUEdYUwogUEdfQ09ORklHID0gcGdfY29uZmlnCmRpZmYgLS1naXQg YS9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfZHNtX3JlZ2lzdHJ5L3QvMDAxX2ZpbGVfc3RvcmFn ZS5wbCBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9kc21fcmVnaXN0cnkvdC8wMDFfZmlsZV9z dG9yYWdlLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4wZTgy ZDBhZGNmNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9kc21f cmVnaXN0cnkvdC8wMDFfZmlsZV9zdG9yYWdlLnBsCkBAIC0wLDAgKzEsMzEgQEAKKyMgQ29w eXJpZ2h0IChjKSAyMDIzLTIwMjUsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdy b3VwCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzIEZBVEFMID0+ICdhbGwnOwordXNlIENv bmZpZzsKK3VzZSBQb3N0Z3JlU1FMOjpUZXN0OjpVdGlsczsKK3VzZSBQb3N0Z3JlU1FMOjpU ZXN0OjpDbHVzdGVyOwordXNlIFRlc3Q6Ok1vcmU7CisKK215ICRub2RlID0gUG9zdGdyZVNR TDo6VGVzdDo6Q2x1c3Rlci0+bmV3KCdub2RlJyk7CisKKyRub2RlLT5pbml0KCk7Ciskbm9k ZS0+YXBwZW5kX2NvbmYoJ3Bvc3RncmVzcWwuY29uZicsCisJCQkJCQkJInNoYXJlZF9wcmVs b2FkX2xpYnJhcmllcyA9ICd0ZXN0X2RzbV9yZWdpc3RyeSciKTsKKyRub2RlLT5zdGFydCgp OworCiskbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJDUkVBVEUgRVhURU5TSU9OIHRl c3RfZHNtX3JlZ2lzdHJ5Iik7CisKK215ICRyZXN1bHQ7CisKKyRub2RlLT5zYWZlX3BzcWwo J3Bvc3RncmVzJywgIlNFTEVDVCBzZXRfdmFsX2luX2hhc2goJ3Rlc3QtMScsICcxNDE0Jyki KTsKKyRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgJ0NIRUNLUE9JTlQnKTsKKyRub2Rl LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgIlNFTEVDVCBzZXRfdmFsX2luX2hhc2goJ3Rlc3Qt MicsICcxNDE1JykiKTsKKyRub2RlLT5zdG9wKCdpbW1lZGlhdGUnKTsKKyRub2RlLT5zdGFy dCgpOworCiskcmVzdWx0ID0gJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAiU0VMRUNU IGdldF92YWxfaW5faGFzaCgndGVzdC0xJykiKTsKK2lzKCRyZXN1bHQsICcxNDE0JywgIlZh bHVlIGluc2VydGVkIGJlZm9yZSB0aGUgY2hlY2twb2ludCB3YXMgcmVzdG9yZWQiKTsKKyRy ZXN1bHQgPSAkbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJTRUxFQ1QgZ2V0X3ZhbF9p bl9oYXNoKCd0ZXN0LTInKSIpOworaXMoJHJlc3VsdCwgJycsICJWYWx1ZSBpbnNlcnRlZCBh ZnRlciB0aGUgY2hlY2twb2ludCB3YXMgbG9zdCIpOworCitkb25lX3Rlc3RpbmcoKTsKZGlm ZiAtLWdpdCBhL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9kc21fcmVnaXN0cnkvdGVzdF9kc21f cmVnaXN0cnkuYyBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9kc21fcmVnaXN0cnkvdGVzdF9k c21fcmVnaXN0cnkuYwppbmRleCA0Y2MyY2NkYWMzZi4uMmQ3ZmQzNWE3NGQgMTAwNjQ0Ci0t LSBhL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9kc21fcmVnaXN0cnkvdGVzdF9kc21fcmVnaXN0 cnkuYworKysgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfZHNtX3JlZ2lzdHJ5L3Rlc3RfZHNt X3JlZ2lzdHJ5LmMKQEAgLTEyLDEzICsxMiwyMiBAQAogICovCiAjaW5jbHVkZSAicG9zdGdy ZXMuaCIKIAorI2luY2x1ZGUgImFjY2Vzcy94bG9nLmgiCiAjaW5jbHVkZSAiZm1nci5oIgor I2luY2x1ZGUgInBnc3RhdC5oIgogI2luY2x1ZGUgInN0b3JhZ2UvZHNtX3JlZ2lzdHJ5Lmgi CisjaW5jbHVkZSAic3RvcmFnZS9mZC5oIgogI2luY2x1ZGUgInN0b3JhZ2UvbHdsb2NrLmgi CiAjaW5jbHVkZSAidXRpbHMvYnVpbHRpbnMuaCIKKyNpbmNsdWRlICJ1dGlscy9oc2VhcmNo LmgiCiAKIFBHX01PRFVMRV9NQUdJQzsKIAorLyogTG9jYXRpb24gb2YgcGVybWFuZW50IHN0 b3JhZ2UgZmlsZSAodmFsaWQgb24gY2hlY2twb2ludCkgKi8KKyNkZWZpbmUgVERSX0RVTVBf RklMRQlQR1NUQVRfU1RBVF9QRVJNQU5FTlRfRElSRUNUT1JZICIvcGdfc3RhdF9zdGF0ZW1l bnRzLnN0YXQiCisvKiBNYWdpYyBudW1iZXIgaWRlbnRpZnlpbmcgdGhlIHN0YXRzIGZpbGUg Zm9ybWF0ICovCitzdGF0aWMgY29uc3QgdWludDMyIFREUl9GSUxFX0hFQURFUiA9IDB4MjAy NTExMTQ7CisKIHR5cGVkZWYgc3RydWN0IFRlc3REU01SZWdpc3RyeVN0cnVjdAogewogCWlu dAkJCXZhbDsKQEAgLTQzLDYgKzUyLDExIEBAIHN0YXRpYyBjb25zdCBkc2hhc2hfcGFyYW1l dGVycyBkc2hfcGFyYW1zID0gewogCWRzaGFzaF9zdHJjcHkKIH07CiAKK3N0YXRpYyBDaGVj a3BvaW50X2hvb2tfdHlwZQlwcmV2X0NoZWNrcG9pbnRfaG9vayA9IE5VTEw7CisKK3N0YXRp YyB2b2lkIGxvYWRfaHRhYih2b2lkKTsKK3N0YXRpYyB2b2lkIHBnc3NfQ2hlY2twb2ludChY TG9nUmVjUHRyIGNoZWNrUG9pbnRSZWRvLCBpbnQgZmxhZ3MpOworCiBzdGF0aWMgdm9pZAog aW5pdF90ZHJfZHNtKHZvaWQgKnB0cikKIHsKQEAgLTY2LDcgKzgwLDE0IEBAIHRkcl9hdHRh Y2hfc2htZW0odm9pZCkKIAkJdGRyX2RzYSA9IEdldE5hbWVkRFNBKCJ0ZXN0X2RzbV9yZWdp c3RyeV9kc2EiLCAmZm91bmQpOwogCiAJaWYgKHRkcl9oYXNoID09IE5VTEwpCisJeworCQlM V0xvY2tBY3F1aXJlKCZ0ZHJfZHNtLT5sY2ssIExXX0VYQ0xVU0lWRSk7CiAJCXRkcl9oYXNo ID0gR2V0TmFtZWREU0hhc2goInRlc3RfZHNtX3JlZ2lzdHJ5X2hhc2giLCAmZHNoX3BhcmFt cywgJmZvdW5kKTsKKwkJaWYgKCFmb3VuZCkKKwkJCWxvYWRfaHRhYigpOworCisJCUxXTG9j a1JlbGVhc2UoJnRkcl9kc20tPmxjayk7CisJfQogfQogCiBQR19GVU5DVElPTl9JTkZPX1Yx KHNldF92YWxfaW5fc2htZW0pOwpAQCAtMTQ0LDMgKzE2NSwxNDUgQEAgZ2V0X3ZhbF9pbl9o YXNoKFBHX0ZVTkNUSU9OX0FSR1MpCiAKIAlQR19SRVRVUk5fVEVYVF9QKHZhbCk7CiB9CisK Ky8qCisgKiBMb2FkIGFueSBwcmUtZXhpc3RpbmcgZW50cmllcyBmcm9tIGZpbGUuCisgKi8K K3N0YXRpYyB2b2lkCitsb2FkX2h0YWIodm9pZCkKK3sKKwlib29sCWZvdW5kOworCUZJTEUg ICAqZmlsZSA9IE5VTEw7CisJdWludDMyCWhlYWRlcjsKKwljaGFyICAgKnZhbCA9IHBhbGxv YygxKTsKKworCUFzc2VydCh0ZHJfZHNhICE9IE5VTEwgJiYgdGRyX2hhc2ggIT0gTlVMTCk7 CisKKwkvKgorCSAqIEF0dGVtcHQgdG8gbG9hZCBvbGQgZW50cmllcyBmcm9tIHRoZSBkdW1w IGZpbGUuCisJICovCisJZmlsZSA9IEFsbG9jYXRlRmlsZShURFJfRFVNUF9GSUxFLCBQR19C SU5BUllfUik7CisJaWYgKGZpbGUgPT0gTlVMTCkKKwl7CisJCWlmIChlcnJubyAhPSBFTk9F TlQpCisJCQlnb3RvIHJlYWRfZXJyb3I7CisJCS8qIE5vIGV4aXN0aW5nIHBlcnNpc3RlZCBm aWxlLCBzbyB3ZSdyZSBkb25lICovCisJCXJldHVybjsKKwl9CisKKwlpZiAoZnJlYWQoJmhl YWRlciwgc2l6ZW9mKHVpbnQzMiksIDEsIGZpbGUpICE9IDEgfHwKKwkJaGVhZGVyICE9IFRE Ul9GSUxFX0hFQURFUikKKwkJZ290byByZWFkX2Vycm9yOworCisJd2hpbGUgKCFmZW9mKGZp bGUpKQorCXsKKwkJVGVzdERTTVJlZ2lzdHJ5SGFzaEVudHJ5ICplbnRyeTsKKwkJY2hhcglr ZXlbNjRdOworCQlpbnQJCWtleWxlbiA9IG9mZnNldG9mKFRlc3REU01SZWdpc3RyeUhhc2hF bnRyeSwgdmFsKTsKKwkJaW50MzIJdmxlbjsKKworCQlpZiAoZnJlYWQoa2V5LCBrZXlsZW4s IDEsIGZpbGUpICE9IDEgfHwKKwkJCWZyZWFkKCZ2bGVuLCBzaXplb2YoaW50MzIpLCAxLCBm aWxlKSAhPSAxKQorCQkJZ290byByZWFkX2Vycm9yOworCisJCXZhbCA9IHJlcGFsbG9jKHZh bCwgdmxlbik7CisJCWlmIChmcmVhZCh2YWwsIHZsZW4sIDEsIGZpbGUpICE9IDEpCisJCQln b3RvIHJlYWRfZXJyb3I7CisKKwkJQXNzZXJ0KHZhbFt2bGVuIC0gMV0gPT0gJ1wwJyk7CisK KwkJZW50cnkgPSAoVGVzdERTTVJlZ2lzdHJ5SGFzaEVudHJ5ICopCisJCQkJCQkJCWRzaGFz aF9maW5kX29yX2luc2VydCh0ZHJfaGFzaCwga2V5LCAmZm91bmQpOworCQlBc3NlcnQoIWZv dW5kKTsKKworCQllbnRyeS0+dmFsID0gZHNhX2FsbG9jYXRlKHRkcl9kc2EsIHN0cmxlbih2 YWwpICsgMSk7CisJCXN0cmNweShkc2FfZ2V0X2FkZHJlc3ModGRyX2RzYSwgZW50cnktPnZh bCksIHZhbCk7CisKKwkJZHNoYXNoX3JlbGVhc2VfbG9jayh0ZHJfaGFzaCwgZW50cnkpOwor CX0KKworCUZyZWVGaWxlKGZpbGUpOworCXJldHVybjsKKworcmVhZF9lcnJvcjoKKwllcmVw b3J0KExPRywKKwkJCShlcnJjb2RlX2Zvcl9maWxlX2FjY2VzcygpLAorCQkJIGVycm1zZygi Y291bGQgbm90IHJlYWQgZnJvbSBmaWxlIFwiJXNcIjogJW0iLCBURFJfRFVNUF9GSUxFKSkp OworCWlmIChmaWxlKQorCQlGcmVlRmlsZShmaWxlKTsKKwkvKiBJZiBwb3NzaWJsZSwgdGhy b3cgYXdheSB0aGUgYm9ndXMgZmlsZTsgaWdub3JlIGFueSBlcnJvciAqLworCXVubGluayhU RFJfRFVNUF9GSUxFKTsKK30KKworLyoKKyAqIER1bXAgaGFzaCB0YWJsZSBpbnRvIGZpbGUu CisgKgorICovCitzdGF0aWMgdm9pZAorcGdzc19DaGVja3BvaW50KFhMb2dSZWNQdHIgY2hl Y2tQb2ludFJlZG8sIGludCBmbGFncykKK3sKKwlGSUxFCQkJCQkgICAqZmlsZTsKKwlkc2hh c2hfc2VxX3N0YXR1cwkJCWhzdGF0OworCVRlc3REU01SZWdpc3RyeUhhc2hFbnRyeSAgICpl bnRyeTsKKworCWlmIChmbGFncyAmIENIRUNLUE9JTlRfRU5EX09GX1JFQ09WRVJZKQorCQly ZXR1cm47CisKKwl0ZHJfYXR0YWNoX3NobWVtKCk7CisKKwlmaWxlID0gQWxsb2NhdGVGaWxl KFREUl9EVU1QX0ZJTEUgIi50bXAiLCBQR19CSU5BUllfVyk7CisJaWYgKGZpbGUgPT0gTlVM TCkKKwkJZ290byBlcnJvcjsKKwlpZiAoZndyaXRlKCZURFJfRklMRV9IRUFERVIsIHNpemVv Zih1aW50MzIpLCAxLCBmaWxlKSAhPSAxKQorCQlnb3RvIGVycm9yOworCisJZHNoYXNoX3Nl cV9pbml0KCZoc3RhdCwgdGRyX2hhc2gsIGZhbHNlKTsKKwl3aGlsZSAoKGVudHJ5ID0gZHNo YXNoX3NlcV9uZXh0KCZoc3RhdCkpICE9IE5VTEwpCisJeworCQlpbnQJCWtleWxlbiA9IG9m ZnNldG9mKFRlc3REU01SZWdpc3RyeUhhc2hFbnRyeSwgdmFsKTsKKwkJY2hhciAgICp2YWw7 CisJCWludDMyCXZsZW47CisKKwkJdmFsID0gKGNoYXIgKikgZHNhX2dldF9hZGRyZXNzKHRk cl9kc2EsIGVudHJ5LT52YWwpOworCQl2bGVuID0gc3RybGVuKHZhbCkgKyAxOworCQlpZiAo ZndyaXRlKGVudHJ5LT5rZXksIGtleWxlbiwgMSwgZmlsZSkgIT0gMSB8fAorCQkJZndyaXRl KCZ2bGVuLCBzaXplb2YoaW50MzIpLCAxLCBmaWxlKSAhPSAxIHx8CisJCQlmd3JpdGUodmFs LCB2bGVuLCAxLCBmaWxlKSAhPSAxKQorCQl7CisJCQlkc2hhc2hfc2VxX3Rlcm0oJmhzdGF0 KTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisJZHNoYXNoX3NlcV90ZXJtKCZoc3RhdCk7 CisKKwlpZiAoRnJlZUZpbGUoZmlsZSkpCisJeworCQlmaWxlID0gTlVMTDsKKwkJZ290byBl cnJvcjsKKwl9CisKKwkvKgorCSAqIFJlbmFtZSBmaWxlIGludG8gcGxhY2UsIHNvIHdlIGF0 b21pY2FsbHkgcmVwbGFjZSBhbnkgb2xkIG9uZS4KKwkgKi8KKwkodm9pZCkgZHVyYWJsZV9y ZW5hbWUoVERSX0RVTVBfRklMRSAiLnRtcCIsIFREUl9EVU1QX0ZJTEUsIExPRyk7CisJcmV0 dXJuOworCitlcnJvcjoKKwllcmVwb3J0KExPRywKKwkJCShlcnJjb2RlX2Zvcl9maWxlX2Fj Y2VzcygpLAorCQkJIGVycm1zZygiY291bGQgbm90IHdyaXRlIGZpbGUgXCIlc1wiOiAlbSIs CisJCQkJCVREUl9EVU1QX0ZJTEUgIi50bXAiKSkpOworCWlmIChmaWxlKQorCQlGcmVlRmls ZShmaWxlKTsKKwl1bmxpbmsoVERSX0RVTVBfRklMRSAiLnRtcCIpOworfQorCisvKgorICog RW50cnkgcG9pbnQgZm9yIHRoaXMgbW9kdWxlLgorICovCit2b2lkCitfUEdfaW5pdCh2b2lk KQoreworCXByZXZfQ2hlY2twb2ludF9ob29rID0gQ2hlY2twb2ludF9ob29rOworCUNoZWNr cG9pbnRfaG9vayA9IHBnc3NfQ2hlY2twb2ludDsKK30KLS0gCjIuNTEuMgoK --------------BWJUMphC1n776Fnq8GBWrQ00--