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 1wHGQn-0070YH-0y for pgsql-hackers@arkaria.postgresql.org; Mon, 27 Apr 2026 07:31:01 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wHGQm-00ChT4-0n for pgsql-hackers@arkaria.postgresql.org; Mon, 27 Apr 2026 07:31:00 +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 1wHGQl-00ChSv-2q for pgsql-hackers@lists.postgresql.org; Mon, 27 Apr 2026 07:30:59 +0000 Received: from mail-ot1-x334.google.com ([2607:f8b0:4864:20::334]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wHGQj-00000003IY4-2REs for pgsql-hackers@lists.postgresql.org; Mon, 27 Apr 2026 07:30:59 +0000 Received: by mail-ot1-x334.google.com with SMTP id 46e09a7af769-7d4c12ff3d5so8918688a34.2 for ; Mon, 27 Apr 2026 00:30:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1777275055; cv=none; d=google.com; s=arc-20240605; b=Xi1aIzViKSfsadZxt9B6a+5vuUdW6dWW4noQ2iWXcaFb3D2e7ebAki7iKwq2XwC/4W 5QBBPf0D8jre3XM40RzueLBhMzPGfZBnwSMSwJ21+y7OGP2qYcWNU4R2ZFYF/Ye+xcaQ nV9Awr3dX0pEOsqPnkD8t5dDU2SGmHV4hMN9D7FZZGgUXPUVnPi6NDmevz0O6ioYFOyB 5KhnQJwsF9ipJyU6U/4/CS87k4p5gwjMjP7WBwnYsZKV2+DvHHga0gszSCKH3aKU0NNQ MQEy+rmhAxQZ6pCfZdt646Ri0GlUlhGPYdTXC8Mu4hKbCKIXXnmgWSWbhyEF+T1mcwcJ Aw7g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=QRHJI9HpERTb7om2T/Ij54StjGrJdWeOteik4aualk4=; fh=dxJXJbLzq9Nah1LUdsj4QTuQ3JoDScd0wp1YHY64NXM=; b=enn3cGGLLn2E26pGR2r0IQOdEuolVOI/yOCfV34v2n9m9kbZlRv7mnjBipTjOX2/la PRn+XWuy84rl5S+WFSwApUD1xyA8ODiAFn89K4Fx2I//F7fnnzggwowfR4WpRcYN1n3L j3jddmEN2McC4+KzavCE0jODq16PNtIed0DRYkEWVWlBFJ5Uh2TSrUtKken/8Yt8mWKQ C+Ib3hF5HZzgO/hgxiwOFLV4IquWIF5tCBgaU0hFm5+r5nKiVN3Oatlr9akKe7PFQPxS 4AuXSDFvOWVjUUNwgaRF7ySGbN4LIToJT5xgQjf7NhhRjISJm+XYoSTioFJinru3qR0l efPg==; darn=lists.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=1777275055; x=1777879855; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=QRHJI9HpERTb7om2T/Ij54StjGrJdWeOteik4aualk4=; b=UgmveW7sxTxPAcWyUrB/sXtjDcU71L9KavOHC4jAJvI63WDO22W+dGJPrO49rbAH1+ iYTVU5HSR6WUfRrwAMbcsnUoHCGaIyhJXVIE2rk9lFonZzqC+4yvglWMOhvtQbpuq3jj /DZlqpmC4Hne4pB+ctTvFUQYKCKLMqNBklht0uAsnp7gUugYmrzKAWIOIh50P3/nMfD1 U+yzaqIZbpDLDQS+Gpz7RjckVXWxIdnMrbRYGN16MSPcgyVplMIs1nNb8SxuoI9eNv4m VyB+dnZGsFttpoQqiQoc6d0JXi12oUe2ZGpv46zv5amYOrTOwy9wmS4Kc4wjlQHzBMLW HNgg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777275055; x=1777879855; h=to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=QRHJI9HpERTb7om2T/Ij54StjGrJdWeOteik4aualk4=; b=BNa+7X/fncetmvWqfc54wWBgQ6ods63L6aLY5YZUIvXBq+HTqAm9Ys5G9BXSZSNgSY qqUjv+95x25Ztgmuls6r385fvcDE8nH7641b1Nqc3qyWhUNWEeU9ij1Zdt45wrLAb2Iv KQdRf53f2bpWZkW3119euvZWKdgGskrXSKjdyjiqxVUR999bHOBPaR7Hls0pFAJ3eiWx 3IW76/ul87BmKgVqIVcDJejeBE6iOi1hc/HXkWElkRrmEZ+rfzRKrnZHrhN38Y5+0dBY u/VILLybs1/D99h8+pRxNr71YzyfoNViuc4l7aTXKVx0/8gQmSy6KFHlWheMbSVPes6k 6WwA== X-Gm-Message-State: AOJu0Yw1seGW6n6RFanuFBTVCujEumDcWt1Rsx2QeXpJeBPy///HyKdh aA7fs/2XLO4qYwybN7dYo+GOLoNGcUm4SWsAeQQW0772F99OCBaDEiPa4CrMsiEY+qNsTa7VLZe oFBnKOEMixBFNeN481L88K79N3Bpa2IlK5A== X-Gm-Gg: AeBDieuZajQPSKIK9kkeMV457pSjnYeOxORg99Bu4gVVbpu7tS16ktaQbei88p/JPzQ +5sjdsaPwH1MsOoVmWlNo0bd6Bpj6Zzpvvlv8rh+IwGns2oQJTayKV+AecoFRTUd4waa00ePcnv 2qhpfXMuWe70KTN8KbK9tHAiZNP+KUyOizRZnEcHR0JfHTKQNwnAl2gkPRb7XlvKa6vHxbjyfHz qMgaSvIKTvof5bgOO8ANLfkWBR0RWEppTZLSiWXJGVEqhc/FsYmMCSXDBaHo4jdrJ74zeeuxXI2 xDoS7pFjaO/A6lsCzHSEudWX198QiglfwaMl7iOxeUh0PhGyldE= X-Received: by 2002:a05:6820:2916:b0:696:1cbd:27b2 with SMTP id 006d021491bc7-6961cbe0282mr9766964eaf.29.1777275054906; Mon, 27 Apr 2026 00:30:54 -0700 (PDT) MIME-Version: 1.0 From: Bharath Rupireddy Date: Mon, 27 Apr 2026 00:30:00 -0700 X-Gm-Features: AVHnY4Kl0_Ngc3z501VY3wBdlnEsi_06LpWD8LOFaOz8oFfmfe_mlfWWTVzw0ao Message-ID: Subject: Add tests for concurrent DML retry paths in logical replication apply To: PostgreSQL Hackers Content-Type: multipart/mixed; boundary="00000000000051339d06506c18c3" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000051339d06506c18c3 Content-Type: multipart/alternative; boundary="00000000000051339c06506c18c1" --00000000000051339c06506c18c1 Content-Type: text/plain; charset="UTF-8" Hi hackers, While reading the logical replication apply code in execReplication.c, I noticed that the retry paths in RelationFindReplTupleByIndex and RelationFindReplTupleSeq for concurrent updates and deletes have no test coverage [1]. Specifically, when the same tuple is being updated/deleted on the publisher and subscriber at the same time, the dirty snapshot finds the tuple being modified by another transaction, the apply worker waits and retries the index/sequential scan. The attached patch adds an injection point before table_tuple_lock and a TAP test exercising these retry paths, hitting both TM_Updated and TM_Deleted. While working on this, I also noticed minor issues in the conflict handling code: 1/ In RelationFindReplTupleByIndex, ExecMaterializeSlot was called before checking should_refetch_tuple. If the tuple needs to be refetched due to a concurrent modification, this materialization is wasted work. Moved it after the retry check, so it only runs when we've successfully locked the tuple. 2/ In RelationFindReplTupleSeq, ExecCopySlot and a separate TupleTableSlot allocation were unnecessary. Made this function consistent with RelationFindReplTupleByIndex by using outslot directly while scanning the heap, avoiding the extra TTS allocation and copy overhead. I'm aware that these are not major performance issues in practice, but it keeps the two functions consistent and avoids unnecessary TTS materialize and copy costs. I also think that we could deduplicate these two functions since the code looks mostly the same, but that would be an overkill IMHO. Please find the attached patch. Appreciate any feedback. Thank you! [1] https://coverage.postgresql.org/src/backend/executor/execReplication.c.gcov.html -- Bharath Rupireddy Amazon Web Services: https://aws.amazon.com --00000000000051339c06506c18c1 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi hackers,

While reading the= logical replication apply code in execReplication.c, I noticed that the re= try paths in RelationFindReplTupleByIndex and RelationFindReplTupleSeq for = concurrent updates and deletes have no test coverage [1]. Specifically, whe= n the same tuple is being updated/deleted on the publisher and subscriber a= t the same time, the dirty snapshot finds the tuple being modified by anoth= er transaction, the apply worker waits and retries the index/sequential sca= n.

The attached patch adds an injection point before table_tuple_loc= k and a TAP test exercising these retry paths, hitting both TM_Updated and = TM_Deleted.

While working on this, I also noticed minor issues in th= e conflict handling code:

1/ In RelationFindReplTupleByIndex, ExecMa= terializeSlot was called before checking should_refetch_tuple. If the tuple= needs to be refetched due to a concurrent modification, this materializati= on is wasted work. Moved it after the retry check, so it only runs when we&= #39;ve successfully locked the tuple.

2/ In RelationFindReplTupleSeq= , ExecCopySlot and a separate TupleTableSlot allocation were unnecessary. M= ade this function consistent with RelationFindReplTupleByIndex by using out= slot directly while scanning the heap, avoiding the extra TTS allocation an= d copy overhead.

I'm aware that these are not major performance = issues in practice, but it keeps the two functions consistent and avoids un= necessary TTS materialize and copy costs.

I also think that we could= deduplicate these two functions since the code looks mostly the same, but = that would be an overkill IMHO.

Please find the attached patch. Appr= eciate any feedback. Thank you!

[1] https://coverage.postgresql.org/src/backend/executor/execReplication.c.= gcov.html

--
B= harath Rupireddy
Amazon Web S= ervices:=C2=A0https://aws.amazon.com
--00000000000051339c06506c18c1-- --00000000000051339d06506c18c3 Content-Type: application/x-patch; name="v1-0001-Add-tests-for-concurrent-DML-retry-paths-in-logic.patch" Content-Disposition: attachment; filename="v1-0001-Add-tests-for-concurrent-DML-retry-paths-in-logic.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mo92wtdf0 RnJvbSBiY2YzY2I3N2JkMWVlOTIzZjEyOGJjNDYwN2I2NmE2Mjg3NzYyNzQzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBCaGFyYXRoIFJ1cGlyZWRkeSA8YmhhcmF0aC5ydXBpcmVkZHlm b3Jwb3N0Z3Jlc0BnbWFpbC5jb20+CkRhdGU6IFR1ZSwgMjEgQXByIDIwMjYgMjA6MjQ6MDIgKzAw MDAKU3ViamVjdDogW1BBVENIIHYxXSBBZGQgdGVzdHMgZm9yIGNvbmN1cnJlbnQgRE1MIHJldHJ5 IHBhdGhzIGluIGxvZ2ljYWwKIHJlcGxpY2F0aW9uIGFwcGx5LgoKVGhlIHJldHJ5IHBhdGhzIGlu IFJlbGF0aW9uRmluZFJlcGxUdXBsZUJ5SW5kZXggYW5kClJlbGF0aW9uRmluZFJlcGxUdXBsZVNl cSBmb3IgY29uY3VycmVudCB1cGRhdGVzIGFuZCBkZWxldGVzIGhhZCBubwp0ZXN0IGNvdmVyYWdl LiBXaGVuIGEgdHVwbGUgaXMgY29uY3VycmVudGx5IG1vZGlmaWVkIG9uIHRoZQpzdWJzY3JpYmVy IHdoaWxlIHRoZSBhcHBseSB3b3JrZXIgaXMgdHJ5aW5nIHRvIGxvY2sgaXQsCnRhYmxlX3R1cGxl X2xvY2sgcmV0dXJucyBUTV9VcGRhdGVkIG9yIFRNX0RlbGV0ZWQsIGFuZCB0aGUgd29ya2VyCnJl dHJpZXMgdGhlIHNjYW4uCgpUaGlzIGNvbW1pdCBhZGRzIGFuIGluamVjdGlvbiBwb2ludCBhbmQg YSBUQVAgdGVzdCB0aGF0IGV4ZXJjaXNlcwp0aGVzZSByZXRyeSBwYXRocyBmb3IgYm90aCBpbmRl eCBzY2FuIGFuZCBzZXF1ZW50aWFsIHNjYW4uCgpXaGlsZSBoZXJlLCBmaXggbWlub3IgaW5lZmZp Y2llbmN5IGluIHRoZSByZXRyeSBoYW5kbGluZy4gSW4KUmVsYXRpb25GaW5kUmVwbFR1cGxlQnlJ bmRleCwgYXZvaWQgY2FsbGluZyBFeGVjTWF0ZXJpYWxpemVTbG90CmJlZm9yZSB0aGUgcmV0cnkg Y2hlY2suIEluIFJlbGF0aW9uRmluZFJlcGxUdXBsZVNlcSwgcmVtb3ZlIHRoZQp1bm5lY2Vzc2Fy eSBzZXBhcmF0ZSBUdXBsZVRhYmxlU2xvdCBhbGxvY2F0aW9uIGFuZCBFeGVjQ29weVNsb3QKY2Fs bCBieSB1c2luZyBvdXRzbG90IGRpcmVjdGx5IGZvciBzY2FubmluZywga2VlcGluZyBpdApjb25z aXN0ZW50IHdpdGggUmVsYXRpb25GaW5kUmVwbFR1cGxlQnlJbmRleC4KLS0tCiBzcmMvYmFja2Vu ZC9leGVjdXRvci9leGVjUmVwbGljYXRpb24uYyAgICAgICAgfCAgMjUgKy0tCiBzcmMvdGVzdC9z dWJzY3JpcHRpb24vbWVzb24uYnVpbGQgICAgICAgICAgICAgfCAgIDEgKwogLi4uL3QvMDM5X2Nv bmN1cnJlbnRfZG1sX3JldHJ5LnBsICAgICAgICAgICAgIHwgMTUyICsrKysrKysrKysrKysrKysr KwogMyBmaWxlcyBjaGFuZ2VkLCAxNjggaW5zZXJ0aW9ucygrKSwgMTAgZGVsZXRpb25zKC0pCiBj cmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3Qvc3Vic2NyaXB0aW9uL3QvMDM5X2NvbmN1cnJlbnRf ZG1sX3JldHJ5LnBsCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhlY1JlcGxp Y2F0aW9uLmMgYi9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjUmVwbGljYXRpb24uYwppbmRleCBi MmNhNWNiZjExNy4uMGQyMTllMzVkYWEgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9y L2V4ZWNSZXBsaWNhdGlvbi5jCisrKyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNSZXBsaWNh dGlvbi5jCkBAIC0zNyw2ICszNyw4IEBACiAjaW5jbHVkZSAidXRpbHMvc3lzY2FjaGUuaCIKICNp bmNsdWRlICJ1dGlscy90eXBjYWNoZS5oIgogCisjaW5jbHVkZSAidXRpbHMvaW5qZWN0aW9uX3Bv aW50LmgiCisKIAogc3RhdGljIGJvb2wgdHVwbGVzX2VxdWFsKFR1cGxlVGFibGVTbG90ICpzbG90 MSwgVHVwbGVUYWJsZVNsb3QgKnNsb3QyLAogCQkJCQkJIFR5cGVDYWNoZUVudHJ5ICoqZXEsIEJp dG1hcHNldCAqY29sdW1ucyk7CkBAIC0yMjksOCArMjMxLDYgQEAgcmV0cnk6CiAJCQkJY29udGlu dWU7CiAJCX0KIAotCQlFeGVjTWF0ZXJpYWxpemVTbG90KG91dHNsb3QpOwotCiAJCXh3YWl0ID0g VHJhbnNhY3Rpb25JZElzVmFsaWQoc25hcC54bWluKSA/CiAJCQlzbmFwLnhtaW4gOiBzbmFwLnht YXg7CiAKQEAgLTI1NSw2ICsyNTUsOCBAQCByZXRyeToKIAkJVE1fRmFpbHVyZURhdGEgdG1mZDsK IAkJVE1fUmVzdWx0CXJlczsKIAorCQlJTkpFQ1RJT05fUE9JTlQoImZpbmQtcmVwbC10dXBsZS1i ZWZvcmUtbG9jayIsIE5VTEwpOworCiAJCVB1c2hBY3RpdmVTbmFwc2hvdChHZXRMYXRlc3RTbmFw c2hvdCgpKTsKIAogCQlyZXMgPSB0YWJsZV90dXBsZV9sb2NrKHJlbCwgJihvdXRzbG90LT50dHNf dGlkKSwgR2V0QWN0aXZlU25hcHNob3QoKSwKQEAgLTI2OSw2ICsyNzEsOSBAQCByZXRyeToKIAog CQlpZiAoc2hvdWxkX3JlZmV0Y2hfdHVwbGUocmVzLCAmdG1mZCkpCiAJCQlnb3RvIHJldHJ5Owor CisJCS8qIE1hdGVyaWFsaXplIHRoZSBzbG90IHNvIGl0IHByZXNlcnZlcyBwYXNzLWJ5LXJlZiB2 YWx1ZXMuICovCisJCUV4ZWNNYXRlcmlhbGl6ZVNsb3Qob3V0c2xvdCk7CiAJfQogCiAJaW5kZXhf ZW5kc2NhbihzY2FuKTsKQEAgLTM3MCw3ICszNzUsNiBAQCBib29sCiBSZWxhdGlvbkZpbmRSZXBs VHVwbGVTZXEoUmVsYXRpb24gcmVsLCBMb2NrVHVwbGVNb2RlIGxvY2ttb2RlLAogCQkJCQkJIFR1 cGxlVGFibGVTbG90ICpzZWFyY2hzbG90LCBUdXBsZVRhYmxlU2xvdCAqb3V0c2xvdCkKIHsKLQlU dXBsZVRhYmxlU2xvdCAqc2NhbnNsb3Q7CiAJVGFibGVTY2FuRGVzYyBzY2FuOwogCVNuYXBzaG90 RGF0YSBzbmFwOwogCVR5cGVDYWNoZUVudHJ5ICoqZXE7CkBAIC0zODYsNyArMzkwLDYgQEAgUmVs YXRpb25GaW5kUmVwbFR1cGxlU2VxKFJlbGF0aW9uIHJlbCwgTG9ja1R1cGxlTW9kZSBsb2NrbW9k ZSwKIAlJbml0RGlydHlTbmFwc2hvdChzbmFwKTsKIAlzY2FuID0gdGFibGVfYmVnaW5zY2FuKHJl bCwgJnNuYXAsIDAsIE5VTEwsCiAJCQkJCQkgICBTT19OT05FKTsKLQlzY2Fuc2xvdCA9IHRhYmxl X3Nsb3RfY3JlYXRlKHJlbCwgTlVMTCk7CiAKIHJldHJ5OgogCWZvdW5kID0gZmFsc2U7CkBAIC0z OTQsMTQgKzM5NywxMSBAQCByZXRyeToKIAl0YWJsZV9yZXNjYW4oc2NhbiwgTlVMTCk7CiAKIAkv KiBUcnkgdG8gZmluZCB0aGUgdHVwbGUgKi8KLQl3aGlsZSAodGFibGVfc2Nhbl9nZXRuZXh0c2xv dChzY2FuLCBGb3J3YXJkU2NhbkRpcmVjdGlvbiwgc2NhbnNsb3QpKQorCXdoaWxlICh0YWJsZV9z Y2FuX2dldG5leHRzbG90KHNjYW4sIEZvcndhcmRTY2FuRGlyZWN0aW9uLCBvdXRzbG90KSkKIAl7 Ci0JCWlmICghdHVwbGVzX2VxdWFsKHNjYW5zbG90LCBzZWFyY2hzbG90LCBlcSwgTlVMTCkpCisJ CWlmICghdHVwbGVzX2VxdWFsKG91dHNsb3QsIHNlYXJjaHNsb3QsIGVxLCBOVUxMKSkKIAkJCWNv bnRpbnVlOwogCi0JCWZvdW5kID0gdHJ1ZTsKLQkJRXhlY0NvcHlTbG90KG91dHNsb3QsIHNjYW5z bG90KTsKLQogCQl4d2FpdCA9IFRyYW5zYWN0aW9uSWRJc1ZhbGlkKHNuYXAueG1pbikgPwogCQkJ c25hcC54bWluIDogc25hcC54bWF4OwogCkBAIC00MTYsNiArNDE2LDcgQEAgcmV0cnk6CiAJCX0K IAogCQkvKiBGb3VuZCBvdXIgdHVwbGUgYW5kIGl0J3Mgbm90IGxvY2tlZCAqLworCQlmb3VuZCA9 IHRydWU7CiAJCWJyZWFrOwogCX0KIApAQCAtNDI1LDYgKzQyNiw4IEBAIHJldHJ5OgogCQlUTV9G YWlsdXJlRGF0YSB0bWZkOwogCQlUTV9SZXN1bHQJcmVzOwogCisJCUlOSkVDVElPTl9QT0lOVCgi ZmluZC1yZXBsLXR1cGxlLWJlZm9yZS1sb2NrIiwgTlVMTCk7CisKIAkJUHVzaEFjdGl2ZVNuYXBz aG90KEdldExhdGVzdFNuYXBzaG90KCkpOwogCiAJCXJlcyA9IHRhYmxlX3R1cGxlX2xvY2socmVs LCAmKG91dHNsb3QtPnR0c190aWQpLCBHZXRBY3RpdmVTbmFwc2hvdCgpLApAQCAtNDM5LDEwICs0 NDIsMTIgQEAgcmV0cnk6CiAKIAkJaWYgKHNob3VsZF9yZWZldGNoX3R1cGxlKHJlcywgJnRtZmQp KQogCQkJZ290byByZXRyeTsKKworCQkvKiBNYXRlcmlhbGl6ZSB0aGUgc2xvdCBzbyBpdCBwcmVz ZXJ2ZXMgcGFzcy1ieS1yZWYgdmFsdWVzLiAqLworCQlFeGVjTWF0ZXJpYWxpemVTbG90KG91dHNs b3QpOwogCX0KIAogCXRhYmxlX2VuZHNjYW4oc2Nhbik7Ci0JRXhlY0Ryb3BTaW5nbGVUdXBsZVRh YmxlU2xvdChzY2Fuc2xvdCk7CiAKIAlyZXR1cm4gZm91bmQ7CiB9CmRpZmYgLS1naXQgYS9zcmMv dGVzdC9zdWJzY3JpcHRpb24vbWVzb24uYnVpbGQgYi9zcmMvdGVzdC9zdWJzY3JpcHRpb24vbWVz b24uYnVpbGQKaW5kZXggZTcxZTk1YzYyOTcuLjVkZjdmMTQzNzIxIDEwMDY0NAotLS0gYS9zcmMv dGVzdC9zdWJzY3JpcHRpb24vbWVzb24uYnVpbGQKKysrIGIvc3JjL3Rlc3Qvc3Vic2NyaXB0aW9u L21lc29uLmJ1aWxkCkBAIC00OCw2ICs0OCw3IEBAIHRlc3RzICs9IHsKICAgICAgICd0LzAzNl9z ZXF1ZW5jZXMucGwnLAogICAgICAgJ3QvMDM3X2V4Y2VwdC5wbCcsCiAgICAgICAndC8wMzhfd2Fs c25kX3NodXRkb3duX3RpbWVvdXQucGwnLAorICAgICAgJ3QvMDM5X2NvbmN1cnJlbnRfZG1sX3Jl dHJ5LnBsJywKICAgICAgICd0LzEwMF9idWdzLnBsJywKICAgICBdLAogICB9LApkaWZmIC0tZ2l0 IGEvc3JjL3Rlc3Qvc3Vic2NyaXB0aW9uL3QvMDM5X2NvbmN1cnJlbnRfZG1sX3JldHJ5LnBsIGIv c3JjL3Rlc3Qvc3Vic2NyaXB0aW9uL3QvMDM5X2NvbmN1cnJlbnRfZG1sX3JldHJ5LnBsCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4wNzRhZWFmYmNjNAotLS0gL2Rldi9u dWxsCisrKyBiL3NyYy90ZXN0L3N1YnNjcmlwdGlvbi90LzAzOV9jb25jdXJyZW50X2RtbF9yZXRy eS5wbApAQCAtMCwwICsxLDE1MiBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMjUtMjAyNiwgUG9zdGdy ZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKKworIyBUZXN0IGNvbmN1cnJlbnQgdXBkYXRl L2RlbGV0ZSByZXRyeSBwYXRocyBpbiBsb2dpY2FsIHJlcGxpY2F0aW9uIGFwcGx5LgorIworIyBV c2VzIGluamVjdGlvbiBwb2ludHMgdG8gcGF1c2UgdGhlIGFwcGx5IHdvcmtlciBhZnRlciBmaW5k aW5nIGEgdHVwbGUgYnV0CisjIGJlZm9yZSBsb2NraW5nIGl0LCBhbGxvd2luZyBhIGNvbmN1cnJl bnQgc2Vzc2lvbiB0byBtb2RpZnkgb3IgZGVsZXRlIHRoZQorIyBzYW1lIHJvdy4KK3VzZSBzdHJp Y3Q7Cit1c2Ugd2FybmluZ3MgRkFUQUwgPT4gJ2FsbCc7Cit1c2UgUG9zdGdyZVNRTDo6VGVzdDo6 Q2x1c3RlcjsKK3VzZSBQb3N0Z3JlU1FMOjpUZXN0OjpVdGlsczsKK3VzZSBUZXN0OjpNb3JlOwor CisjIENoZWNrIGlmIGluamVjdGlvbiBwb2ludHMgYXJlIGF2YWlsYWJsZS4KK215ICRub2RlX3B1 Ymxpc2hlciA9IFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXItPm5ldygncHVibGlzaGVyJyk7Cisk bm9kZV9wdWJsaXNoZXItPmluaXQoYWxsb3dzX3N0cmVhbWluZyA9PiAnbG9naWNhbCcpOworJG5v ZGVfcHVibGlzaGVyLT5zdGFydDsKKworaWYgKCRub2RlX3B1Ymxpc2hlci0+Y2hlY2tfZXh0ZW5z aW9uKCdpbmplY3Rpb25fcG9pbnRzJykgPT0gMCkKK3sKKwkkbm9kZV9wdWJsaXNoZXItPnN0b3A7 CisJcGxhbiBza2lwX2FsbCA9PiAnaW5qZWN0aW9uX3BvaW50cyBub3Qgc3VwcG9ydGVkJzsKK30K KworIyBTdWJzY3JpYmVyIG5lZWRzIGluamVjdGlvbl9wb2ludHMgbG9hZGVkLgorbXkgJG5vZGVf c3Vic2NyaWJlciA9IFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXItPm5ldygnc3Vic2NyaWJlcicp OworJG5vZGVfc3Vic2NyaWJlci0+aW5pdChhbGxvd3Nfc3RyZWFtaW5nID0+ICdsb2dpY2FsJyk7 Ciskbm9kZV9zdWJzY3JpYmVyLT5hcHBlbmRfY29uZigncG9zdGdyZXNxbC5jb25mJywKKwkic2hh cmVkX3ByZWxvYWRfbGlicmFyaWVzID0gJ2luamVjdGlvbl9wb2ludHMnIik7Ciskbm9kZV9zdWJz Y3JpYmVyLT5zdGFydDsKKworIyBDcmVhdGUgdGFibGVzIG9uIGJvdGggcHVibGlzaGVyIGFuZCBz dWJzY3JpYmVyLCBhbmQgc2V0IHVwIHJlcGxpY2F0aW9uLgorJG5vZGVfcHVibGlzaGVyLT5zYWZl X3BzcWwoJ3Bvc3RncmVzJywgcXEoCisJQ1JFQVRFIFRBQkxFIHRlc3RfdGFiIChhIGludCBQUklN QVJZIEtFWSwgYiBpbnQpOworCUNSRUFURSBUQUJMRSB0ZXN0X3RhYl9mdWxsIChhIGludCwgYiBp bnQpOworCUFMVEVSIFRBQkxFIHRlc3RfdGFiX2Z1bGwgUkVQTElDQSBJREVOVElUWSBGVUxMOwor KSk7CisKKyRub2RlX3N1YnNjcmliZXItPnNhZmVfcHNxbCgncG9zdGdyZXMnLCBxcSgKKwlDUkVB VEUgVEFCTEUgdGVzdF90YWIgKGEgaW50IFBSSU1BUlkgS0VZLCBiIGludCk7CisJQ1JFQVRFIFRB QkxFIHRlc3RfdGFiX2Z1bGwgKGEgaW50LCBiIGludCk7CisJQUxURVIgVEFCTEUgdGVzdF90YWJf ZnVsbCBSRVBMSUNBIElERU5USVRZIEZVTEw7CisJQ1JFQVRFIEVYVEVOU0lPTiBpbmplY3Rpb25f cG9pbnRzOworKSk7CisKK215ICRwdWJsaXNoZXJfY29ubnN0ciA9ICRub2RlX3B1Ymxpc2hlci0+ Y29ubnN0ciAuICcgZGJuYW1lPXBvc3RncmVzJzsKKyRub2RlX3B1Ymxpc2hlci0+c2FmZV9wc3Fs KCdwb3N0Z3JlcycsCisJIkNSRUFURSBQVUJMSUNBVElPTiB0ZXN0X3B1YiBGT1IgVEFCTEUgdGVz dF90YWIsIHRlc3RfdGFiX2Z1bGw7Iik7CisKK215ICRhcHBuYW1lID0gJ3Rlc3Rfc3ViJzsKKyRu b2RlX3N1YnNjcmliZXItPnNhZmVfcHNxbCgncG9zdGdyZXMnLAorCSJDUkVBVEUgU1VCU0NSSVBU SU9OIHRlc3Rfc3ViCisJIENPTk5FQ1RJT04gJyRwdWJsaXNoZXJfY29ubnN0ciBhcHBsaWNhdGlv bl9uYW1lPSRhcHBuYW1lJworCSBQVUJMSUNBVElPTiB0ZXN0X3B1YjsiKTsKKworJG5vZGVfc3Vi c2NyaWJlci0+d2FpdF9mb3Jfc3Vic2NyaXB0aW9uX3N5bmMoJG5vZGVfcHVibGlzaGVyLCAkYXBw bmFtZSk7CisKKyMgUHJlLWluc2VydCBhbGwgdGVzdCBkYXRhIGluIGEgc2luZ2xlIGJhdGNoIHRv IGF2b2lkIG11bHRpcGxlCisjIHdhaXRfZm9yX2NhdGNodXAgcm91bmQgdHJpcHMuCiskbm9kZV9w dWJsaXNoZXItPnNhZmVfcHNxbCgncG9zdGdyZXMnLCBxcSgKKwlJTlNFUlQgSU5UTyB0ZXN0X3Rh YiBWQUxVRVMgKDEsIDEwKSwgKDIsIDMwKTsKKwlJTlNFUlQgSU5UTyB0ZXN0X3RhYl9mdWxsIFZB TFVFUyAoMSwgMTAwKSwgKDIsIDMwMCk7CispKTsKKyRub2RlX3B1Ymxpc2hlci0+d2FpdF9mb3Jf Y2F0Y2h1cCgkYXBwbmFtZSk7CisKKyMgSGVscGVyIHRvIHJ1biBhIHNpbmdsZSBjb25jdXJyZW50 IERNTCByZXRyeSB0ZXN0IHVzaW5nIGluamVjdGlvbiBwb2ludHMuCitzdWIgdGVzdF9jb25jdXJy ZW50X3JldHJ5Cit7CisJbXkgKCVhcmdzKSA9IEBfOworCW15ICR0ZXN0X25hbWUgICAgPSAkYXJn c3tuYW1lfTsKKwlteSAkcHViX2RtbCAgICAgID0gJGFyZ3N7cHViX2RtbH07CisJbXkgJHN1Yl9k bWwgICAgICA9ICRhcmdze3N1Yl9kbWx9OworCW15ICRleHBlY3RlZF9sb2cgID0gJGFyZ3N7ZXhw ZWN0ZWRfbG9nfTsKKwlteSAkdmVyaWZ5X3F1ZXJ5ID0gJGFyZ3N7dmVyaWZ5X3F1ZXJ5fTsKKwlt eSAkdmVyaWZ5X3Jlc3VsdCA9ICRhcmdze3ZlcmlmeV9yZXN1bHR9OworCisJIyBBdHRhY2ggaW5q ZWN0aW9uIHBvaW50LgorCSRub2RlX3N1YnNjcmliZXItPnNhZmVfcHNxbCgncG9zdGdyZXMnLAor CQkiU0VMRUNUIGluamVjdGlvbl9wb2ludHNfYXR0YWNoKCdmaW5kLXJlcGwtdHVwbGUtYmVmb3Jl LWxvY2snLCAnd2FpdCcpOyIpOworCisJIyBQdWJsaXNoIHRoZSBETUwgdGhhdCB3aWxsIHRyaWdn ZXIgdGhlIGFwcGx5IHdvcmtlciB0byBmaW5kICsgbG9jay4KKwkkbm9kZV9wdWJsaXNoZXItPnNh ZmVfcHNxbCgncG9zdGdyZXMnLCAkcHViX2RtbCk7CisKKwkjIFdhaXQgZm9yIHRoZSBhcHBseSB3 b3JrZXIgdG8gaGl0IHRoZSBpbmplY3Rpb24gcG9pbnQuCisJJG5vZGVfc3Vic2NyaWJlci0+d2Fp dF9mb3JfZXZlbnQoJ2xvZ2ljYWwgcmVwbGljYXRpb24gYXBwbHkgd29ya2VyJywKKwkJJ2ZpbmQt cmVwbC10dXBsZS1iZWZvcmUtbG9jaycpOworCisJIyBFeGVjdXRlIGNvbmN1cnJlbnQgRE1MIG9u IHN1YnNjcmliZXIgd2hpbGUgYXBwbHkgd29ya2VyIGlzIHBhdXNlZC4KKwkkbm9kZV9zdWJzY3Jp YmVyLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgJHN1Yl9kbWwpOworCisJbXkgJGxvZ19vZmZzZXQg PSAtcyAkbm9kZV9zdWJzY3JpYmVyLT5sb2dmaWxlOworCisJIyBEZXRhY2ggZmlyc3Qgc28gdGhl IHJldHJ5IGxvb3AgZG9lc24ndCBoaXQgdGhlIGluamVjdGlvbiBwb2ludCBhZ2FpbiwKKwkjIHRo ZW4gd2FrZSB1cCB0aGUgYXBwbHkgd29ya2VyLgorCSRub2RlX3N1YnNjcmliZXItPnNhZmVfcHNx bCgncG9zdGdyZXMnLAorCQkiU0VMRUNUIGluamVjdGlvbl9wb2ludHNfZGV0YWNoKCdmaW5kLXJl cGwtdHVwbGUtYmVmb3JlLWxvY2snKTsKKwkJIFNFTEVDVCBpbmplY3Rpb25fcG9pbnRzX3dha2V1 cCgnZmluZC1yZXBsLXR1cGxlLWJlZm9yZS1sb2NrJyk7Iik7CisKKwkjIENvbmZpcm0gdGhlIGV4 cGVjdGVkIGxvZyBtZXNzYWdlLgorCSRub2RlX3N1YnNjcmliZXItPndhaXRfZm9yX2xvZygkZXhw ZWN0ZWRfbG9nLCAkbG9nX29mZnNldCk7CisJcGFzcygiJHRlc3RfbmFtZTogY29uY3VycmVudCBt b2RpZmljYXRpb24gZGV0ZWN0ZWQgYW5kIHJldHJpZWQiKTsKKworCSMgV2FpdCBmb3IgYXBwbHkg dG8gZmluaXNoIGFuZCB2ZXJpZnkgcmVzdWx0LgorCSRub2RlX3B1Ymxpc2hlci0+d2FpdF9mb3Jf Y2F0Y2h1cCgkYXBwbmFtZSk7CisKKwlteSAkcmVzdWx0ID0gJG5vZGVfc3Vic2NyaWJlci0+c2Fm ZV9wc3FsKCdwb3N0Z3JlcycsICR2ZXJpZnlfcXVlcnkpOworCWlzKCRyZXN1bHQsICR2ZXJpZnlf cmVzdWx0LCAiJHRlc3RfbmFtZTogZGF0YSBjb3JyZWN0IGFmdGVyIHJldHJ5Iik7Cit9CisKKyMg VE1fVXBkYXRlZCB2aWEgaW5kZXggc2NhbiAoUEspOiBjb25jdXJyZW50IHVwZGF0ZSBvbiBzdWJz Y3JpYmVyLgordGVzdF9jb25jdXJyZW50X3JldHJ5KAorCW5hbWUgICAgICAgICA9PiAnaW5kZXgg c2NhbiBUTV9VcGRhdGVkJywKKwlwdWJfZG1sICAgICAgPT4gIlVQREFURSB0ZXN0X3RhYiBTRVQg YiA9IDIwIFdIRVJFIGEgPSAxOyIsCisJc3ViX2RtbCAgICAgID0+ICJVUERBVEUgdGVzdF90YWIg U0VUIGIgPSA5OSBXSEVSRSBhID0gMTsiLAorCWV4cGVjdGVkX2xvZyA9PiBxci9jb25jdXJyZW50 IHVwZGF0ZSwgcmV0cnlpbmcvLAorCXZlcmlmeV9xdWVyeSA9PiAiU0VMRUNUIGIgRlJPTSB0ZXN0 X3RhYiBXSEVSRSBhID0gMTsiLAorCXZlcmlmeV9yZXN1bHQgPT4gJzIwJywKKyk7CisKKyMgVE1f RGVsZXRlZCB2aWEgaW5kZXggc2NhbiAoUEspOiBjb25jdXJyZW50IGRlbGV0ZSBvbiBzdWJzY3Jp YmVyLgordGVzdF9jb25jdXJyZW50X3JldHJ5KAorCW5hbWUgICAgICAgICA9PiAnaW5kZXggc2Nh biBUTV9EZWxldGVkJywKKwlwdWJfZG1sICAgICAgPT4gIlVQREFURSB0ZXN0X3RhYiBTRVQgYiA9 IDQwIFdIRVJFIGEgPSAyOyIsCisJc3ViX2RtbCAgICAgID0+ICJERUxFVEUgRlJPTSB0ZXN0X3Rh YiBXSEVSRSBhID0gMjsiLAorCWV4cGVjdGVkX2xvZyA9PiBxci9jb25jdXJyZW50IGRlbGV0ZSwg cmV0cnlpbmcvLAorCXZlcmlmeV9xdWVyeSA9PiAiU0VMRUNUIGNvdW50KCopIEZST00gdGVzdF90 YWIgV0hFUkUgYSA9IDI7IiwKKwl2ZXJpZnlfcmVzdWx0ID0+ICcwJywKKyk7CisKKyMgVE1fVXBk YXRlZCB2aWEgc2VxIHNjYW4gKFJFUExJQ0EgSURFTlRJVFkgRlVMTCk6IGNvbmN1cnJlbnQgdXBk YXRlIG9uCisjIHN1YnNjcmliZXIuCit0ZXN0X2NvbmN1cnJlbnRfcmV0cnkoCisJbmFtZSAgICAg ICAgID0+ICdzZXEgc2NhbiBUTV9VcGRhdGVkJywKKwlwdWJfZG1sICAgICAgPT4gIlVQREFURSB0 ZXN0X3RhYl9mdWxsIFNFVCBiID0gMjAwIFdIRVJFIGEgPSAxOyIsCisJc3ViX2RtbCAgICAgID0+ ICJVUERBVEUgdGVzdF90YWJfZnVsbCBTRVQgYiA9IDk5OSBXSEVSRSBhID0gMTsiLAorCWV4cGVj dGVkX2xvZyA9PiBxci9jb25jdXJyZW50IHVwZGF0ZSwgcmV0cnlpbmcvLAorCXZlcmlmeV9xdWVy eSA9PiAiU0VMRUNUIGIgRlJPTSB0ZXN0X3RhYl9mdWxsIFdIRVJFIGEgPSAxOyIsCisJdmVyaWZ5 X3Jlc3VsdCA9PiAnOTk5JywKKyk7CisKKyMgVE1fRGVsZXRlZCB2aWEgc2VxIHNjYW4gKFJFUExJ Q0EgSURFTlRJVFkgRlVMTCk6IGNvbmN1cnJlbnQgZGVsZXRlIG9uCisjIHN1YnNjcmliZXIuCit0 ZXN0X2NvbmN1cnJlbnRfcmV0cnkoCisJbmFtZSAgICAgICAgID0+ICdzZXEgc2NhbiBUTV9EZWxl dGVkJywKKwlwdWJfZG1sICAgICAgPT4gIlVQREFURSB0ZXN0X3RhYl9mdWxsIFNFVCBiID0gNDAw IFdIRVJFIGEgPSAyOyIsCisJc3ViX2RtbCAgICAgID0+ICJERUxFVEUgRlJPTSB0ZXN0X3RhYl9m dWxsIFdIRVJFIGEgPSAyOyIsCisJZXhwZWN0ZWRfbG9nID0+IHFyL2NvbmN1cnJlbnQgZGVsZXRl LCByZXRyeWluZy8sCisJdmVyaWZ5X3F1ZXJ5ID0+ICJTRUxFQ1QgY291bnQoKikgRlJPTSB0ZXN0 X3RhYl9mdWxsIFdIRVJFIGEgPSAyOyIsCisJdmVyaWZ5X3Jlc3VsdCA9PiAnMCcsCispOworCitk b25lX3Rlc3RpbmcoKTsKLS0gCjIuNDcuMwoK --00000000000051339d06506c18c3--