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 1snpmZ-006MiO-AB for pgsql-hackers@arkaria.postgresql.org; Tue, 10 Sep 2024 01:35:04 +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 1snpmY-004F7T-EK for pgsql-hackers@arkaria.postgresql.org; Tue, 10 Sep 2024 01:35:02 +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 1snpmX-004F7L-SS for pgsql-hackers@lists.postgresql.org; Tue, 10 Sep 2024 01:35:02 +0000 Received: from mail-lj1-x22c.google.com ([2a00:1450:4864:20::22c]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1snpmQ-000OJs-Mf for pgsql-hackers@lists.postgresql.org; Tue, 10 Sep 2024 01:35:00 +0000 Received: by mail-lj1-x22c.google.com with SMTP id 38308e7fff4ca-2f7502f09fdso33212721fa.1 for ; Mon, 09 Sep 2024 18:34:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1725932093; x=1726536893; 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=GCpFc+S2yrL/Wc9IqNXo3iOvTQ2qB/4rcWmW2g7AWaU=; b=lF6pKF/ZpBwjq4ayhQ9rDfU9H7NvWOqKu25EVnD26lQ+OYE9MvTdoP9mYv6/KzXtl6 1Z1g5Rh7fiI9mJP6dUEfgRywcvrv5RIY5WU4P4eCYfQRawfyr5nw5bvnAvs3fGIG3vlL maNa3vjfDIwQOek0fwqUhAVhL4VcCBaXvFva8lAbo7DN2tjmahR3eM0gttN0y97nwyMb W8uWyLumJOjj3d4SkC99BMv7DrJfXmmxWUktRa5HauZJRDX8W5/THLQ8+Urdh1NhGsAi ZHLiZclNbw90M3hZchODazzHQDl+Dj28fkrL40EkL/8LQ/6JAOV8k/z/ARJNtLx1YDX/ HHtA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725932093; x=1726536893; 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=GCpFc+S2yrL/Wc9IqNXo3iOvTQ2qB/4rcWmW2g7AWaU=; b=dXVosgcAlINKrMr/G1Zj9y9nDjKdyMxM7JvaYfgkPMSR+GP2rJChNp3LbE5ntydxBv Wp9tfX8NUYVqi2AYR+ipdykvVpue0qa0O8rbO7uqqnjmBIGXRaIOH8obxH8sMiET3/6b n07Bx30YU70ph4zAcSmkEzKRgwfDZ+Hm3qSxVsr8biSTDVHm2uM+bweLn4R8ln4z32l0 klmX1pKdo2/eaNobHgmkB7iRQaCdj7oF3q3SUQ+qehCiPNVUkzRHk5D4ZGHqJrKVVNWj VKvMjnK7KCHgNGYZtGznFVHhgEN1bmAgcpizy79ByCqhxSR/XRSbM466kfSmP0wm4G8f oltQ== X-Forwarded-Encrypted: i=1; AJvYcCU5m5+wQtdJDgjHIkurnGUQsqjcScZvPPSN8gCOhonfHikpzX51gq1QSS6r1tBQiTH9WPSVgd/CyRcAvuB9@lists.postgresql.org X-Gm-Message-State: AOJu0YwWMXz3BWXSi2+2xovHhaH67E252G+uBIheueVXI0J465k9dOkR s3zNYg7RilIERBiDVKjAuiqETNfdjAqjifGsTqjxzcN1OHOhA9okNSG2G4akyfdv2IhvAp84ki1 7aiG3fgqhdfwHOX8vXSUpmJUibnzqnZ2P7BA= X-Google-Smtp-Source: AGHT+IG7V7dwQLb+vJNp03QyLNDYCHh5woVOtggzKBM+rmr1As1WbxcHqtWWa+RP2CIaSQ70WoPoFQb1LzrVMbA19cU= X-Received: by 2002:a05:651c:2221:b0:2f3:e2f0:b09a with SMTP id 38308e7fff4ca-2f77265ee66mr5279931fa.4.1725932092032; Mon, 09 Sep 2024 18:34:52 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Peter Smith Date: Tue, 10 Sep 2024 11:34:24 +1000 Message-ID: Subject: Re: Introduce XID age and inactive timeout based replication slot invalidation To: Bharath Rupireddy Cc: Amit Kapila , Ajin Cherian , Bertrand Drouvot , shveta malik , Masahiko Sawada , Nathan Bossart , PostgreSQL Hackers Content-Type: multipart/mixed; boundary="00000000000040db280621b9e105" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000040db280621b9e105 Content-Type: text/plain; charset="UTF-8" Hi, here is the remainder of my v45-0001 review. These comments are for the test code only. ====== Testcase #1 1. +# Testcase start +# +# Invalidate streaming standby slot and logical failover slot on primary due to +# inactive timeout. Also, check logical failover slot synced to standby from +# primary doesn't invalidate on its own, but gets the invalidated state from the +# primary. nit - s/primary/the primary/ (in a couple of places) nit - s/standby/the standby/ nit - other trivial tweaks. ~~~ 2. +# Create sync slot on primary +$primary->psql('postgres', + q{SELECT pg_create_logical_replication_slot('sync_slot1', 'test_decoding', false, false, true);} +); nit - s/primary/the primary/ ~~~ 3. +$primary->safe_psql( + 'postgres', qq[ + SELECT pg_create_physical_replication_slot(slot_name := 'sb_slot1', immediately_reserve := true); +]); Should this have a comment? ~~~ 4. +# Wait until standby has replayed enough data +$primary->wait_for_catchup($standby1); nit - s/standby/the standby/ ~~~ 5. +# Sync primary slot to standby +$standby1->safe_psql('postgres', "SELECT pg_sync_replication_slots();"); nit - /Sync primary slot to standby/Sync the primary slots to the standby/ ~~~ 6. +# Confirm that logical failover slot is created on standby nit - s/Confirm that logical failover slot is created on standby/Confirm that the logical failover slot is created on the standby/ ~~~ 7. +is( $standby1->safe_psql( + 'postgres', + q{SELECT count(*) = 1 FROM pg_replication_slots + WHERE slot_name = 'sync_slot1' AND synced AND NOT temporary;} + ), + "t", + 'logical slot sync_slot1 has synced as true on standby'); IMO here you should also be checking that the sync slot state is NOT invalidated, just as a counterpoint for the test part later that checks that it IS invalidated. ~~~ 8. +my $inactive_timeout = 1; + +# Set timeout so that next checkpoint will invalidate inactive slot +$primary->safe_psql( + 'postgres', qq[ + ALTER SYSTEM SET replication_slot_inactive_timeout TO '${inactive_timeout}s'; +]); +$primary->reload; 8a. nit - I think that $inactive_timeout assignment belongs below your comment. ~ 8b. nit - s/Set timeout so that next checkpoint will invalidate inactive slot/Set timeout GUC so that the next checkpoint will invalidate inactive slots/ ~~~ 9. +# Check for logical failover slot to become inactive on primary. Note that +# nobody has acquired slot yet, so it must get invalidated due to +# inactive timeout. nit - /Check for logical failover slot to become inactive on primary./Wait for logical failover slot to become inactive on the primary./ nit - /has acquired slot/has acquired the slot/ ~~~ 10. +# Sync primary slot to standby. Note that primary slot has already been +# invalidated due to inactive timeout. Standby must just sync inavalidated +# state. nit - minor, add "the". fix typo "inavalidated", etc. suggestion: Re-sync the primary slots to the standby. Note that the primary slot was already invalidated (above) due to inactive timeout. The standby must just sync the invalidated state. ~~~ 11. +# Make standby slot on primary inactive and check for invalidation +$standby1->stop; nit - /standby slot/the standby slot/ nit - /on primary/on the primary/ ====== Testcase #2 12. I'm not sure it is necessary to do all this extra work. IIUC, there was already almost everything you needed in the previous Testcase #1. So, I thought you could just combine this extra standby timeout test in Testcase #1. Indeed, your Testcase #1 comment still says it is doing this: ("Also, check logical failover slot synced to standby from primary doesn't invalidate on its own,...") e.g. - NEW: set the GUC timeout on the standby - sync the sync_slot (already doing in test #1) - ensure the synced slot is NOT invalid (already suggested above for test #1) - NEW: then do a standby sleep > timeout duration - NEW: then do a standby CHECKPOINT... - NEW: then ensure the sync slot invalidation did NOT happen - then proceed with the rest of test #1... ====== Testcase #3 13. nit - remove a few blank lines to group associated statements together. ~~~ 14. +$publisher->safe_psql( + 'postgres', qq[ + ALTER SYSTEM SET replication_slot_inactive_timeout TO ' ${inactive_timeout}s'; +]); +$publisher->reload; nit - this deserves a comment, the same as in Testcase #1 ====== sub wait_for_slot_invalidation 15. +# Check for slot to first become inactive and then get invalidated +sub check_for_slot_invalidation nit - IMO the previous name was better (e.g. "wait_for.." instead of "check_for...") because that describes exactly what the subroutine is doing. suggestion: # Wait for the slot to first become inactive and then get invalidated sub wait_for_slot_invalidation ~~~ 16. +{ + my ($node, $slot, $offset, $inactive_timeout) = @_; + my $name = $node->name; The variable $name seems too vague. How about $node_name? ~~~ 17. + # Wait for invalidation reason to be set + $node->poll_query_until( + 'postgres', qq[ + SELECT COUNT(slot_name) = 1 FROM pg_replication_slots + WHERE slot_name = '$slot' AND + invalidation_reason = 'inactive_timeout'; + ]) + or die + "Timed out while waiting for invalidation reason of slot $slot to be set on node $name"; 17a. nit - /# Wait for invalidation reason to be set/# Check that the invalidation reason is 'inactive_timeout'/ IIUC, the 'trigger_slot_invalidation' function has already invalidated the slot at this point, so we are not really "Waiting..."; we are "Checking..." that the reason was correctly set. ~ 17b. I think this code fragment maybe would be better put inside the 'trigger_slot_invalidation' function. (I've done this in the nitpicks attachment) ~~~ 18. + # Check that invalidated slot cannot be acquired + my ($result, $stdout, $stderr); + + ($result, $stdout, $stderr) = $node->psql( + 'postgres', qq[ + SELECT pg_replication_slot_advance('$slot', '0/1'); + ]); 18a. s/Check that invalidated slot/Check that an invalidated slot/ ~ 18b. nit - Remove some blank lines, because the comment applies to all below it. ====== sub trigger_slot_invalidation 19. +# Trigger slot invalidation and confirm it in server log +sub trigger_slot_invalidation nit - s/confirm it in server log/confirm it in the server log/ ~ 20. +{ + my ($node, $slot, $offset, $inactive_timeout) = @_; + my $name = $node->name; + my $invalidated = 0; (same as the other subroutine) nit - The variable $name seems too vague. How about $node_name? ====== Please refer to the attached nitpicks top-up patch which implements most of the above nits. ====== Kind Regards, Peter Smith. Fujitsu Australia --00000000000040db280621b9e105 Content-Type: text/plain; charset="US-ASCII"; name="PS_NITPICKS_20240910_SLOT_V450001_TESTS.txt" Content-Disposition: attachment; filename="PS_NITPICKS_20240910_SLOT_V450001_TESTS.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m0vrc3kv0 ZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlY292ZXJ5L3QvMDUwX2ludmFsaWRhdGVfc2xvdHMucGwg Yi9zcmMvdGVzdC9yZWNvdmVyeS90LzA1MF9pbnZhbGlkYXRlX3Nsb3RzLnBsCmluZGV4IDY2OWQ2 Y2MuLjM0YjQ2ZDUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlY292ZXJ5L3QvMDUwX2ludmFsaWRh dGVfc2xvdHMucGwKKysrIGIvc3JjL3Rlc3QvcmVjb3ZlcnkvdC8wNTBfaW52YWxpZGF0ZV9zbG90 cy5wbApAQCAtMTIsMTAgKzEyLDEwIEBAIHVzZSBUaW1lOjpIaVJlcyBxdyh1c2xlZXApOwogIyA9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PQogIyBUZXN0Y2FzZSBzdGFydAogIwotIyBJbnZhbGlkYXRlIHN0 cmVhbWluZyBzdGFuZGJ5IHNsb3QgYW5kIGxvZ2ljYWwgZmFpbG92ZXIgc2xvdCBvbiBwcmltYXJ5 IGR1ZSB0bwotIyBpbmFjdGl2ZSB0aW1lb3V0LiBBbHNvLCBjaGVjayBsb2dpY2FsIGZhaWxvdmVy IHNsb3Qgc3luY2VkIHRvIHN0YW5kYnkgZnJvbQotIyBwcmltYXJ5IGRvZXNuJ3QgaW52YWxpZGF0 ZSBvbiBpdHMgb3duLCBidXQgZ2V0cyB0aGUgaW52YWxpZGF0ZWQgc3RhdGUgZnJvbSB0aGUKLSMg cHJpbWFyeS4KKyMgSW52YWxpZGF0ZSBhIHN0cmVhbWluZyBzdGFuZGJ5IHNsb3QgYW5kIGxvZ2lj YWwgZmFpbG92ZXIgc2xvdCBvbiB0aGUgcHJpbWFyeQorIyBkdWUgdG8gaW5hY3RpdmUgdGltZW91 dC4gQWxzbywgY2hlY2sgdGhhdCBhIGxvZ2ljYWwgZmFpbG92ZXIgc2xvdCBzeW5jZWQgdG8KKyMg dGhlIHN0YW5kYnkgZnJvbSB0aGUgcHJpbWFyeSBkb2Vzbid0IGludmFsaWRhdGUgb24gaXRzIG93 biwgYnV0IGdldHMgdGhlCisjIGludmFsaWRhdGVkIHN0YXRlIGZyb20gdGhlIHByaW1hcnkuCiAK ICMgSW5pdGlhbGl6ZSBwcmltYXJ5CiBteSAkcHJpbWFyeSA9IFBvc3RncmVTUUw6OlRlc3Q6OkNs dXN0ZXItPm5ldygncHJpbWFyeScpOwpAQCAtNDUsNyArNDUsNyBAQCBwcmltYXJ5X3Nsb3RfbmFt ZSA9ICdzYl9zbG90MScKIHByaW1hcnlfY29ubmluZm8gPSAnJGNvbm5zdHIgZGJuYW1lPXBvc3Rn cmVzJwogKSk7CiAKLSMgQ3JlYXRlIHN5bmMgc2xvdCBvbiBwcmltYXJ5CisjIENyZWF0ZSBzeW5j IHNsb3Qgb24gdGhlIHByaW1hcnkKICRwcmltYXJ5LT5wc3FsKCdwb3N0Z3JlcycsCiAJcXtTRUxF Q1QgcGdfY3JlYXRlX2xvZ2ljYWxfcmVwbGljYXRpb25fc2xvdCgnc3luY19zbG90MScsICd0ZXN0 X2RlY29kaW5nJywgZmFsc2UsIGZhbHNlLCB0cnVlKTt9CiApOwpAQCAtNTcsMTMgKzU3LDEzIEBA ICRwcmltYXJ5LT5zYWZlX3BzcWwoCiAKICRzdGFuZGJ5MS0+c3RhcnQ7CiAKLSMgV2FpdCB1bnRp bCBzdGFuZGJ5IGhhcyByZXBsYXllZCBlbm91Z2ggZGF0YQorIyBXYWl0IHVudGlsIHRoZSBzdGFu ZGJ5IGhhcyByZXBsYXllZCBlbm91Z2ggZGF0YQogJHByaW1hcnktPndhaXRfZm9yX2NhdGNodXAo JHN0YW5kYnkxKTsKIAotIyBTeW5jIHByaW1hcnkgc2xvdCB0byBzdGFuZGJ5CisjIFN5bmMgdGhl IHByaW1hcnkgc2xvdHMgdG8gdGhlIHN0YW5kYnkKICRzdGFuZGJ5MS0+c2FmZV9wc3FsKCdwb3N0 Z3JlcycsICJTRUxFQ1QgcGdfc3luY19yZXBsaWNhdGlvbl9zbG90cygpOyIpOwogCi0jIENvbmZp cm0gdGhhdCBsb2dpY2FsIGZhaWxvdmVyIHNsb3QgaXMgY3JlYXRlZCBvbiBzdGFuZGJ5CisjIENv bmZpcm0gdGhhdCB0aGUgbG9naWNhbCBmYWlsb3ZlciBzbG90IGlzIGNyZWF0ZWQgb24gdGhlIHN0 YW5kYnkKIGlzKCAkc3RhbmRieTEtPnNhZmVfcHNxbCgKIAkJJ3Bvc3RncmVzJywKIAkJcXtTRUxF Q1QgY291bnQoKikgPSAxIEZST00gcGdfcmVwbGljYXRpb25fc2xvdHMKQEAgLTczLDI0ICs3Mywy NCBAQCBpcyggJHN0YW5kYnkxLT5zYWZlX3BzcWwoCiAJJ2xvZ2ljYWwgc2xvdCBzeW5jX3Nsb3Qx IGhhcyBzeW5jZWQgYXMgdHJ1ZSBvbiBzdGFuZGJ5Jyk7CiAKIG15ICRsb2dzdGFydCA9IC1zICRw cmltYXJ5LT5sb2dmaWxlOwotbXkgJGluYWN0aXZlX3RpbWVvdXQgPSAxOwogCi0jIFNldCB0aW1l b3V0IHNvIHRoYXQgbmV4dCBjaGVja3BvaW50IHdpbGwgaW52YWxpZGF0ZSBpbmFjdGl2ZSBzbG90 CisjIFNldCB0aW1lb3V0IEdVQyBzbyB0aGF0IHRoYXQgbmV4dCBjaGVja3BvaW50IHdpbGwgaW52 YWxpZGF0ZSBpbmFjdGl2ZSBzbG90cworbXkgJGluYWN0aXZlX3RpbWVvdXQgPSAxOwogJHByaW1h cnktPnNhZmVfcHNxbCgKIAkncG9zdGdyZXMnLCBxcVsKICAgICBBTFRFUiBTWVNURU0gU0VUIHJl cGxpY2F0aW9uX3Nsb3RfaW5hY3RpdmVfdGltZW91dCBUTyAnJHtpbmFjdGl2ZV90aW1lb3V0fXMn OwogXSk7CiAkcHJpbWFyeS0+cmVsb2FkOwogCi0jIENoZWNrIGZvciBsb2dpY2FsIGZhaWxvdmVy IHNsb3QgdG8gYmVjb21lIGluYWN0aXZlIG9uIHByaW1hcnkuIE5vdGUgdGhhdAorIyBXYWl0IGZv ciBsb2dpY2FsIGZhaWxvdmVyIHNsb3QgdG8gYmVjb21lIGluYWN0aXZlIG9uIHRoZSBwcmltYXJ5 LiBOb3RlIHRoYXQKICMgbm9ib2R5IGhhcyBhY3F1aXJlZCBzbG90IHlldCwgc28gaXQgbXVzdCBn ZXQgaW52YWxpZGF0ZWQgZHVlIHRvCiAjIGluYWN0aXZlIHRpbWVvdXQuCi1jaGVja19mb3Jfc2xv dF9pbnZhbGlkYXRpb24oJHByaW1hcnksICdzeW5jX3Nsb3QxJywgJGxvZ3N0YXJ0LAord2FpdF9m b3Jfc2xvdF9pbnZhbGlkYXRpb24oJHByaW1hcnksICdzeW5jX3Nsb3QxJywgJGxvZ3N0YXJ0LAog CSRpbmFjdGl2ZV90aW1lb3V0KTsKIAotIyBTeW5jIHByaW1hcnkgc2xvdCB0byBzdGFuZGJ5LiBO b3RlIHRoYXQgcHJpbWFyeSBzbG90IGhhcyBhbHJlYWR5IGJlZW4KLSMgaW52YWxpZGF0ZWQgZHVl IHRvIGluYWN0aXZlIHRpbWVvdXQuIFN0YW5kYnkgbXVzdCBqdXN0IHN5bmMgaW5hdmFsaWRhdGVk Ci0jIHN0YXRlLgorIyBSZS1zeW5jIHRoZSBwcmltYXJ5IHNsb3RzIHRvIHRoZSBzdGFuZGJ5LiBO b3RlIHRoYXQgdGhlIHByaW1hcnkgc2xvdCB3YXMKKyMgYWxyZWFkeSBpbnZhbGlkYXRlZCAoYWJv dmUpIGR1ZSB0byBpbmFjdGl2ZSB0aW1lb3V0LiBUaGUgc3RhbmRieSBtdXN0IGp1c3QKKyMgc3lu YyB0aGUgaW52YWxpZGF0ZWQgc3RhdGUuCiAkc3RhbmRieTEtPnNhZmVfcHNxbCgncG9zdGdyZXMn LCAiU0VMRUNUIHBnX3N5bmNfcmVwbGljYXRpb25fc2xvdHMoKTsiKTsKICRzdGFuZGJ5MS0+cG9s bF9xdWVyeV91bnRpbCgKIAkncG9zdGdyZXMnLCBxcVsKQEAgLTEwMSw5ICsxMDEsOSBAQCAkc3Rh bmRieTEtPnBvbGxfcXVlcnlfdW50aWwoCiAgIG9yIGRpZQogICAiVGltZWQgb3V0IHdoaWxlIHdh aXRpbmcgZm9yIHN5bmNfc2xvdDEgaW52YWxpZGF0aW9uIHRvIGJlIHN5bmNlZCBvbiBzdGFuZGJ5 IjsKIAotIyBNYWtlIHN0YW5kYnkgc2xvdCBvbiBwcmltYXJ5IGluYWN0aXZlIGFuZCBjaGVjayBm b3IgaW52YWxpZGF0aW9uCisjIE1ha2UgdGhlIHN0YW5kYnkgc2xvdCBvbiB0aGUgcHJpbWFyeSBp bmFjdGl2ZSBhbmQgY2hlY2sgZm9yIGludmFsaWRhdGlvbgogJHN0YW5kYnkxLT5zdG9wOwotY2hl Y2tfZm9yX3Nsb3RfaW52YWxpZGF0aW9uKCRwcmltYXJ5LCAnc2Jfc2xvdDEnLCAkbG9nc3RhcnQs Cit3YWl0X2Zvcl9zbG90X2ludmFsaWRhdGlvbigkcHJpbWFyeSwgJ3NiX3Nsb3QxJywgJGxvZ3N0 YXJ0LAogCSRpbmFjdGl2ZV90aW1lb3V0KTsKIAogIyBUZXN0Y2FzZSBlbmQKQEAgLTIyMywxNCAr MjIzLDEyIEBAICRwdWJsaXNoZXItPnNhZmVfcHNxbCgKICRzdWJzY3JpYmVyLT5zYWZlX3BzcWwo J3Bvc3RncmVzJywKIAkiQ1JFQVRFIFNVQlNDUklQVElPTiBzdWIgQ09OTkVDVElPTiAnJHB1Ymxp c2hlcl9jb25uc3RyJyBQVUJMSUNBVElPTiBwdWIgV0lUSCAoc2xvdF9uYW1lID0gJ2xzdWIxX3Ns b3QnLCBjcmVhdGVfc2xvdCA9IGZhbHNlKSIKICk7Ci0KICRzdWJzY3JpYmVyLT53YWl0X2Zvcl9z dWJzY3JpcHRpb25fc3luYygkcHVibGlzaGVyLCAnc3ViJyk7Ci0KIG15ICRyZXN1bHQgPQogICAk c3Vic2NyaWJlci0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJTRUxFQ1QgY291bnQoKikgRlJPTSB0 ZXN0X3RibCIpOwotCiBpcygkcmVzdWx0LCBxcSg1KSwgImNoZWNrIGluaXRpYWwgY29weSB3YXMg ZG9uZSIpOwogCisjIFNldCB0aW1lb3V0IEdVQyBzbyB0aGF0IHRoYXQgbmV4dCBjaGVja3BvaW50 IHdpbGwgaW52YWxpZGF0ZSBpbmFjdGl2ZSBzbG90cwogJHB1Ymxpc2hlci0+c2FmZV9wc3FsKAog CSdwb3N0Z3JlcycsIHFxWwogICAgIEFMVEVSIFNZU1RFTSBTRVQgcmVwbGljYXRpb25fc2xvdF9p bmFjdGl2ZV90aW1lb3V0IFRPICcgJHtpbmFjdGl2ZV90aW1lb3V0fXMnOwpAQCAtMjQxLDE3ICsy MzksMTcgQEAgJGxvZ3N0YXJ0ID0gLXMgJHB1Ymxpc2hlci0+bG9nZmlsZTsKIAogIyBNYWtlIHN1 YnNjcmliZXIgc2xvdCBvbiBwdWJsaXNoZXIgaW5hY3RpdmUgYW5kIGNoZWNrIGZvciBpbnZhbGlk YXRpb24KICRzdWJzY3JpYmVyLT5zdG9wOwotY2hlY2tfZm9yX3Nsb3RfaW52YWxpZGF0aW9uKCRw dWJsaXNoZXIsICdsc3ViMV9zbG90JywgJGxvZ3N0YXJ0LAord2FpdF9mb3Jfc2xvdF9pbnZhbGlk YXRpb24oJHB1Ymxpc2hlciwgJ2xzdWIxX3Nsb3QnLCAkbG9nc3RhcnQsCiAJJGluYWN0aXZlX3Rp bWVvdXQpOwogCiAjIFRlc3RjYXNlIGVuZAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0jIENo ZWNrIGZvciBzbG90IHRvIGZpcnN0IGJlY29tZSBpbmFjdGl2ZSBhbmQgdGhlbiBnZXQgaW52YWxp ZGF0ZWQKLXN1YiBjaGVja19mb3Jfc2xvdF9pbnZhbGlkYXRpb24KKyMgV2FpdCBmb3Igc2xvdCB0 byBmaXJzdCBiZWNvbWUgaW5hY3RpdmUgYW5kIHRoZW4gZ2V0IGludmFsaWRhdGVkCitzdWIgd2Fp dF9mb3Jfc2xvdF9pbnZhbGlkYXRpb24KIHsKIAlteSAoJG5vZGUsICRzbG90LCAkb2Zmc2V0LCAk aW5hY3RpdmVfdGltZW91dCkgPSBAXzsKLQlteSAkbmFtZSA9ICRub2RlLT5uYW1lOworCW15ICRu b2RlX25hbWUgPSAkbm9kZS0+bmFtZTsKIAogCSMgV2FpdCBmb3Igc2xvdCB0byBiZWNvbWUgaW5h Y3RpdmUKIAkkbm9kZS0+cG9sbF9xdWVyeV91bnRpbCgKQEAgLTI2MSw0NSArMjU5LDMzIEBAIHN1 YiBjaGVja19mb3Jfc2xvdF9pbnZhbGlkYXRpb24KIAkJCQkgIGluYWN0aXZlX3NpbmNlIElTIE5P VCBOVUxMOwogCV0pCiAJICBvciBkaWUKLQkgICJUaW1lZCBvdXQgd2hpbGUgd2FpdGluZyBmb3Ig c2xvdCAkc2xvdCB0byBiZWNvbWUgaW5hY3RpdmUgb24gbm9kZSAkbmFtZSI7CisJICAiVGltZWQg b3V0IHdoaWxlIHdhaXRpbmcgZm9yIHNsb3QgJHNsb3QgdG8gYmVjb21lIGluYWN0aXZlIG9uIG5v ZGUgJG5vZGVfbmFtZSI7CiAKIAl0cmlnZ2VyX3Nsb3RfaW52YWxpZGF0aW9uKCRub2RlLCAkc2xv dCwgJG9mZnNldCwgJGluYWN0aXZlX3RpbWVvdXQpOwogCi0JIyBXYWl0IGZvciBpbnZhbGlkYXRp b24gcmVhc29uIHRvIGJlIHNldAotCSRub2RlLT5wb2xsX3F1ZXJ5X3VudGlsKAotCQkncG9zdGdy ZXMnLCBxcVsKLQkJU0VMRUNUIENPVU5UKHNsb3RfbmFtZSkgPSAxIEZST00gcGdfcmVwbGljYXRp b25fc2xvdHMKLQkJCVdIRVJFIHNsb3RfbmFtZSA9ICckc2xvdCcgQU5ECi0JCQlpbnZhbGlkYXRp b25fcmVhc29uID0gJ2luYWN0aXZlX3RpbWVvdXQnOwotCV0pCi0JICBvciBkaWUKLQkgICJUaW1l ZCBvdXQgd2hpbGUgd2FpdGluZyBmb3IgaW52YWxpZGF0aW9uIHJlYXNvbiBvZiBzbG90ICRzbG90 IHRvIGJlIHNldCBvbiBub2RlICRuYW1lIjsKLQotCSMgQ2hlY2sgdGhhdCBpbnZhbGlkYXRlZCBz bG90IGNhbm5vdCBiZSBhY3F1aXJlZAorCSMgQ2hlY2sgdGhhdCBhbiBpbnZhbGlkYXRlZCBzbG90 IGNhbm5vdCBiZSBhY3F1aXJlZAogCW15ICgkcmVzdWx0LCAkc3Rkb3V0LCAkc3RkZXJyKTsKLQog CSgkcmVzdWx0LCAkc3Rkb3V0LCAkc3RkZXJyKSA9ICRub2RlLT5wc3FsKAogCQkncG9zdGdyZXMn LCBxcVsKIAkJCVNFTEVDVCBwZ19yZXBsaWNhdGlvbl9zbG90X2FkdmFuY2UoJyRzbG90JywgJzAv MScpOwogCV0pOwotCiAJb2soICRzdGRlcnIgPX4KIAkJICAvY2FuIG5vIGxvbmdlciBnZXQgY2hh bmdlcyBmcm9tIHJlcGxpY2F0aW9uIHNsb3QgIiRzbG90Ii8sCi0JCSJkZXRlY3RlZCBlcnJvciB1 cG9uIHRyeWluZyB0byBhY3F1aXJlIGludmFsaWRhdGVkIHNsb3QgJHNsb3Qgb24gbm9kZSAkbmFt ZSIKKwkJImRldGVjdGVkIGVycm9yIHVwb24gdHJ5aW5nIHRvIGFjcXVpcmUgaW52YWxpZGF0ZWQg c2xvdCAkc2xvdCBvbiBub2RlICRub2RlX25hbWUiCiAJICApCiAJICBvciBkaWUKLQkgICJjb3Vs ZCBub3QgZGV0ZWN0IGVycm9yIHVwb24gdHJ5aW5nIHRvIGFjcXVpcmUgaW52YWxpZGF0ZWQgc2xv dCAkc2xvdCBvbiBub2RlICRuYW1lIjsKKwkgICJjb3VsZCBub3QgZGV0ZWN0IGVycm9yIHVwb24g dHJ5aW5nIHRvIGFjcXVpcmUgaW52YWxpZGF0ZWQgc2xvdCAkc2xvdCBvbiBub2RlICRub2RlX25h bWUiOwogfQogCi0jIFRyaWdnZXIgc2xvdCBpbnZhbGlkYXRpb24gYW5kIGNvbmZpcm0gaXQgaW4g c2VydmVyIGxvZworIyBUcmlnZ2VyIHNsb3QgaW52YWxpZGF0aW9uIGFuZCBjb25maXJtIGl0IGlu IHRoZSBzZXJ2ZXIgbG9nCiBzdWIgdHJpZ2dlcl9zbG90X2ludmFsaWRhdGlvbgogewogCW15ICgk bm9kZSwgJHNsb3QsICRvZmZzZXQsICRpbmFjdGl2ZV90aW1lb3V0KSA9IEBfOwotCW15ICRuYW1l ID0gJG5vZGUtPm5hbWU7CisJbXkgJG5vZGVfbmFtZSA9ICRub2RlLT5uYW1lOwogCW15ICRpbnZh bGlkYXRlZCA9IDA7CiAKIAkjIEdpdmUgZW5vdWdoIHRpbWUgdG8gYXZvaWQgbXVsdGlwbGUgY2hl Y2twb2ludHMKLQlzbGVlcCgkaW5hY3RpdmVfdGltZW91dCsxKTsKKwlzbGVlcCgkaW5hY3RpdmVf dGltZW91dCArIDEpOwogCiAJZm9yIChteSAkaSA9IDA7ICRpIDwgMTAgKiAkUG9zdGdyZVNRTDo6 VGVzdDo6VXRpbHM6OnRpbWVvdXRfZGVmYXVsdDsgJGkrKykKIAl7CkBAIC0zMTQsOCArMzAwLDE4 IEBAIHN1YiB0cmlnZ2VyX3Nsb3RfaW52YWxpZGF0aW9uCiAJCXVzbGVlcCgxMDBfMDAwKTsKIAl9 CiAJb2soJGludmFsaWRhdGVkLAotCQkiY2hlY2sgdGhhdCBzbG90ICRzbG90IGludmFsaWRhdGlv biBoYXMgYmVlbiBsb2dnZWQgb24gbm9kZSAkbmFtZSIKKwkJImNoZWNrIHRoYXQgc2xvdCAkc2xv dCBpbnZhbGlkYXRpb24gaGFzIGJlZW4gbG9nZ2VkIG9uIG5vZGUgJG5vZGVfbmFtZSIKIAkpOwor CisJIyBDaGVjayB0aGF0IHRoZSBpbnZhbGlkYXRpb24gcmVhc29uIGlzICdpbmFjdGl2ZV90aW1l b3V0JworCSRub2RlLT5wb2xsX3F1ZXJ5X3VudGlsKAorCQkncG9zdGdyZXMnLCBxcVsKKwkJU0VM RUNUIENPVU5UKHNsb3RfbmFtZSkgPSAxIEZST00gcGdfcmVwbGljYXRpb25fc2xvdHMKKwkJCVdI RVJFIHNsb3RfbmFtZSA9ICckc2xvdCcgQU5ECisJCQlpbnZhbGlkYXRpb25fcmVhc29uID0gJ2lu YWN0aXZlX3RpbWVvdXQnOworCV0pCisJICBvciBkaWUKKwkgICJUaW1lZCBvdXQgd2hpbGUgd2Fp dGluZyBmb3IgaW52YWxpZGF0aW9uIHJlYXNvbiBvZiBzbG90ICRzbG90IHRvIGJlIHNldCBvbiBu b2RlICRub2RlX25hbWUiOwogfQogCiBkb25lX3Rlc3RpbmcoKTsK --00000000000040db280621b9e105--