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 1te6jm-00BvO0-M8 for pgsql-hackers@arkaria.postgresql.org; Sat, 01 Feb 2025 06:12:15 +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 1te6jj-004C89-JR for pgsql-hackers@arkaria.postgresql.org; Sat, 01 Feb 2025 06:12:11 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1te6jj-004C81-67 for pgsql-hackers@lists.postgresql.org; Sat, 01 Feb 2025 06:12:11 +0000 Received: from mail-yb1-xb2d.google.com ([2607:f8b0:4864:20::b2d]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1te6jg-002es2-1D for pgsql-hackers@lists.postgresql.org; Sat, 01 Feb 2025 06:12:10 +0000 Received: by mail-yb1-xb2d.google.com with SMTP id 3f1490d57ef6-e5addb1b359so1145071276.2 for ; Fri, 31 Jan 2025 22:12:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738390326; x=1738995126; darn=lists.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=SbzVlxO3X1zAaL17nWUAqFemLoEV/ylNVT6mxprw3HM=; b=LF0iQoV39uBF4pJU9ftNPH+ciddl3rZUxDCn126gqwE7h+lpZReLtXdkfwhQ2r33Co 69nZtodPvs/wvqFQxaQaG1msqkjaMRNOsE0ZbAN3Jz0h8lyGL4qrRwx7Os/JC17dJT1d YTKN87kg701NhX78nqapc/Cqa/rCEaKiNKKVDBqq1m89qNAVQvOeCgdIz9NkZxbyiNNX IRkzb6XwdAlzO/u+57+52qQX4IevT1mfMZ2YgaqoqrwmCiLnk/5TAl9Y0CMftrqSVgpr IxSsWtp8srTEXokS5KlbTtpPg6FabfHidFZnWv7moMr05QN0hyeTXebNtnuXXw+LIXGi WXCw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738390326; x=1738995126; 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=SbzVlxO3X1zAaL17nWUAqFemLoEV/ylNVT6mxprw3HM=; b=RatHibRnoPaqgUEsG+/rJ1O9MKJpgjjL37PhVe40rLfH9k/nvt5+rxyVxSaPF/6hCF sC4rOz2aoUZPls5LWr0w/wPcHbse+Ws8aLZRXfTva0iu+oSdKHRF0R5v292mowbO4jgB d+H+IINhzwfJlhsiEDlbSq4wXgO86FNPR9DmN1WMZSC9dp3aejjh1lIzp9rNMse4wiKs 7Nt5K9Duqo6z0kEbar3rYZ9QrPK5R6cbKtuOOX5bBI635nCLyuyVu3TRq+geFi4zE8th i+wsRj5bN0+jrJtRH50s+LO0X33OLQrR0qb281LnsU0mfoVXz/JlZXxIVwawYdvyeiPS +TIA== X-Forwarded-Encrypted: i=1; AJvYcCXvaPvfTre+pyaQ1ch/ka3P+gqLwrb2ACbnTLUp1jo5cTnwQ/XN+WDWu+IBY9UjSHvDfEQXfLQ5SHX9ZxR0@lists.postgresql.org X-Gm-Message-State: AOJu0YwCpBOcVocBG12l4ym2lcA1bODBPxOP6uKORN0Ox/0I7tEDpuKA x0HY3kLQTciUWpsYi747c1aRx8Q3P0GK+4oYzbZGZKYp4lEe1J0wOpB5GzSS/Jcucft5e56muRB IKxqillDgCACRVummACnrAFeuWNo= X-Gm-Gg: ASbGncv6ccBlO4J46FMQeVBltdGirJCSkiyvrS2kUQkpgwKCbUjVobrkcgcGvMgM2rK NPARQkQcX4ntzRW4ImDW/rHdpha7ArWPIbSu9mqMXEi47OGCLQahaWDBKcUHX7z7Q0Ygugopo+/ LtULpGbgfcanGCx76K2dAEu4wkuRzcKK0= X-Google-Smtp-Source: AGHT+IEpELZ88dstTwtnQnu1qWb+NbEGlq+Tt79V45wXqX4WPILsaUIqzTg+2wyuJqDI8v1zRWKxOC8vvZnYghAB8I0= X-Received: by 2002:a05:690c:9a8c:b0:6ef:7f89:d906 with SMTP id 00721157ae682-6f7a8424514mr110973057b3.33.1738390326192; Fri, 31 Jan 2025 22:12:06 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: vignesh C Date: Sat, 1 Feb 2025 11:41:53 +0530 X-Gm-Features: AWEUYZl32DLLC0YOuTpNBO8hGQBLI48Y57_DOX-1JX89WMHB_yxIoyjOejl4Bmg Message-ID: Subject: Re: Introduce XID age and inactive timeout based replication slot invalidation To: Nisha Moond Cc: Amit Kapila , Peter Smith , "Hayato Kuroda (Fujitsu)" , shveta malik , Bharath Rupireddy , Ajin Cherian , Bertrand Drouvot , Masahiko Sawada , Nathan Bossart , PostgreSQL Hackers Content-Type: multipart/mixed; boundary="000000000000dfe842062d0e8930" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000dfe842062d0e8930 Content-Type: text/plain; charset="UTF-8" On Fri, 31 Jan 2025 at 17:50, Nisha Moond wrote: > > Thanks for the review! I have incorporated the above comments. The > test in patch-002 has been optimized as suggested and now completes in > less than a second. > Please find the attached v66 patch set. The base patch(v65-001) is > committed now, so I have rebased the patches. Few comments: 1)We should set inactive_since only if the slot can be invalidated: + /* For testing timeout slot invalidation */ + if (IS_INJECTION_POINT_ATTACHED("slot-time-out-inval")) + s->inactive_since = 1; + 2) Instead of "alter system set" and reload, let's do this in $node->append_conf itself: +# Set timeout GUC so that the next checkpoint will invalidate inactive slots +$node->safe_psql( + 'postgres', qq[ + ALTER SYSTEM SET idle_replication_slot_timeout TO '1min'; +]); +$node->reload; 3) No need to trigger checkpoint twice, we can move it outside so that just a single checkpoint will invalidate both the slots: +sub trigger_slot_invalidation +{ + my ($node, $slot, $offset) = @_; + my $node_name = $node->name; + my $invalidated = 0; + + # Run a checkpoint + $node->safe_psql('postgres', "CHECKPOINT"); 4) I fel this trigger_slot_invalidation is not required after removing the checkpoint from the function, let's move the waiting for "invalidating obsolete replication slot" also to wait_for_slot_invalidation function: + # The slot's invalidation should be logged + $node->wait_for_log(qr/invalidating obsolete replication slot \"$slot\"/, + $offset); + + # Check that the invalidation reason is 'idle_timeout' + $node->poll_query_until( + 'postgres', qq[ + SELECT COUNT(slot_name) = 1 FROM pg_replication_slots + WHERE slot_name = '$slot' AND + invalidation_reason = 'idle_timeout'; + ]) 5) Can we move the subroutine to the beginning, I noticed in other places we have kept it before the tests like in 027_nosuperuser and 040_createsubscriber: +# Wait for slot to first become idle and then get invalidated +sub wait_for_slot_invalidation +{ + my ($node, $slot, $offset) = @_; + my $node_name = $node->name; + + trigger_slot_invalidation($node, $slot, $offset); + + # Check that an invalidated slot cannot be acquired + my ($result, $stdout, $stderr); + ($result, $stdout, $stderr) = $node->psql( + 'postgres', qq[ + SELECT pg_replication_slot_advance('$slot', '0/1'); + ]); 6) Since idle_replication_slot_timeout is related more closely with max_slot_wal_keep_size, let's keep it along with it. diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index 079efa1baa..0ed9eb057e 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -329,6 +329,7 @@ #wal_sender_timeout = 60s # in milliseconds; 0 disables #track_commit_timestamp = off # collect timestamp of transaction commit # (change requires restart) +#idle_replication_slot_timeout = 1d # in minutes; 0 disables If you accept the comments, you can merge the changes from the attached patch. Regards, Vignesh --000000000000dfe842062d0e8930 Content-Type: text/x-patch; charset="US-ASCII"; name="Vignesh_review_comment_fix.patch" Content-Disposition: attachment; filename="Vignesh_review_comment_fix.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m6lspere0 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL3Nsb3QuYyBiL3NyYy9iYWNrZW5k L3JlcGxpY2F0aW9uL3Nsb3QuYwppbmRleCBjMDliOTBlZWFjLi5lODFiY2UzNDhjIDEwMDY0NAot LS0gYS9zcmMvYmFja2VuZC9yZXBsaWNhdGlvbi9zbG90LmMKKysrIGIvc3JjL2JhY2tlbmQvcmVw bGljYXRpb24vc2xvdC5jCkBAIC0xNzI0LDIwICsxNzI0LDIyIEBAIEludmFsaWRhdGVQb3NzaWJs eU9ic29sZXRlU2xvdChSZXBsaWNhdGlvblNsb3RJbnZhbGlkYXRpb25DYXVzZSBjYXVzZSwKIAkJ CQljYXNlIFJTX0lOVkFMX0lETEVfVElNRU9VVDoKIAkJCQkJQXNzZXJ0KG5vdyA+IDApOwogCi0J CQkJCS8qIEZvciB0ZXN0aW5nIHRpbWVvdXQgc2xvdCBpbnZhbGlkYXRpb24gKi8KLQkJCQkJaWYg KElTX0lOSkVDVElPTl9QT0lOVF9BVFRBQ0hFRCgic2xvdC10aW1lLW91dC1pbnZhbCIpKQotCQkJ CQkJcy0+aW5hY3RpdmVfc2luY2UgPSAxOwotCi0JCQkJCS8qCi0JCQkJCSAqIENoZWNrIGlmIHRo ZSBzbG90IG5lZWRzIHRvIGJlIGludmFsaWRhdGVkIGR1ZSB0bwotCQkJCQkgKiBpZGxlX3JlcGxp Y2F0aW9uX3Nsb3RfdGltZW91dCBHVUMuCi0JCQkJCSAqLwotCQkJCQlpZiAoQ2FuSW52YWxpZGF0 ZUlkbGVTbG90KHMpICYmCi0JCQkJCQlUaW1lc3RhbXBEaWZmZXJlbmNlRXhjZWVkc1NlY29uZHMo cy0+aW5hY3RpdmVfc2luY2UsIG5vdywKLQkJCQkJCQkJCQkJCQkJICBpZGxlX3JlcGxpY2F0aW9u X3Nsb3RfdGltZW91dF9taW5zICogU0VDU19QRVJfTUlOVVRFKSkKKwkJCQkJaWYgKENhbkludmFs aWRhdGVJZGxlU2xvdChzKSkKIAkJCQkJewotCQkJCQkJaW52YWxpZGF0aW9uX2NhdXNlID0gY2F1 c2U7Ci0JCQkJCQlpbmFjdGl2ZV9zaW5jZSA9IHMtPmluYWN0aXZlX3NpbmNlOworCQkJCQkJLyog Rm9yIHRlc3RpbmcgdGltZW91dCBzbG90IGludmFsaWRhdGlvbiAqLworCQkJCQkJaWYgKElTX0lO SkVDVElPTl9QT0lOVF9BVFRBQ0hFRCgic2xvdC10aW1lLW91dC1pbnZhbCIpKQorCQkJCQkJCXMt PmluYWN0aXZlX3NpbmNlID0gMTsKKworCQkJCQkJLyoKKwkJCQkJCSAqIENoZWNrIGlmIHRoZSBz bG90IG5lZWRzIHRvIGJlIGludmFsaWRhdGVkIGR1ZSB0bworCQkJCQkJICogaWRsZV9yZXBsaWNh dGlvbl9zbG90X3RpbWVvdXQgR1VDLgorCQkJCQkJICovCisJCQkJCQlpZiAoVGltZXN0YW1wRGlm ZmVyZW5jZUV4Y2VlZHNTZWNvbmRzKHMtPmluYWN0aXZlX3NpbmNlLCBub3csCisJCQkJCQkJCQkJ CQkJCQkgIGlkbGVfcmVwbGljYXRpb25fc2xvdF90aW1lb3V0X21pbnMgKiBTRUNTX1BFUl9NSU5V VEUpKQorCQkJCQkJeworCQkJCQkJCWludmFsaWRhdGlvbl9jYXVzZSA9IGNhdXNlOworCQkJCQkJ CWluYWN0aXZlX3NpbmNlID0gcy0+aW5hY3RpdmVfc2luY2U7CisJCQkJCQl9CiAJCQkJCX0KIAkJ CQkJYnJlYWs7CiAJCQkJY2FzZSBSU19JTlZBTF9OT05FOgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tl bmQvdXRpbHMvbWlzYy9wb3N0Z3Jlc3FsLmNvbmYuc2FtcGxlIGIvc3JjL2JhY2tlbmQvdXRpbHMv bWlzYy9wb3N0Z3Jlc3FsLmNvbmYuc2FtcGxlCmluZGV4IDBlZDllYjA1N2UuLjcwYmUzYTJjZTUg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvcG9zdGdyZXNxbC5jb25mLnNhbXBs ZQorKysgYi9zcmMvYmFja2VuZC91dGlscy9taXNjL3Bvc3RncmVzcWwuY29uZi5zYW1wbGUKQEAg LTMyNiwxMCArMzI2LDEwIEBACiAJCQkJIyAoY2hhbmdlIHJlcXVpcmVzIHJlc3RhcnQpCiAjd2Fs X2tlZXBfc2l6ZSA9IDAJCSMgaW4gbWVnYWJ5dGVzOyAwIGRpc2FibGVzCiAjbWF4X3Nsb3Rfd2Fs X2tlZXBfc2l6ZSA9IC0xCSMgaW4gbWVnYWJ5dGVzOyAtMSBkaXNhYmxlcworI2lkbGVfcmVwbGlj YXRpb25fc2xvdF90aW1lb3V0ID0gMWQJIyBpbiBtaW51dGVzOyAwIGRpc2FibGVzCiAjd2FsX3Nl bmRlcl90aW1lb3V0ID0gNjBzCSMgaW4gbWlsbGlzZWNvbmRzOyAwIGRpc2FibGVzCiAjdHJhY2tf Y29tbWl0X3RpbWVzdGFtcCA9IG9mZgkjIGNvbGxlY3QgdGltZXN0YW1wIG9mIHRyYW5zYWN0aW9u IGNvbW1pdAogCQkJCSMgKGNoYW5nZSByZXF1aXJlcyByZXN0YXJ0KQotI2lkbGVfcmVwbGljYXRp b25fc2xvdF90aW1lb3V0ID0gMWQJIyBpbiBtaW51dGVzOyAwIGRpc2FibGVzCiAKICMgLSBQcmlt YXJ5IFNlcnZlciAtCiAKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlY292ZXJ5L3QvMDQ0X2ludmFs aWRhdGVfaW5hY3RpdmVfc2xvdHMucGwgYi9zcmMvdGVzdC9yZWNvdmVyeS90LzA0NF9pbnZhbGlk YXRlX2luYWN0aXZlX3Nsb3RzLnBsCmluZGV4IGZkOTA3ZTdmODIuLjdmMTg4ODFjYmEgMTAwNjQ0 Ci0tLSBhL3NyYy90ZXN0L3JlY292ZXJ5L3QvMDQ0X2ludmFsaWRhdGVfaW5hY3RpdmVfc2xvdHMu cGwKKysrIGIvc3JjL3Rlc3QvcmVjb3ZlcnkvdC8wNDRfaW52YWxpZGF0ZV9pbmFjdGl2ZV9zbG90 cy5wbApAQCAtMTMsNiArMTMsMzkgQEAgaWYgKCRFTlZ7ZW5hYmxlX2luamVjdGlvbl9wb2ludHN9 IG5lICd5ZXMnKQogCXBsYW4gc2tpcF9hbGwgPT4gJ0luamVjdGlvbiBwb2ludHMgbm90IHN1cHBv cnRlZCBieSB0aGlzIGJ1aWxkJzsKIH0KIAorIyBXYWl0IGZvciBzbG90IHRvIGZpcnN0IGJlY29t ZSBpZGxlIGFuZCB0aGVuIGdldCBpbnZhbGlkYXRlZAorc3ViIHdhaXRfZm9yX3Nsb3RfaW52YWxp ZGF0aW9uCit7CisJbXkgKCRub2RlLCAkc2xvdCwgJG9mZnNldCkgPSBAXzsKKwlteSAkbm9kZV9u YW1lID0gJG5vZGUtPm5hbWU7CisKKwkjIFRoZSBzbG90J3MgaW52YWxpZGF0aW9uIHNob3VsZCBi ZSBsb2dnZWQKKwkkbm9kZS0+d2FpdF9mb3JfbG9nKHFyL2ludmFsaWRhdGluZyBvYnNvbGV0ZSBy ZXBsaWNhdGlvbiBzbG90IFwiJHNsb3RcIi8sCisJCSRvZmZzZXQpOworCisJIyBDaGVjayB0aGF0 IHRoZSBpbnZhbGlkYXRpb24gcmVhc29uIGlzICdpZGxlX3RpbWVvdXQnCisJJG5vZGUtPnBvbGxf cXVlcnlfdW50aWwoCisJCSdwb3N0Z3JlcycsIHFxWworCQlTRUxFQ1QgQ09VTlQoc2xvdF9uYW1l KSA9IDEgRlJPTSBwZ19yZXBsaWNhdGlvbl9zbG90cworCQkJV0hFUkUgc2xvdF9uYW1lID0gJyRz bG90JyBBTkQKKwkJCWludmFsaWRhdGlvbl9yZWFzb24gPSAnaWRsZV90aW1lb3V0JzsKKwldKQor CSAgb3IgZGllCisJICAiVGltZWQgb3V0IHdoaWxlIHdhaXRpbmcgZm9yIGludmFsaWRhdGlvbiBy ZWFzb24gb2Ygc2xvdCAkc2xvdCB0byBiZSBzZXQgb24gbm9kZSAkbm9kZV9uYW1lIjsKKworCSMg Q2hlY2sgdGhhdCBhbiBpbnZhbGlkYXRlZCBzbG90IGNhbm5vdCBiZSBhY3F1aXJlZAorCW15ICgk cmVzdWx0LCAkc3Rkb3V0LCAkc3RkZXJyKTsKKwkoJHJlc3VsdCwgJHN0ZG91dCwgJHN0ZGVycikg PSAkbm9kZS0+cHNxbCgKKwkJJ3Bvc3RncmVzJywgcXFbCisJCQlTRUxFQ1QgcGdfcmVwbGljYXRp b25fc2xvdF9hZHZhbmNlKCckc2xvdCcsICcwLzEnKTsKKwldKTsKKwlvayggJHN0ZGVyciA9fiAv Y2FuIG5vIGxvbmdlciBhY2Nlc3MgcmVwbGljYXRpb24gc2xvdCAiJHNsb3QiLywKKwkJImRldGVj dGVkIGVycm9yIHVwb24gdHJ5aW5nIHRvIGFjcXVpcmUgaW52YWxpZGF0ZWQgc2xvdCAkc2xvdCBv biBub2RlICRub2RlX25hbWUiCisJICApCisJICBvciBkaWUKKwkgICJjb3VsZCBub3QgZGV0ZWN0 IGVycm9yIHVwb24gdHJ5aW5nIHRvIGFjcXVpcmUgaW52YWxpZGF0ZWQgc2xvdCAkc2xvdCBvbiBu b2RlICRub2RlX25hbWUiOworfQorCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIyBUZXN0Y2FzZSBzdGFy dAogIwpAQCAtMjcsNiArNjAsNyBAQCAkbm9kZS0+aW5pdChhbGxvd3Nfc3RyZWFtaW5nID0+ICds b2dpY2FsJyk7CiAkbm9kZS0+YXBwZW5kX2NvbmYoCiAJJ3Bvc3RncmVzcWwuY29uZicsIHFxewog Y2hlY2twb2ludF90aW1lb3V0ID0gMWgKK2lkbGVfcmVwbGljYXRpb25fc2xvdF90aW1lb3V0ID0g MW1pbgogfSk7CiAkbm9kZS0+c3RhcnQ7CiAKQEAgLTQxLDEzICs3NSw2IEBAICRub2RlLT5wc3Fs KCdwb3N0Z3JlcycsCiAKIG15ICRsb2dzdGFydCA9IC1zICRub2RlLT5sb2dmaWxlOwogCi0jIFNl dCB0aW1lb3V0IEdVQyBzbyB0aGF0IHRoZSBuZXh0IGNoZWNrcG9pbnQgd2lsbCBpbnZhbGlkYXRl IGluYWN0aXZlIHNsb3RzCi0kbm9kZS0+c2FmZV9wc3FsKAotCSdwb3N0Z3JlcycsIHFxWwotICAg IEFMVEVSIFNZU1RFTSBTRVQgaWRsZV9yZXBsaWNhdGlvbl9zbG90X3RpbWVvdXQgVE8gJzFtaW4n OwotXSk7Ci0kbm9kZS0+cmVsb2FkOwotCiAjIFJlZ2lzdGVyIGFuIGluamVjdGlvbiBwb2ludCBv biB0aGUgcHJpbWFyeSB0byBmb3JjaWJseSBjYXVzZSBhIHNsb3QgdGltZW91dAogJG5vZGUtPnNh ZmVfcHNxbCgncG9zdGdyZXMnLCAnQ1JFQVRFIEVYVEVOU0lPTiBpbmplY3Rpb25fcG9pbnRzOycp OwogCkBAIC02Miw2ICs4OSw5IEBAIGlmICghJG5vZGUtPmNoZWNrX2V4dGVuc2lvbignaW5qZWN0 aW9uX3BvaW50cycpKQogJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLAogCSJTRUxFQ1QgaW5q ZWN0aW9uX3BvaW50c19hdHRhY2goJ3Nsb3QtdGltZS1vdXQtaW52YWwnLCAnZXJyb3InKTsiKTsK IAorIyBSdW4gYSBjaGVja3BvaW50IHdoaWNoIHdpbGwgaW52YWxpZGF0ZSB0aGUgc2xvdHMKKyRu b2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgIkNIRUNLUE9JTlQiKTsKKwkKICMgV2FpdCBmb3Ig c2xvdHMgdG8gYmVjb21lIGluYWN0aXZlLiBOb3RlIHRoYXQgbm9ib2R5IGhhcyBhY3F1aXJlZCB0 aGUgc2xvdAogIyB5ZXQsIHNvIGl0IG11c3QgZ2V0IGludmFsaWRhdGVkIGR1ZSB0byBpZGxlIHRp bWVvdXQuCiB3YWl0X2Zvcl9zbG90X2ludmFsaWRhdGlvbigkbm9kZSwgJ3BoeXNpY2FsX3Nsb3Qn LCAkbG9nc3RhcnQpOwpAQCAtNzAsNTAgKzEwMCw0IEBAIHdhaXRfZm9yX3Nsb3RfaW52YWxpZGF0 aW9uKCRub2RlLCAnbG9naWNhbF9zbG90JywgJGxvZ3N0YXJ0KTsKICMgVGVzdGNhc2UgZW5kCiAj ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09CiAKLSMgV2FpdCBmb3Igc2xvdCB0byBmaXJzdCBiZWNvbWUg aWRsZSBhbmQgdGhlbiBnZXQgaW52YWxpZGF0ZWQKLXN1YiB3YWl0X2Zvcl9zbG90X2ludmFsaWRh dGlvbgotewotCW15ICgkbm9kZSwgJHNsb3QsICRvZmZzZXQpID0gQF87Ci0JbXkgJG5vZGVfbmFt ZSA9ICRub2RlLT5uYW1lOwotCi0JdHJpZ2dlcl9zbG90X2ludmFsaWRhdGlvbigkbm9kZSwgJHNs b3QsICRvZmZzZXQpOwotCi0JIyBDaGVjayB0aGF0IGFuIGludmFsaWRhdGVkIHNsb3QgY2Fubm90 IGJlIGFjcXVpcmVkCi0JbXkgKCRyZXN1bHQsICRzdGRvdXQsICRzdGRlcnIpOwotCSgkcmVzdWx0 LCAkc3Rkb3V0LCAkc3RkZXJyKSA9ICRub2RlLT5wc3FsKAotCQkncG9zdGdyZXMnLCBxcVsKLQkJ CVNFTEVDVCBwZ19yZXBsaWNhdGlvbl9zbG90X2FkdmFuY2UoJyRzbG90JywgJzAvMScpOwotCV0p OwotCW9rKCAkc3RkZXJyID1+IC9jYW4gbm8gbG9uZ2VyIGFjY2VzcyByZXBsaWNhdGlvbiBzbG90 ICIkc2xvdCIvLAotCQkiZGV0ZWN0ZWQgZXJyb3IgdXBvbiB0cnlpbmcgdG8gYWNxdWlyZSBpbnZh bGlkYXRlZCBzbG90ICRzbG90IG9uIG5vZGUgJG5vZGVfbmFtZSIKLQkgICkKLQkgIG9yIGRpZQot CSAgImNvdWxkIG5vdCBkZXRlY3QgZXJyb3IgdXBvbiB0cnlpbmcgdG8gYWNxdWlyZSBpbnZhbGlk YXRlZCBzbG90ICRzbG90IG9uIG5vZGUgJG5vZGVfbmFtZSI7Ci19Ci0KLSMgVHJpZ2dlciBzbG90 IGludmFsaWRhdGlvbiBhbmQgY29uZmlybSBpdCBpbiB0aGUgc2VydmVyIGxvZwotc3ViIHRyaWdn ZXJfc2xvdF9pbnZhbGlkYXRpb24KLXsKLQlteSAoJG5vZGUsICRzbG90LCAkb2Zmc2V0KSA9IEBf OwotCW15ICRub2RlX25hbWUgPSAkbm9kZS0+bmFtZTsKLQlteSAkaW52YWxpZGF0ZWQgPSAwOwot Ci0JIyBSdW4gYSBjaGVja3BvaW50Ci0JJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAiQ0hF Q0tQT0lOVCIpOwotCi0JIyBUaGUgc2xvdCdzIGludmFsaWRhdGlvbiBzaG91bGQgYmUgbG9nZ2Vk Ci0JJG5vZGUtPndhaXRfZm9yX2xvZyhxci9pbnZhbGlkYXRpbmcgb2Jzb2xldGUgcmVwbGljYXRp b24gc2xvdCBcIiRzbG90XCIvLAotCQkkb2Zmc2V0KTsKLQotCSMgQ2hlY2sgdGhhdCB0aGUgaW52 YWxpZGF0aW9uIHJlYXNvbiBpcyAnaWRsZV90aW1lb3V0JwotCSRub2RlLT5wb2xsX3F1ZXJ5X3Vu dGlsKAotCQkncG9zdGdyZXMnLCBxcVsKLQkJU0VMRUNUIENPVU5UKHNsb3RfbmFtZSkgPSAxIEZS T00gcGdfcmVwbGljYXRpb25fc2xvdHMKLQkJCVdIRVJFIHNsb3RfbmFtZSA9ICckc2xvdCcgQU5E Ci0JCQlpbnZhbGlkYXRpb25fcmVhc29uID0gJ2lkbGVfdGltZW91dCc7Ci0JXSkKLQkgIG9yIGRp ZQotCSAgIlRpbWVkIG91dCB3aGlsZSB3YWl0aW5nIGZvciBpbnZhbGlkYXRpb24gcmVhc29uIG9m IHNsb3QgJHNsb3QgdG8gYmUgc2V0IG9uIG5vZGUgJG5vZGVfbmFtZSI7Ci19Ci0KIGRvbmVfdGVz dGluZygpOwo= --000000000000dfe842062d0e8930--