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 1sdqY2-001W55-L4 for pgsql-hackers@arkaria.postgresql.org; Tue, 13 Aug 2024 12:22:46 +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 1sdqY1-003lAN-0Z for pgsql-hackers@arkaria.postgresql.org; Tue, 13 Aug 2024 12:22:45 +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 1sdqY0-003l9v-KJ for pgsql-hackers@lists.postgresql.org; Tue, 13 Aug 2024 12:22:44 +0000 Received: from mail-pj1-x1030.google.com ([2607:f8b0:4864:20::1030]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1sdqXy-004eIL-A5 for pgsql-hackers@lists.postgresql.org; Tue, 13 Aug 2024 12:22:43 +0000 Received: by mail-pj1-x1030.google.com with SMTP id 98e67ed59e1d1-2d37e5b7b02so1206076a91.1 for ; Tue, 13 Aug 2024 05:22:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1723551760; x=1724156560; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=mo3VpjP0+EjFxgY/GuuZG6T8FRpCiy/0QK3TqmSHQWw=; b=dVTGKkMxtH8XXxDIHCLIaqf/KVs78rnusVi4G8ur5j7laZOcl4CLgUSBLFAaAnUBxj WuZeroVQ5x70/7x6dwJ+ESvGGSaj0kGuGR0GPKWs5i2LhXVLTtVqQ0v9/3oacW87GlwE lJpz5boMd/UwnCIfuFvkgccG4I4ikjDHqzu0MUvxt+HbontSJDipWCxjneTrWhVDZ52D EfUP1WV8d3flLhnwRp6CH0RWowBMNZnAnDZCa6OM0dPWaBWndBOYtmr+aJvkP0Bb5uFv wVtBqz0HMEeV6jeSnobGXu+P4T5igthILE1ESwLMKOYgCEFhOEIFXZxoz5S6rQPKSkEn q31w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723551760; x=1724156560; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=mo3VpjP0+EjFxgY/GuuZG6T8FRpCiy/0QK3TqmSHQWw=; b=vvH4zmxIHWK4c+99bqzwMZt9s//QkaS8OB+3hJgZC294URray6esjtzFSAc25tYNdC Y2K9JNn3wGxf4JkJ2BA9bhMWYr64EcgbwN1WueQ/Tc6+bgG8q1CULlHOMtb2UvYvIGow S/1cfKeIaX88swdGnfNBG2Z2uLSFweZ8NBghx8zmdPhk5o59ox0dVVgbtOU/fMEa8/1t 7RNpxnBcmVkzMGgwgy2LcpetiRNlVenxvkGjltEfikpLbL07tqIB74Odyb0X6KU7+lq/ x7qbAMspevQudIRpEraMHqF+6syBnEjTe0QrdwF3AtNWV3rtib4v6Ka+JzYQdHiB85HV 1G6w== X-Gm-Message-State: AOJu0YydQ6pCbtrbvJkNxRxXuaade1w2TIRlff5LLukHbT0AXjUZf+lr EYrfEOaSiXEjuCheBlmdqXmDGsNsf/1gfICeAYpjGzbYmJSp/t3QAB+MXVIlIf0FnRMZflWFv2h DaP58gm7y7xmty10UA6lIr+wwW6og8Z+A X-Google-Smtp-Source: AGHT+IEAu1vr4i3A9TaKbXHf/+3n2XwpUS5K9eHjMCNtU4GsqN/8Nhtz9UnE0CpZ+xRxH0e+icHYg58KCLWhiXJxAO0= X-Received: by 2002:a17:90a:6b0f:b0:2c9:5fae:4f7e with SMTP id 98e67ed59e1d1-2d3924f72bcmr3598159a91.16.1723551759672; Tue, 13 Aug 2024 05:22:39 -0700 (PDT) MIME-Version: 1.0 From: Nazir Bilal Yavuz Date: Tue, 13 Aug 2024 15:22:27 +0300 Message-ID: Subject: Use read streams in pg_visibility To: PostgreSQL Hackers Content-Type: multipart/mixed; boundary="0000000000006349ea061f8faaab" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000006349ea061f8faaab Content-Type: text/plain; charset="UTF-8" Hi, I am working on using the read stream in pg_visibility. There are two places to use it: 1- collect_visibility_data() This one is straightforward. I created a read stream object if 'include_pd' is true because read I/O is done when 'include_pd' is true. There is ~4% timing improvement with this change. I started the server with the default settings and created a 6 GB table. Then run 100 times pg_visibility() by clearing the OS cache between each run. ---------- 2- collect_corrupt_items() This one is more complicated. The read stream callback function loops until it finds a suitable block to read. So, if the callback returns an InvalidBlockNumber; it means that the stream processed all possible blocks and the stream should be finished. There is ~3% timing improvement with this change. I started the server with the default settings and created a 6 GB table. Then run 100 times pg_check_visible() by clearing the OS cache between each run. The downside of this approach is there are too many "vmbuffer is valid but BufferGetBlockNumber(*vmbuffer) is not equal to mapBlock, so vmbuffer needs to be read again" cases in the read stream version (700 vs 20 for the 6 GB table). This is caused by the callback function of the read stream reading a new vmbuf while getting next block numbers. So, vmbuf is wrong when we are checking visibility map bits that might have changed while we were acquiring the page lock. ---------- Both patches are attached. Any feedback would be appreciated. -- Regards, Nazir Bilal Yavuz Microsoft --0000000000006349ea061f8faaab Content-Type: text/x-patch; charset="US-ASCII"; name="v1-0001-Use-read-stream-in-pg_visibility-in-collect_visib.patch" Content-Disposition: attachment; filename="v1-0001-Use-read-stream-in-pg_visibility-in-collect_visib.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lzsdze1x0 RnJvbSBjMTc4ZTAxMDc1OWYwNDJkYzA4OWZkNGM1YjIyODNhMDRiOTVmMDE3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBOYXppciBCaWxhbCBZYXZ1eiA8YnlhdnV6ODFAZ21haWwuY29t PgpEYXRlOiBGcmksIDkgQXVnIDIwMjQgMTE6NDE6NTIgKzAzMDAKU3ViamVjdDogW1BBVENIIHYx IDEvMl0gVXNlIHJlYWQgc3RyZWFtIGluIHBnX3Zpc2liaWxpdHkgaW4KIGNvbGxlY3RfdmlzaWJp bGl0eV9kYXRhKCkKCkluc3RlYWQgb2YgcmVhZGluZyBibG9ja3Mgd2l0aCBSZWFkQnVmZmVyRXh0 ZW5kZWQoKSBpbgpjb2xsZWN0X3Zpc2liaWxpdHlfZGF0YSgpLCB1c2UgcmVhZCBzdHJlYW0uCgpU aGlzIGNoYW5nZSBwcm92aWRlcyBhYm91dCA0JSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudC4KLS0t CiBjb250cmliL3BnX3Zpc2liaWxpdHkvcGdfdmlzaWJpbGl0eS5jIHwgNTMgKysrKysrKysrKysr KysrKysrKysrKysrKystCiAxIGZpbGUgY2hhbmdlZCwgNTEgaW5zZXJ0aW9ucygrKSwgMiBkZWxl dGlvbnMoLSkKCmRpZmYgLS1naXQgYS9jb250cmliL3BnX3Zpc2liaWxpdHkvcGdfdmlzaWJpbGl0 eS5jIGIvY29udHJpYi9wZ192aXNpYmlsaXR5L3BnX3Zpc2liaWxpdHkuYwppbmRleCAxYTFhNGZm N2JlNy4uMTBmOTYxYzU4ZjAgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvcGdfdmlzaWJpbGl0eS9wZ192 aXNpYmlsaXR5LmMKKysrIGIvY29udHJpYi9wZ192aXNpYmlsaXR5L3BnX3Zpc2liaWxpdHkuYwpA QCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgInN0b3JhZ2UvYnVmbWdyLmgiCiAjaW5jbHVkZSAi c3RvcmFnZS9wcm9jLmgiCiAjaW5jbHVkZSAic3RvcmFnZS9wcm9jYXJyYXkuaCIKKyNpbmNsdWRl ICJzdG9yYWdlL3JlYWRfc3RyZWFtLmgiCiAjaW5jbHVkZSAic3RvcmFnZS9zbWdyLmgiCiAjaW5j bHVkZSAidXRpbHMvcmVsLmgiCiAjaW5jbHVkZSAidXRpbHMvc25hcG1nci5oIgpAQCAtNDEsNiAr NDIsMTYgQEAgdHlwZWRlZiBzdHJ1Y3QgY29ycnVwdF9pdGVtcwogCUl0ZW1Qb2ludGVyIHRpZHM7 CiB9IGNvcnJ1cHRfaXRlbXM7CiAKKy8qCisgKiBIZWxwZXIgc3RydWN0IGZvciByZWFkIHN0cmVh bSBvYmplY3QgdXNlZCBpbgorICogY29sbGVjdF92aXNpYmlsaXR5X2RhdGEoKSBmdW5jdGlvbi4K KyAqLworc3RydWN0IGNvbGxlY3RfdmlzaWJpbGl0eV9kYXRhX3JlYWRfc3RyZWFtX3ByaXZhdGUK K3sKKwlCbG9ja051bWJlciBibG9ja251bTsKKwlCbG9ja051bWJlciBuYmxvY2tzOworfTsKKwog UEdfRlVOQ1RJT05fSU5GT19WMShwZ192aXNpYmlsaXR5X21hcCk7CiBQR19GVU5DVElPTl9JTkZP X1YxKHBnX3Zpc2liaWxpdHlfbWFwX3JlbCk7CiBQR19GVU5DVElPTl9JTkZPX1YxKHBnX3Zpc2li aWxpdHkpOwpAQCAtNDYzLDYgKzQ3NCwyMyBAQCBwZ192aXNpYmlsaXR5X3R1cGRlc2MoYm9vbCBp bmNsdWRlX2Jsa25vLCBib29sIGluY2x1ZGVfcGQpCiAJcmV0dXJuIEJsZXNzVHVwbGVEZXNjKHR1 cGRlc2MpOwogfQogCisvKgorICogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gZ2V0IG5leHQgYmxvY2sg Zm9yIHJlYWQgc3RyZWFtIG9iamVjdCB1c2VkIGluCisgKiBjb2xsZWN0X3Zpc2liaWxpdHlfZGF0 YSgpIGZ1bmN0aW9uLgorICovCitzdGF0aWMgQmxvY2tOdW1iZXIKK2NvbGxlY3RfdmlzaWJpbGl0 eV9kYXRhX3JlYWRfc3RyZWFtX25leHRfYmxvY2soUmVhZFN0cmVhbSAqc3RyZWFtLAorCQkJCQkJ CQkJCQkgICB2b2lkICpjYWxsYmFja19wcml2YXRlX2RhdGEsCisJCQkJCQkJCQkJCSAgIHZvaWQg KnBlcl9idWZmZXJfZGF0YSkKK3sKKwlzdHJ1Y3QgY29sbGVjdF92aXNpYmlsaXR5X2RhdGFfcmVh ZF9zdHJlYW1fcHJpdmF0ZSAqcCA9IGNhbGxiYWNrX3ByaXZhdGVfZGF0YTsKKworCWlmIChwLT5i bG9ja251bSA8IHAtPm5ibG9ja3MpCisJCXJldHVybiBwLT5ibG9ja251bSsrOworCisJcmV0dXJu IEludmFsaWRCbG9ja051bWJlcjsKK30KKwogLyoKICAqIENvbGxlY3QgdmlzaWJpbGl0eSBkYXRh IGFib3V0IGEgcmVsYXRpb24uCiAgKgpAQCAtNDc4LDYgKzUwNiw4IEBAIGNvbGxlY3RfdmlzaWJp bGl0eV9kYXRhKE9pZCByZWxpZCwgYm9vbCBpbmNsdWRlX3BkKQogCUJsb2NrTnVtYmVyIGJsa25v OwogCUJ1ZmZlcgkJdm1idWZmZXIgPSBJbnZhbGlkQnVmZmVyOwogCUJ1ZmZlckFjY2Vzc1N0cmF0 ZWd5IGJzdHJhdGVneSA9IEdldEFjY2Vzc1N0cmF0ZWd5KEJBU19CVUxLUkVBRCk7CisJc3RydWN0 IGNvbGxlY3RfdmlzaWJpbGl0eV9kYXRhX3JlYWRfc3RyZWFtX3ByaXZhdGUgcDsKKwlSZWFkU3Ry ZWFtICpzdHJlYW0gPSBOVUxMOwogCiAJcmVsID0gcmVsYXRpb25fb3BlbihyZWxpZCwgQWNjZXNz U2hhcmVMb2NrKTsKIApAQCAtNDg5LDYgKzUxOSwyMCBAQCBjb2xsZWN0X3Zpc2liaWxpdHlfZGF0 YShPaWQgcmVsaWQsIGJvb2wgaW5jbHVkZV9wZCkKIAlpbmZvLT5uZXh0ID0gMDsKIAlpbmZvLT5j b3VudCA9IG5ibG9ja3M7CiAKKwkvKiBDcmF0ZSBhIHJlYWQgc3RyZWFtIGlmIHJlYWQgd2lsbCBi ZSBkb25lLiAqLworCWlmIChpbmNsdWRlX3BkKQorCXsKKwkJcC5ibG9ja251bSA9IDA7CisJCXAu bmJsb2NrcyA9IG5ibG9ja3M7CisJCXN0cmVhbSA9IHJlYWRfc3RyZWFtX2JlZ2luX3JlbGF0aW9u KFJFQURfU1RSRUFNX0ZVTEwsCisJCQkJCQkJCQkJCWJzdHJhdGVneSwKKwkJCQkJCQkJCQkJcmVs LAorCQkJCQkJCQkJCQlNQUlOX0ZPUktOVU0sCisJCQkJCQkJCQkJCWNvbGxlY3RfdmlzaWJpbGl0 eV9kYXRhX3JlYWRfc3RyZWFtX25leHRfYmxvY2ssCisJCQkJCQkJCQkJCSZwLAorCQkJCQkJCQkJ CQkwKTsKKwl9CisKIAlmb3IgKGJsa25vID0gMDsgYmxrbm8gPCBuYmxvY2tzOyArK2Jsa25vKQog CXsKIAkJaW50MzIJCW1hcGJpdHM7CkBAIC01MTMsOCArNTU3LDcgQEAgY29sbGVjdF92aXNpYmls aXR5X2RhdGEoT2lkIHJlbGlkLCBib29sIGluY2x1ZGVfcGQpCiAJCQlCdWZmZXIJCWJ1ZmZlcjsK IAkJCVBhZ2UJCXBhZ2U7CiAKLQkJCWJ1ZmZlciA9IFJlYWRCdWZmZXJFeHRlbmRlZChyZWwsIE1B SU5fRk9SS05VTSwgYmxrbm8sIFJCTV9OT1JNQUwsCi0JCQkJCQkJCQkJYnN0cmF0ZWd5KTsKKwkJ CWJ1ZmZlciA9IHJlYWRfc3RyZWFtX25leHRfYnVmZmVyKHN0cmVhbSwgTlVMTCk7CiAJCQlMb2Nr QnVmZmVyKGJ1ZmZlciwgQlVGRkVSX0xPQ0tfU0hBUkUpOwogCiAJCQlwYWdlID0gQnVmZmVyR2V0 UGFnZShidWZmZXIpOwpAQCAtNTI1LDYgKzU2OCwxMiBAQCBjb2xsZWN0X3Zpc2liaWxpdHlfZGF0 YShPaWQgcmVsaWQsIGJvb2wgaW5jbHVkZV9wZCkKIAkJfQogCX0KIAorCWlmIChpbmNsdWRlX3Bk ICYmIHN0cmVhbSkKKwl7CisJCUFzc2VydChyZWFkX3N0cmVhbV9uZXh0X2J1ZmZlcihzdHJlYW0s IE5VTEwpID09IEludmFsaWRCdWZmZXIpOworCQlyZWFkX3N0cmVhbV9lbmQoc3RyZWFtKTsKKwl9 CisKIAkvKiBDbGVhbiB1cC4gKi8KIAlpZiAodm1idWZmZXIgIT0gSW52YWxpZEJ1ZmZlcikKIAkJ UmVsZWFzZUJ1ZmZlcih2bWJ1ZmZlcik7Ci0tIAoyLjQ1LjIKCg== --0000000000006349ea061f8faaab Content-Type: text/x-patch; charset="US-ASCII"; name="v1-0002-Use-read-stream-in-pg_visibility-in-collect_corru.patch" Content-Disposition: attachment; filename="v1-0002-Use-read-stream-in-pg_visibility-in-collect_corru.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lzsdzgly1 RnJvbSA0NTZkMWRmNjQxZmQ2ZTgxNjU4ZmQ5Mjg4ZTFmODFiOWNlMDY4NzA4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBOYXppciBCaWxhbCBZYXZ1eiA8YnlhdnV6ODFAZ21haWwuY29t PgpEYXRlOiBUdWUsIDEzIEF1ZyAyMDI0IDEzOjAzOjM5ICswMzAwClN1YmplY3Q6IFtQQVRDSCB2 MSAyLzJdIFVzZSByZWFkIHN0cmVhbSBpbiBwZ192aXNpYmlsaXR5IGluCiBjb2xsZWN0X2NvcnJ1 cHRfaXRlbXMoKQoKSW5zdGVhZCBvZiByZWFkaW5nIGJsb2NrcyB3aXRoIFJlYWRCdWZmZXJFeHRl bmRlZCgpIGluCmNvbGxlY3RfY29ycnVwdF9pdGVtcygpLCB1c2UgcmVhZCBzdHJlYW0uCgpUaGlz IGNoYW5nZSBwcm92aWRlcyBhYm91dCAzJSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudC4KLS0tCiBj b250cmliL3BnX3Zpc2liaWxpdHkvcGdfdmlzaWJpbGl0eS5jIHwgOTMgKysrKysrKysrKysrKysr KysrKysrKystLS0tCiAxIGZpbGUgY2hhbmdlZCwgODEgaW5zZXJ0aW9ucygrKSwgMTIgZGVsZXRp b25zKC0pCgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wZ192aXNpYmlsaXR5L3BnX3Zpc2liaWxpdHku YyBiL2NvbnRyaWIvcGdfdmlzaWJpbGl0eS9wZ192aXNpYmlsaXR5LmMKaW5kZXggMTBmOTYxYzU4 ZjAuLjQ3MjllZTk1OTkxIDEwMDY0NAotLS0gYS9jb250cmliL3BnX3Zpc2liaWxpdHkvcGdfdmlz aWJpbGl0eS5jCisrKyBiL2NvbnRyaWIvcGdfdmlzaWJpbGl0eS9wZ192aXNpYmlsaXR5LmMKQEAg LTUyLDYgKzUyLDIwIEBAIHN0cnVjdCBjb2xsZWN0X3Zpc2liaWxpdHlfZGF0YV9yZWFkX3N0cmVh bV9wcml2YXRlCiAJQmxvY2tOdW1iZXIgbmJsb2NrczsKIH07CiAKKy8qCisgKiBIZWxwZXIgc3Ry dWN0IGZvciByZWFkIHN0cmVhbSBvYmplY3QgdXNlZCBpbgorICogY29sbGVjdF9jb3JydXB0X2l0 ZW1zKCkgZnVuY3Rpb24uCisgKi8KK3N0cnVjdCBjb2xsZWN0X2NvcnJ1cHRfaXRlbXNfcmVhZF9z dHJlYW1fcHJpdmF0ZQoreworCWJvb2wJCWFsbF9mcm96ZW47CisJYm9vbAkJYWxsX3Zpc2libGU7 CisJQmxvY2tOdW1iZXIgYmxvY2tudW07CisJQmxvY2tOdW1iZXIgbmJsb2NrczsKKwlSZWxhdGlv bglyZWw7CisJQnVmZmVyCSAgICp2bWJ1ZmZlcjsKK307CisKIFBHX0ZVTkNUSU9OX0lORk9fVjEo cGdfdmlzaWJpbGl0eV9tYXApOwogUEdfRlVOQ1RJT05fSU5GT19WMShwZ192aXNpYmlsaXR5X21h cF9yZWwpOwogUEdfRlVOQ1RJT05fSU5GT19WMShwZ192aXNpYmlsaXR5KTsKQEAgLTYzOSw2ICs2 NTMsMzUgQEAgR2V0U3RyaWN0T2xkZXN0Tm9uUmVtb3ZhYmxlVHJhbnNhY3Rpb25JZChSZWxhdGlv biByZWwpCiAJfQogfQogCisvKgorICogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gZ2V0IG5leHQgYmxv Y2sgZm9yIHJlYWQgc3RyZWFtIG9iamVjdCB1c2VkIGluCisgKiBjb2xsZWN0X2NvcnJ1cHRfaXRl bXMoKSBmdW5jdGlvbi4KKyAqLworc3RhdGljIEJsb2NrTnVtYmVyCitjb2xsZWN0X2NvcnJ1cHRf aXRlbXNfcmVhZF9zdHJlYW1fbmV4dF9ibG9jayhSZWFkU3RyZWFtICpzdHJlYW0sCisJCQkJCQkJ CQkJCSB2b2lkICpjYWxsYmFja19wcml2YXRlX2RhdGEsCisJCQkJCQkJCQkJCSB2b2lkICpwZXJf YnVmZmVyX2RhdGEpCit7CisJc3RydWN0IGNvbGxlY3RfY29ycnVwdF9pdGVtc19yZWFkX3N0cmVh bV9wcml2YXRlICpwID0gY2FsbGJhY2tfcHJpdmF0ZV9kYXRhOworCisJZm9yICg7IHAtPmJsb2Nr bnVtIDwgcC0+bmJsb2NrczsgcC0+YmxvY2tudW0rKykKKwl7CisJCWJvb2wJCWNoZWNrX2Zyb3pl biA9IGZhbHNlOworCQlib29sCQljaGVja192aXNpYmxlID0gZmFsc2U7CisKKwkJaWYgKHAtPmFs bF9mcm96ZW4gJiYgVk1fQUxMX0ZST1pFTihwLT5yZWwsIHAtPmJsb2NrbnVtLCBwLT52bWJ1ZmZl cikpCisJCQljaGVja19mcm96ZW4gPSB0cnVlOworCQlpZiAocC0+YWxsX3Zpc2libGUgJiYgVk1f QUxMX1ZJU0lCTEUocC0+cmVsLCBwLT5ibG9ja251bSwgcC0+dm1idWZmZXIpKQorCQkJY2hlY2tf dmlzaWJsZSA9IHRydWU7CisJCWlmICghY2hlY2tfdmlzaWJsZSAmJiAhY2hlY2tfZnJvemVuKQor CQkJY29udGludWU7CisKKwkJcmV0dXJuIHAtPmJsb2NrbnVtKys7CisJfQorCisJcmV0dXJuIElu dmFsaWRCbG9ja051bWJlcjsKK30KKwogLyoKICAqIFJldHVybnMgYSBsaXN0IG9mIGl0ZW1zIHdo b3NlIHZpc2liaWxpdHkgbWFwIGluZm9ybWF0aW9uIGRvZXMgbm90IG1hdGNoCiAgKiB0aGUgc3Rh dHVzIG9mIHRoZSB0dXBsZXMgb24gdGhlIHBhZ2UuCkBAIC02NjMsNiArNzA2LDEwIEBAIGNvbGxl Y3RfY29ycnVwdF9pdGVtcyhPaWQgcmVsaWQsIGJvb2wgYWxsX3Zpc2libGUsIGJvb2wgYWxsX2Zy b3plbikKIAlCdWZmZXIJCXZtYnVmZmVyID0gSW52YWxpZEJ1ZmZlcjsKIAlCdWZmZXJBY2Nlc3NT dHJhdGVneSBic3RyYXRlZ3kgPSBHZXRBY2Nlc3NTdHJhdGVneShCQVNfQlVMS1JFQUQpOwogCVRy YW5zYWN0aW9uSWQgT2xkZXN0WG1pbiA9IEludmFsaWRUcmFuc2FjdGlvbklkOworCXN0cnVjdCBj b2xsZWN0X2NvcnJ1cHRfaXRlbXNfcmVhZF9zdHJlYW1fcHJpdmF0ZSBwOworCVJlYWRTdHJlYW0g KnN0cmVhbTsKKworCUFzc2VydChhbGxfdmlzaWJsZSB8fCBhbGxfZnJvemVuKTsKIAogCXJlbCA9 IHJlbGF0aW9uX29wZW4ocmVsaWQsIEFjY2Vzc1NoYXJlTG9jayk7CiAKQEAgLTY4Nyw2ICs3MzQs MjAgQEAgY29sbGVjdF9jb3JydXB0X2l0ZW1zKE9pZCByZWxpZCwgYm9vbCBhbGxfdmlzaWJsZSwg Ym9vbCBhbGxfZnJvemVuKQogCWl0ZW1zLT5jb3VudCA9IDY0OwogCWl0ZW1zLT50aWRzID0gcGFs bG9jKGl0ZW1zLT5jb3VudCAqIHNpemVvZihJdGVtUG9pbnRlckRhdGEpKTsKIAorCXAuYmxvY2tu dW0gPSAwOworCXAubmJsb2NrcyA9IG5ibG9ja3M7CisJcC5yZWwgPSByZWw7CisJcC52bWJ1ZmZl ciA9ICZ2bWJ1ZmZlcjsKKwlwLmFsbF9mcm96ZW4gPSBhbGxfZnJvemVuOworCXAuYWxsX3Zpc2li bGUgPSBhbGxfdmlzaWJsZTsKKwlzdHJlYW0gPSByZWFkX3N0cmVhbV9iZWdpbl9yZWxhdGlvbihS RUFEX1NUUkVBTV9GVUxMLAorCQkJCQkJCQkJCWJzdHJhdGVneSwKKwkJCQkJCQkJCQlyZWwsCisJ CQkJCQkJCQkJTUFJTl9GT1JLTlVNLAorCQkJCQkJCQkJCWNvbGxlY3RfY29ycnVwdF9pdGVtc19y ZWFkX3N0cmVhbV9uZXh0X2Jsb2NrLAorCQkJCQkJCQkJCSZwLAorCQkJCQkJCQkJCTApOworCiAJ LyogTG9vcCBvdmVyIGV2ZXJ5IGJsb2NrIGluIHRoZSByZWxhdGlvbi4gKi8KIAlmb3IgKGJsa25v ID0gMDsgYmxrbm8gPCBuYmxvY2tzOyArK2Jsa25vKQogCXsKQEAgLTcwMCwxNyArNzYxLDIwIEBA IGNvbGxlY3RfY29ycnVwdF9pdGVtcyhPaWQgcmVsaWQsIGJvb2wgYWxsX3Zpc2libGUsIGJvb2wg YWxsX2Zyb3plbikKIAkJLyogTWFrZSBzdXJlIHdlIGFyZSBpbnRlcnJ1cHRpYmxlLiAqLwogCQlD SEVDS19GT1JfSU5URVJSVVBUUygpOwogCi0JCS8qIFVzZSB0aGUgdmlzaWJpbGl0eSBtYXAgdG8g ZGVjaWRlIHdoZXRoZXIgdG8gY2hlY2sgdGhpcyBwYWdlLiAqLwotCQlpZiAoYWxsX2Zyb3plbiAm JiBWTV9BTExfRlJPWkVOKHJlbCwgYmxrbm8sICZ2bWJ1ZmZlcikpCi0JCQljaGVja19mcm96ZW4g PSB0cnVlOwotCQlpZiAoYWxsX3Zpc2libGUgJiYgVk1fQUxMX1ZJU0lCTEUocmVsLCBibGtubywg JnZtYnVmZmVyKSkKLQkJCWNoZWNrX3Zpc2libGUgPSB0cnVlOwotCQlpZiAoIWNoZWNrX3Zpc2li bGUgJiYgIWNoZWNrX2Zyb3plbikKLQkJCWNvbnRpbnVlOwotCiAJCS8qIFJlYWQgYW5kIGxvY2sg dGhlIHBhZ2UuICovCi0JCWJ1ZmZlciA9IFJlYWRCdWZmZXJFeHRlbmRlZChyZWwsIE1BSU5fRk9S S05VTSwgYmxrbm8sIFJCTV9OT1JNQUwsCi0JCQkJCQkJCQlic3RyYXRlZ3kpOworCQlidWZmZXIg PSByZWFkX3N0cmVhbV9uZXh0X2J1ZmZlcihzdHJlYW0sIE5VTEwpOworCisJCS8qCisJCSAqIElm IHRoZSByZWFkIHN0cmVhbSByZXR1cm5zIGFuIEludmFsaWRCdWZmZXIsIHRoaXMgbWVhbnMgYWxs IHRoZQorCQkgKiBibG9ja3MgYXJlIHByb2Nlc3NlZC4gU28sIGVuZCB0aGUgc3RyZWFtIGFuZCBs b29wLgorCQkgKi8KKwkJaWYgKGJ1ZmZlciA9PSBJbnZhbGlkQnVmZmVyKQorCQl7CisJCQlyZWFk X3N0cmVhbV9lbmQoc3RyZWFtKTsKKwkJCXN0cmVhbSA9IE5VTEw7CisJCQlicmVhazsKKwkJfQor CiAJCUxvY2tCdWZmZXIoYnVmZmVyLCBCVUZGRVJfTE9DS19TSEFSRSk7CiAKIAkJcGFnZSA9IEJ1 ZmZlckdldFBhZ2UoYnVmZmVyKTsKQEAgLTcyMCw5ICs3ODQsOSBAQCBjb2xsZWN0X2NvcnJ1cHRf aXRlbXMoT2lkIHJlbGlkLCBib29sIGFsbF92aXNpYmxlLCBib29sIGFsbF9mcm96ZW4pCiAJCSAq IFRoZSB2aXNpYmlsaXR5IG1hcCBiaXRzIG1pZ2h0IGhhdmUgY2hhbmdlZCB3aGlsZSB3ZSB3ZXJl IGFjcXVpcmluZwogCQkgKiB0aGUgcGFnZSBsb2NrLiAgUmVjaGVjayB0byBhdm9pZCByZXR1cm5p bmcgc3B1cmlvdXMgcmVzdWx0cy4KIAkJICovCi0JCWlmIChjaGVja19mcm96ZW4gJiYgIVZNX0FM TF9GUk9aRU4ocmVsLCBibGtubywgJnZtYnVmZmVyKSkKKwkJaWYgKGFsbF9mcm96ZW4gJiYgIVZN X0FMTF9GUk9aRU4ocmVsLCBibGtubywgJnZtYnVmZmVyKSkKIAkJCWNoZWNrX2Zyb3plbiA9IGZh bHNlOwotCQlpZiAoY2hlY2tfdmlzaWJsZSAmJiAhVk1fQUxMX1ZJU0lCTEUocmVsLCBibGtubywg JnZtYnVmZmVyKSkKKwkJaWYgKGFsbF92aXNpYmxlICYmICFWTV9BTExfVklTSUJMRShyZWwsIGJs a25vLCAmdm1idWZmZXIpKQogCQkJY2hlY2tfdmlzaWJsZSA9IGZhbHNlOwogCQlpZiAoIWNoZWNr X3Zpc2libGUgJiYgIWNoZWNrX2Zyb3plbikKIAkJewpAQCAtODA3LDYgKzg3MSwxMSBAQCBjb2xs ZWN0X2NvcnJ1cHRfaXRlbXMoT2lkIHJlbGlkLCBib29sIGFsbF92aXNpYmxlLCBib29sIGFsbF9m cm96ZW4pCiAKIAkJVW5sb2NrUmVsZWFzZUJ1ZmZlcihidWZmZXIpOwogCX0KKwlpZiAoc3RyZWFt KQorCXsKKwkJQXNzZXJ0KHJlYWRfc3RyZWFtX25leHRfYnVmZmVyKHN0cmVhbSwgTlVMTCkgPT0g SW52YWxpZEJ1ZmZlcik7CisJCXJlYWRfc3RyZWFtX2VuZChzdHJlYW0pOworCX0KIAogCS8qIENs ZWFuIHVwLiAqLwogCWlmICh2bWJ1ZmZlciAhPSBJbnZhbGlkQnVmZmVyKQotLSAKMi40NS4yCgo= --0000000000006349ea061f8faaab--