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 1wWZao-002i24-14 for pgsql-hackers@arkaria.postgresql.org; Mon, 08 Jun 2026 13:00:38 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wWZan-002QSU-0n for pgsql-hackers@arkaria.postgresql.org; Mon, 08 Jun 2026 13:00:37 +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.96) (envelope-from ) id 1wWZam-002QSL-2q for pgsql-hackers@lists.postgresql.org; Mon, 08 Jun 2026 13:00:36 +0000 Received: from mail-ej1-x62f.google.com ([2a00:1450:4864:20::62f]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wWZak-00000001yMv-3Yf3 for pgsql-hackers@postgresql.org; Mon, 08 Jun 2026 13:00:36 +0000 Received: by mail-ej1-x62f.google.com with SMTP id a640c23a62f3a-bebac79fff8so433744366b.0 for ; Mon, 08 Jun 2026 06:00:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1780923632; cv=none; d=google.com; s=arc-20240605; b=djX3IEKHXEGFTzTeCNNVk/xJzzMmewVLSGTnwz6+yYFid8Z3eGCcWzUAQWfT4lRnJ2 j5ts865Llbk7GZarg/YIpUokCQRLj8keZlMrwJfY4RVUX76Jr7Q+EQpjScgxb1ZUgJ3Z YijJyP6035CXvz5wCpy/1fQiSDmrs408LG6RCIxzYOaGSWjAoHurqVRMtAhEkEDrsTfc aRYX3sEDmlU5cMcCnAc1y79dsf6CicB+2UKOTNTbXpML5AqK0ZYEGf4Jos/sdNvi3A35 NhGEpXHbmJFaB4jvktAe3jJZQhzGXTeDBRqGQODxLBM/AtTwYWLTqoFghC+fTHAo4Q5B vaCA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=+fO51s23kgNZIz/gwmjl8rttnCK6jZnjQAv0CvYu76U=; fh=RIpYg19RUky8XjqPxPAhPRl4EEiqmGPtIlqAAyhnid4=; b=GpEvhQCLLBeDBhV9ephBVjuBdHwgKdCPtP2w4xj4Jpe2s3wR1rfliMtpQueVBjlj1V P79KQMW3SJsHQ1At2Eo8FnhiC7JMzLci8SyL6NTREOedMoULRwaygcxFKOTpcePF3IO3 5zQLWFGcZrS1p0uvWxAmaQMCdsr/BVS5GzF9calDOIkkODqoLgTbP9S2p6fw05R0nGWC 1qOzVSYPYGTdreKaWu5tdRtSYA9DsDhvPhQOy7EjpSyLKIUdR9kVzXx0LLHhu8BHa1XA MaorOfkDX9wdWTHeMT8GC2ixo43LTcU0e6J4i6G67ZoErLNWpdD+6Rhlfe3vetQRbBTM L/uw==; darn=postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1780923632; x=1781528432; 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=+fO51s23kgNZIz/gwmjl8rttnCK6jZnjQAv0CvYu76U=; b=ZUtrKtJelp6lSS1q3bXoa5+2pVkiolz70eiTnC5k1PjYm/cyA3Y5iKjAFRsJ3IzXZy 1kvVZ6x/sCjaBxrx8Opmf6txl78LULbT3FLJKEmlUOGofIfAOSI8xar5f8cYssK1vy5t fn5Skwqf5naeZ+6k3VDNE488eNhY+6Whm8A5QlWLklW+onFgjgDuOYdMSxlIoQzM42iR rdUA2hum2hbeK+/x+n/v4VO2deLg4DaIlp4cEAaIJ93ovSi8FqSzNK4B+bo5RPyjK4Ts O/mdHCbmRi5nukZveCoi/PfqvAMRzf6JZRN9sCXlXN4BImBaERiP4J9HVeObtJqGhtNU GC3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780923632; x=1781528432; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=+fO51s23kgNZIz/gwmjl8rttnCK6jZnjQAv0CvYu76U=; b=fY8RL/s/q9PaQxHi+oHmpFFmJxEdedRPmyCB9Fg721oJXOSxiRjAVZf1fWIcnGKcSi tKBe257f3tfm+Pqy10i6czj1DWqxUBW6FQ2Bo1Qo+a7ah7qP4dUI2cekK6EipIN9QD3x nbQxv5xhoOtoUAUb+atxsbFVUOrh0PqxzecIdNYseXtBHVfR2KmeflZK3u7/+RaDd9Kt HJUuChRo4Jvl2mK5s07J+3eyZoFVWOzopptyMCY/M08I/IeO06WXS2FnMlvi/awvyRXh fI5IwxMw4nVwm9AJq7Cnm3qZigvOcDDXmzo/6NBQQeU1bwH3X8x4kWKKFV7vTVHyJCfd ZBWQ== X-Forwarded-Encrypted: i=1; AFNElJ8KNrZaoQWe84xqhsvfKTtMRsNdhp0b0a6h7D3+ua66/n/MPhC9OmGxCODPqGogqS5RnSKI9uittHJ5Y63K@postgresql.org X-Gm-Message-State: AOJu0YzVTXhSszplQpzZo899H1WV2cSMKIP7Dlgf5j4bW4VYo5bCEPJ+ 0yXnYpinj2BTqlevWCGUffPZIr1DDjLbGvowZa3Pjb+kRakelcDlRqdDLfqX73W4dc5J0rBwkLW TUjc9cbq90wTewo+7BwCtnM6n+mmmQEmdDsfx X-Gm-Gg: Acq92OELW+3cl8sp5dhkhoWUhoOVp+ba30SQfC+/pb+p8Q0tzTks2OqhJMsTpAybfet yKnOrZc9jwIDLo95JfIk0XNXSm0YLdd5+6lqGD5Ycd0uHlnzqNHxNdKdqP6uv4HwxxLhUcBzm1L Ahnht2H9V509PQv1UBIy7q+64f93K+V2ZIkj4EOq9mll0Qf7R1/OnS0fEEIIGI9/tE6oYXQSv+X fP6vLetNhes3a1W3gWo2xpTrwt3jJQL6Pu+gPxMoPO6LBIVkKSUZfSe+qH+wD1myLCffruISyDg IhC2ecKkq7MprJMRDPmTWYETa6yU+pS+F8POBgvZthDf/Wamo9oPmIkxZwbO+adH8+jgaFNgK8Q gOifUHh9ZwrWpi6nLo2OGGi6pJQKdTG5+Wh/DUhZWnhPoOktJvAo= X-Received: by 2002:a17:907:7f90:b0:beb:70d3:9a5b with SMTP id a640c23a62f3a-bf373cf0aafmr802986266b.36.1780923631536; Mon, 08 Jun 2026 06:00:31 -0700 (PDT) MIME-Version: 1.0 References: <7daef094-abf3-4672-bc23-3df4763b16a3@gmail.com> In-Reply-To: From: Xuneng Zhou Date: Mon, 8 Jun 2026 21:00:17 +0800 X-Gm-Features: AVVi8CfDwjsKBhRRvaQAx89VHmq3vbE4avRlQqsaw6Mt1WAqUh_QCJemxr1Lyxw Message-ID: Subject: Re: t/035_standby_logical_decoding.pl might fail on attempt to read wrong timeline To: "Hayato Kuroda (Fujitsu)" Cc: Bertrand Drouvot , Alexander Lakhin , pgsql-hackers Content-Type: multipart/mixed; boundary="0000000000006e5ea60653bd982c" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000006e5ea60653bd982c Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Mon, Jun 8, 2026 at 4:31=E2=80=AFPM Xuneng Zhou w= rote: > > Hi Kuroda-san, > > On Mon, Jun 8, 2026 at 12:25=E2=80=AFPM Hayato Kuroda (Fujitsu) > wrote: > > > > Hi Alexander, Bertrand, Xuneng, > > > > Thanks for seeing the failure. Our team also recognized but could not f= ind the reason. > > > > > Yeah, it looks like there is a race condition here. I think we should= check if > > > the insertion timeline has already been set (like the walsummarizer i= s doing). > > > > Sorry for stupid question; I tried to reproduce the failure but could n= ot, see attached. > > > > IIUC, the issue can happen if the walsender must read the WAL record ge= nerated > > after the promotion but the timeline could not be updated. > > I think the race is that the logical walsender is trying to read the > pre-promotion wal from the slot's restart_lsn. > > 1) In 035_standby_logical_decoding.pl, the active slot / > pg_recvlogical process is started before: > INSERT rows 1..4 # before promotion > promote standby > INSERT rows 5..7 # after promotion > > 2) Alexander=E2=80=99s reproducer sleeps immediately after: > ReplicationSlotAcquire(cmd->slotname, true, true); > pg_usleep(200000); > > So with the delay: > slot is active but walsender has not yet create decoding context and > called xlogbeginread(); > > 3) Then the test continues and promotes the standby while the > walsender still sleeping, therefore promotion could happen before the > walsender starts its actual wal read. > > 4) The logical walsender is trying to read the pre-promotion wal from > the slot's restart_lsn. The failing log implies this: > Streaming transactions committing after 0/06487A20, > reading WAL from 0/064879E8. > > This line is emitted from: > errdetail("Streaming transactions committing after %X/%08X, reading > WAL from %X/%08X.", > slot->data.confirmed_flush, > slot->data.restart_lsn) > > Function StartLogicalReplication() initiates the xlogreader at the restar= t lsn: > XLogBeginRead(logical_decoding_ctx->reader, > MyReplicationSlot->data.restart_lsn); > > Because the slot was created and acquired before promotion, its > restart_lsn is from the standby-era state which points to wal required > for decoding the pre-promotion stream. In the test, the first expected > output is rows 1..4, inserted before promotion. > > The failing output was empty: > got: '' > expected: > BEGIN > rows 1..4 > COMMIT > BEGIN > rows 5..7 > COMMIT > > Empty output suggests that the walsender died before emitting even the > first pre-promotion transaction. > > 5) The walsender try to read wal but failed > Failed run: > LOG: !!!WalSndSegmentOpen| nextSegNo: 6, > path: pg_wal/000000010000000000000006 > ERROR: requested WAL segment > 000000010000000000000006 has already been removed > > Passed run > LOG: !!!WalSndSegmentOpen| nextSegNo: 6, > path: pg_wal/000000020000000000000006 > > As the log suggested, the walsender of the successful run readed the > wal from timeline 2 but failed to do so for timeline1. > This comment in xlogutils.is almost exactly the issue: > > We care about timelines ... reading xlog generated prior to a promotion > ... > The server copied the segment to the new timeline ... there's no guarante= e > the old segment will still exist. It may have been deleted or renamed wit= h > a .partial suffix > > So the need for tli1 does not always imply that the wal was generated > after promotion. It could be bytes from before the switchpoint, but > they now be available through the new tli segment file. > > 6) XLogReadDetermineTimeline() needs the current system-wide TLI. > > The current code in does roughly: > > am_cascading_walsender =3D RecoveryInProgress(); > > if (am_cascading_walsender) > GetXLogReplayRecPtr(&currTLI); > else > currTLI =3D GetWALInsertionTimeLine(); > > During promotion, we set the wal insertion timeline before marking > recovery as fully done. So there is a window where: > > - InsertTimeLineID is already the new timeline, e.g. tli 2. > - RecoveryInProgress() can still return true in another backend. > - A logical walsender that started before promotion can wake up and > choose its read timeline using the old recovery-state test. > > In the race, replay tli 1 is chosen even though the promotion has > created the new tli 2 wal segment copy. Then WalSndSegmentOpen() tries > to open 000000010000000000000006, which may already be gone or > renamed, while the correct file is 000000020000000000000006. > > 7) Bertrand's proposal to fix this > Recognizing the intermediate promotion state -- if recovery still > shows progress but the insertion tli is already advanced, use that > insertion tli for the timeline to be chosen. > > > However, I think logical_read_xlog_page() is called after the new WAL r= ecords > > are generated, i.e., am_cascading_walsender has already been false at t= hat time. > > So not sure where is the race? > > This function is not only called after new post-promotion records are > generated. When START_REPLICATION begins, CreateDecodingContext() / > XLogBeginRead() starts from the slot's restart_lsn, which can be well > before promotion. > I tweaked the reproducer based on the theory outlined above. The main changes from the original reproducer are: 1) blocks at logical-walsender-after-slot-acquire in walsender.c, before the decoding context is created and before the reader starts from restart_lsn, matching the delay set by Alexander 2) Forces the first read to occur during promotion. It inserts rows 1..4, waits for replay, starts promotion with pg_promote(false), holds startup at startup-logical-decoding-status-change-end-of-recovery, then wakes the walsender. The test failed on HEAD and passed after applying the patch by Bertrand. --=20 Regards, Xuneng Zhou HighGo Software Co., Ltd. --0000000000006e5ea60653bd982c Content-Type: application/octet-stream; name="v1-0001-Reproducer-for-logical-decoding-choosing-the-wron.patch" Content-Disposition: attachment; filename="v1-0001-Reproducer-for-logical-decoding-choosing-the-wron.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mq57xcb60 RnJvbSAxNTMzMzMwMmIwN2JhYzY0ZTJlYjBiOTg0YzJiNGUwMzdlMjU2NmFiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBhbHRlcmVnbzY1NSA8ODI0NjYyNTI2QHFxLmNvbT4KRGF0ZTog TW9uLCA4IEp1biAyMDI2IDIwOjQ3OjU2ICswODAwClN1YmplY3Q6IFtQQVRDSCB2MV0gUmVwcm9k dWNlciBmb3IgbG9naWNhbCBkZWNvZGluZyBjaG9vc2luZyB0aGUgd3JvbmcKIHRpbWVsaW5lIHdo aWxlIGEgc3RhbmRieSBpcyBiZWluZyBwcm9tb3RlZC4KCi0tLQogc3JjL2JhY2tlbmQvcmVwbGlj YXRpb24vd2Fsc2VuZGVyLmMgfCAgIDUgKwogc3JjL3Rlc3QvcmVjb3ZlcnkvdC8wOTlfcmVwcm8u cGwgICAgfCAxMzkgKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogMiBmaWxlcyBjaGFuZ2Vk LCAxNDQgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L3JlY292ZXJ5 L3QvMDk5X3JlcHJvLnBsCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvcmVwbGljYXRpb24vd2Fs c2VuZGVyLmMgYi9zcmMvYmFja2VuZC9yZXBsaWNhdGlvbi93YWxzZW5kZXIuYwppbmRleCAwNGFh NzcwZDk4MS4uZGJkNDhkMTcyNTAgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9u L3dhbHNlbmRlci5jCisrKyBiL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL3dhbHNlbmRlci5jCkBA IC05NCw2ICs5NCw3IEBACiAjaW5jbHVkZSAidXRpbHMvYWNsLmgiCiAjaW5jbHVkZSAidXRpbHMv YnVpbHRpbnMuaCIKICNpbmNsdWRlICJ1dGlscy9ndWMuaCIKKyNpbmNsdWRlICJ1dGlscy9pbmpl Y3Rpb25fcG9pbnQuaCIKICNpbmNsdWRlICJ1dGlscy9sc3lzY2FjaGUuaCIKICNpbmNsdWRlICJ1 dGlscy9tZW11dGlscy5oIgogI2luY2x1ZGUgInV0aWxzL3BnX2xzbi5oIgpAQCAtMTEwMyw2ICsx MTA0LDggQEAgbG9naWNhbF9yZWFkX3hsb2dfcGFnZShYTG9nUmVhZGVyU3RhdGUgKnN0YXRlLCBY TG9nUmVjUHRyIHRhcmdldFBhZ2VQdHIsIGludCByZXEKIAkgKi8KIAlhbV9jYXNjYWRpbmdfd2Fs c2VuZGVyID0gUmVjb3ZlcnlJblByb2dyZXNzKCk7CiAKKwlJTkpFQ1RJT05fUE9JTlQoImxvZ2lj YWwtcmVhZC14bG9nLXBhZ2UtYmVmb3JlLXRsaSIsIE5VTEwpOworCiAJaWYgKGFtX2Nhc2NhZGlu Z193YWxzZW5kZXIpCiAJCUdldFhMb2dSZXBsYXlSZWNQdHIoJmN1cnJUTEkpOwogCWVsc2UKQEAg LTE1MDEsNiArMTUwNCw4IEBAIFN0YXJ0TG9naWNhbFJlcGxpY2F0aW9uKFN0YXJ0UmVwbGljYXRp b25DbWQgKmNtZCkKIAogCVJlcGxpY2F0aW9uU2xvdEFjcXVpcmUoY21kLT5zbG90bmFtZSwgdHJ1 ZSwgdHJ1ZSk7CiAKKwlJTkpFQ1RJT05fUE9JTlQoImxvZ2ljYWwtd2Fsc2VuZGVyLWFmdGVyLXNs b3QtYWNxdWlyZSIsIE5VTEwpOworCiAJLyoKIAkgKiBGb3JjZSBhIGRpc2Nvbm5lY3QsIHNvIHRo YXQgdGhlIGRlY29kaW5nIGNvZGUgZG9lc24ndCBuZWVkIHRvIGNhcmUKIAkgKiBhYm91dCBhbiBl dmVudHVhbCBzd2l0Y2ggZnJvbSBydW5uaW5nIGluIHJlY292ZXJ5LCB0byBydW5uaW5nIGluIGEK ZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlY292ZXJ5L3QvMDk5X3JlcHJvLnBsIGIvc3JjL3Rlc3Qv cmVjb3ZlcnkvdC8wOTlfcmVwcm8ucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MDAwMDAuLjgzYTQyYWU1MDdlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVjb3Zlcnkv dC8wOTlfcmVwcm8ucGwKQEAgLTAsMCArMSwxMzkgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDI2LCBQ b3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAorCisjIFJlcHJvZHVjZXIgZm9yIGxv Z2ljYWwgZGVjb2RpbmcgY2hvb3NpbmcgdGhlIHdyb25nIHRpbWVsaW5lIHdoaWxlIGEgc3RhbmRi eQorIyBpcyBiZWluZyBwcm9tb3RlZC4KKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5ncyBGQVRB TCA9PiAnYWxsJzsKKwordXNlIFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXI7Cit1c2UgUG9zdGdy ZVNRTDo6VGVzdDo6VXRpbHM7Cit1c2UgVGVzdDo6TW9yZTsKKworaWYgKCRFTlZ7ZW5hYmxlX2lu amVjdGlvbl9wb2ludHN9IG5lICd5ZXMnKQoreworCXBsYW4gc2tpcF9hbGwgPT4gJ0luamVjdGlv biBwb2ludHMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGJ1aWxkJzsKK30KKworbXkgKCRzdGRvdXQs ICRzdGRlcnIpOworCitteSAkbm9kZV9wcmltYXJ5ID0gUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3Rl ci0+bmV3KCdwcmltYXJ5Jyk7CitteSAkbm9kZV9zdGFuZGJ5ID0gUG9zdGdyZVNRTDo6VGVzdDo6 Q2x1c3Rlci0+bmV3KCdzdGFuZGJ5Jyk7CitteSAkZGVmYXVsdF90aW1lb3V0ID0gJFBvc3RncmVT UUw6OlRlc3Q6OlV0aWxzOjp0aW1lb3V0X2RlZmF1bHQ7CisKK215ICRwcmltYXJ5X3Nsb3RuYW1l ID0gJ3ByaW1hcnlfcGh5c2ljYWwnOworCiskbm9kZV9wcmltYXJ5LT5pbml0KGFsbG93c19zdHJl YW1pbmcgPT4gMSwgaGFzX2FyY2hpdmluZyA9PiAxKTsKKyRub2RlX3ByaW1hcnktPmFwcGVuZF9j b25mKAorCSdwb3N0Z3Jlc3FsLmNvbmYnLCBxWword2FsX2xldmVsID0gJ2xvZ2ljYWwnCittYXhf cmVwbGljYXRpb25fc2xvdHMgPSA0CittYXhfd2FsX3NlbmRlcnMgPSA0CithdXRvdmFjdXVtID0g b2ZmCitdKTsKKyRub2RlX3ByaW1hcnktPnN0YXJ0OworCitpZiAoISRub2RlX3ByaW1hcnktPmNo ZWNrX2V4dGVuc2lvbignaW5qZWN0aW9uX3BvaW50cycpKQoreworCXBsYW4gc2tpcF9hbGwgPT4g J0V4dGVuc2lvbiBpbmplY3Rpb25fcG9pbnRzIG5vdCBpbnN0YWxsZWQnOworfQorCiskbm9kZV9w cmltYXJ5LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgJ0NSRUFURSBFWFRFTlNJT04gaW5qZWN0aW9u X3BvaW50czsnKTsKKworJG5vZGVfcHJpbWFyeS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsCisJcXFb U0VMRUNUICogRlJPTSBwZ19jcmVhdGVfcGh5c2ljYWxfcmVwbGljYXRpb25fc2xvdCgnJHByaW1h cnlfc2xvdG5hbWUnKTtdCispOworJG5vZGVfcHJpbWFyeS0+c2FmZV9wc3FsKCdwb3N0Z3Jlcycs CisJJ0NSRUFURSBUQUJMRSBkZWNvZGluZ190ZXN0KHggaW50ZWdlciwgeSB0ZXh0KTsnKTsKKwor bXkgJGJhY2t1cF9uYW1lID0gJ2IxJzsKKyRub2RlX3ByaW1hcnktPmJhY2t1cCgkYmFja3VwX25h bWUpOworCiskbm9kZV9zdGFuZGJ5LT5pbml0X2Zyb21fYmFja3VwKAorCSRub2RlX3ByaW1hcnks ICRiYWNrdXBfbmFtZSwKKwloYXNfc3RyZWFtaW5nID0+IDEsCisJaGFzX3Jlc3RvcmluZyA9PiAx KTsKKyRub2RlX3N0YW5kYnktPmFwcGVuZF9jb25mKAorCSdwb3N0Z3Jlc3FsLmNvbmYnLAorCXFx W3ByaW1hcnlfc2xvdF9uYW1lID0gJyRwcmltYXJ5X3Nsb3RuYW1lJworbWF4X3JlcGxpY2F0aW9u X3Nsb3RzID0gNF0pOworJG5vZGVfc3RhbmRieS0+c3RhcnQ7Ciskbm9kZV9wcmltYXJ5LT53YWl0 X2Zvcl9yZXBsYXlfY2F0Y2h1cCgkbm9kZV9zdGFuZGJ5KTsKKworJG5vZGVfc3RhbmRieS0+Y3Jl YXRlX2xvZ2ljYWxfc2xvdF9vbl9zdGFuZGJ5KCRub2RlX3ByaW1hcnksICd0ZXN0c2xvdCcsCisJ J3Bvc3RncmVzJyk7CisKKyRub2RlX3N0YW5kYnktPnNhZmVfcHNxbCgncG9zdGdyZXMnLAorCSJT RUxFQ1QgaW5qZWN0aW9uX3BvaW50c19hdHRhY2goJ2xvZ2ljYWwtd2Fsc2VuZGVyLWFmdGVyLXNs b3QtYWNxdWlyZScsICd3YWl0Jyk7IgorKTsKKworbXkgJGhhbmRsZSA9IElQQzo6UnVuOjpzdGFy dCgKKwlbCisJCSdwZ19yZWN2bG9naWNhbCcsCisJCSctLWRibmFtZScgPT4gJG5vZGVfc3RhbmRi eS0+Y29ubnN0cigncG9zdGdyZXMnKSwKKwkJJy0tc2xvdCcgPT4gJ3Rlc3RzbG90JywKKwkJJy0t b3B0aW9uJyA9PiAnaW5jbHVkZS14aWRzPTAnLAorCQknLS1vcHRpb24nID0+ICdza2lwLWVtcHR5 LXhhY3RzPTEnLAorCQknLS1maWxlJyA9PiAnLScsCisJCSctLW5vLWxvb3AnLAorCQknLS1zdGFy dCcsCisJXSwKKwknPicgPT4gXCRzdGRvdXQsCisJJzI+JyA9PiBcJHN0ZGVyciwKKwlJUEM6OlJ1 bjo6dGltZW91dCgkZGVmYXVsdF90aW1lb3V0KSk7CisKKyRub2RlX3N0YW5kYnktPndhaXRfZm9y X2V2ZW50KCd3YWxzZW5kZXInLAorCSdsb2dpY2FsLXdhbHNlbmRlci1hZnRlci1zbG90LWFjcXVp cmUnKTsKKworJG5vZGVfcHJpbWFyeS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsCisJcXFbSU5TRVJU IElOVE8gZGVjb2RpbmdfdGVzdCh4LHkpCisJICAgU0VMRUNUIHMsIHM6OnRleHQgRlJPTSBnZW5l cmF0ZV9zZXJpZXMoMSw0KSBzO10pOworJG5vZGVfcHJpbWFyeS0+d2FpdF9mb3JfcmVwbGF5X2Nh dGNodXAoJG5vZGVfc3RhbmRieSk7CisKKyRub2RlX3N0YW5kYnktPnNhZmVfcHNxbCgncG9zdGdy ZXMnLAorCXFxW1NFTEVDVCBpbmplY3Rpb25fcG9pbnRzX2F0dGFjaCgnc3RhcnR1cC1sb2dpY2Fs LWRlY29kaW5nLXN0YXR1cy1jaGFuZ2UtZW5kLW9mLXJlY292ZXJ5JywgJ3dhaXQnKTtdCispOwor Ciskbm9kZV9zdGFuZGJ5LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgJ1NFTEVDVCBwZ19wcm9tb3Rl KGZhbHNlKTsnKTsKKyRub2RlX3N0YW5kYnktPndhaXRfZm9yX2V2ZW50KCdzdGFydHVwJywKKwkn c3RhcnR1cC1sb2dpY2FsLWRlY29kaW5nLXN0YXR1cy1jaGFuZ2UtZW5kLW9mLXJlY292ZXJ5Jyk7 CisKKyRub2RlX3N0YW5kYnktPnNhZmVfcHNxbCgncG9zdGdyZXMnLAorCSJTRUxFQ1QgaW5qZWN0 aW9uX3BvaW50c193YWtldXAoJ2xvZ2ljYWwtd2Fsc2VuZGVyLWFmdGVyLXNsb3QtYWNxdWlyZScp OyIKKyk7CisKK215ICRwdW1wX3RpbWVvdXQgPSBJUEM6OlJ1bjo6dGltZXIoJFBvc3RncmVTUUw6 OlRlc3Q6OlV0aWxzOjp0aW1lb3V0X2RlZmF1bHQpOworb2socHVtcF91bnRpbCgkaGFuZGxlLCAk cHVtcF90aW1lb3V0LCBcJHN0ZG91dCwgcXIvXi4qQ09NTUlUJC9zKSwKKwknZGVjb2RlZCBwcmUt cHJvbW90aW9uIHRyYW5zYWN0aW9uIHdoaWxlIHByb21vdGlvbiBpcyBpbiBwcm9ncmVzcycpOwor Ciskbm9kZV9zdGFuZGJ5LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKKwlxcVtTRUxFQ1QgaW5qZWN0 aW9uX3BvaW50c193YWtldXAoJ3N0YXJ0dXAtbG9naWNhbC1kZWNvZGluZy1zdGF0dXMtY2hhbmdl LWVuZC1vZi1yZWNvdmVyeScpO10KKyk7CisKKyRub2RlX3N0YW5kYnktPnBvbGxfcXVlcnlfdW50 aWwoJ3Bvc3RncmVzJywKKwkiU0VMRUNUIE5PVCBwZ19pc19pbl9yZWNvdmVyeSgpOyIpCisgIG9y IGRpZSAic3RhbmRieSBkaWQgbm90IGZpbmlzaCBwcm9tb3Rpb24iOworCiskbm9kZV9zdGFuZGJ5 LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKKwlxcVtJTlNFUlQgSU5UTyBkZWNvZGluZ190ZXN0KHgs eSkKKwkgICBTRUxFQ1Qgcywgczo6dGV4dCBGUk9NIGdlbmVyYXRlX3Nlcmllcyg1LDcpIHM7XSk7 CisKK29rKHB1bXBfdW50aWwoJGhhbmRsZSwgJHB1bXBfdGltZW91dCwgXCRzdGRvdXQsIHFyL14u KkNPTU1JVC4qQ09NTUlUJC9zKSwKKwknZGVjb2RlZCBwcmUtIGFuZCBwb3N0LXByb21vdGlvbiB0 cmFuc2FjdGlvbnMnKTsKKworbXkgJGV4cGVjdGVkID0gcXtCRUdJTgordGFibGUgcHVibGljLmRl Y29kaW5nX3Rlc3Q6IElOU0VSVDogeFtpbnRlZ2VyXToxIHlbdGV4dF06JzEnCit0YWJsZSBwdWJs aWMuZGVjb2RpbmdfdGVzdDogSU5TRVJUOiB4W2ludGVnZXJdOjIgeVt0ZXh0XTonMicKK3RhYmxl IHB1YmxpYy5kZWNvZGluZ190ZXN0OiBJTlNFUlQ6IHhbaW50ZWdlcl06MyB5W3RleHRdOiczJwor dGFibGUgcHVibGljLmRlY29kaW5nX3Rlc3Q6IElOU0VSVDogeFtpbnRlZ2VyXTo0IHlbdGV4dF06 JzQnCitDT01NSVQKK0JFR0lOCit0YWJsZSBwdWJsaWMuZGVjb2RpbmdfdGVzdDogSU5TRVJUOiB4 W2ludGVnZXJdOjUgeVt0ZXh0XTonNScKK3RhYmxlIHB1YmxpYy5kZWNvZGluZ190ZXN0OiBJTlNF UlQ6IHhbaW50ZWdlcl06NiB5W3RleHRdOic2JwordGFibGUgcHVibGljLmRlY29kaW5nX3Rlc3Q6 IElOU0VSVDogeFtpbnRlZ2VyXTo3IHlbdGV4dF06JzcnCitDT01NSVR9OworCitjaG9tcCgkc3Rk b3V0KTsKK2lzKCRzdGRvdXQsICRleHBlY3RlZCwgJ2dvdCBleHBlY3RlZCBvdXRwdXQgZnJvbSBw Z19yZWN2bG9naWNhbCcpOworCitkb25lX3Rlc3RpbmcoKTsKLS0gCjIuNTEuMAoK --0000000000006e5ea60653bd982c--