Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kEGUh-0003mL-95 for pgsql-hackers@arkaria.postgresql.org; Fri, 04 Sep 2020 18:31:28 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1kEGUd-0007TR-GO for pgsql-hackers@arkaria.postgresql.org; Fri, 04 Sep 2020 18:31:23 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kEGUc-0007TJ-Nu for pgsql-hackers@lists.postgresql.org; Fri, 04 Sep 2020 18:31:23 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by makus.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1kEGUY-0006FH-6P for pgsql-hackers@postgresql.org; Fri, 04 Sep 2020 18:31:20 +0000 Received: from mail.postgrespro.ru (cyclops.postgrespro.ru [93.174.131.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) by mail.postgrespro.ru (Postfix) with ESMTPSA id 30CB721C2EDB; Fri, 4 Sep 2020 21:31:15 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mail; t=1599244275; bh=9fCqRm+ncuBGTX5jAtl01d5P+90dWYAiAefEoLkT9R4=; h=Date:From:To:Cc:Subject:In-Reply-To:References; b=YJiwiUzG5o+nPzvtvF/8XCS2wRelwey6gic8uneTZ3bbfG4eXDjM7GJQAqigo3eup NcUyTfYcxFxC+c9dslvcxa877VD/6ZovA8MgPwZ1qKnIL3kgU1VB/r1v03ATwj+dkn xo6NnUuz9vTGhj88szIfyvVYS/oUWzYbOOT8g4xY= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_74e1ed9ea16c674d3e63c2321babe178" Content-Transfer-Encoding: 7bit Date: Fri, 04 Sep 2020 21:31:14 +0300 From: Alexey Kondratov To: "Andrey V. Lepikhov" Cc: tsunakawa.takay@fujitsu.com, movead.li@highgo.ca, 'Amit Kapila' , Masahiko Sawada , Fujii Masao , PostgreSQL-Dev Subject: Re: Global snapshots In-Reply-To: <806c3708-26ea-b94d-87b1-d48e41e93726@postgrespro.ru> References: <07b2c899-4ed0-4c87-1327-23c750311248@postgrespro.ru> <4d13207c-43ba-1db3-1459-e7d4bc0e47ad@oss.nttdata.com> <9964cf46-9294-34b9-4858-971e9029f5c7@postgrespro.ru> <806c3708-26ea-b94d-87b1-d48e41e93726@postgrespro.ru> User-Agent: Roundcube Webmail/1.4.0 Message-ID: <3ef7877bfed0582019eab3d462a43275@postgrespro.ru> X-Sender: a.kondratov@postgrespro.ru List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --=_74e1ed9ea16c674d3e63c2321babe178 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed Hi, On 2020-07-27 09:44, Andrey V. Lepikhov wrote: > On 7/27/20 11:22 AM, tsunakawa.takay@fujitsu.com wrote: >> >> US8356007B2 - Distributed transaction management for database systems >> with multiversioning - Google Patents >> https://patents.google.com/patent/US8356007 >> >> >> If it is, can we circumvent this patent? >> > > Thank you for the research (and previous links too). > I haven't seen this patent before. This should be carefully studied. I had a look on the patch set, although it is quite outdated, especially on 0003. Two thoughts about 0003: First, IIUC atomicity of the distributed transaction in the postgres_fdw is achieved by the usage of 2PC. I think that this postgres_fdw 2PC support should be separated from global snapshots. It could be useful to have such atomic distributed transactions even without a proper visibility, which is guaranteed by the global snapshot. Especially taking into account the doubts about Clock-SI and general questions about algorithm choosing criteria above in the thread. Thus, I propose to split 0003 into two parts and add a separate GUC 'postgres_fdw.use_twophase', which could be turned on independently from 'postgres_fdw.use_global_snapshots'. Of course if the latter is enabled, then 2PC should be forcedly turned on as well. Second, there are some problems with errors handling in the 0003 (thanks to Arseny Sher for review). +error: + if (!res) + { + sql = psprintf("ABORT PREPARED '%s'", fdwTransState->gid); + BroadcastCmd(sql); + elog(ERROR, "Failed to PREPARE transaction on remote node"); + } It seems that we should never reach this point, just because BroadcastStmt will throw an ERROR if it fails to prepare transaction on the foreign server: + if (PQresultStatus(result) != expectedStatus || + (handler && !handler(result, arg))) + { + elog(WARNING, "Failed command %s: status=%d, expected status=%d", sql, PQresultStatus(result), expectedStatus); + pgfdw_report_error(ERROR, result, entry->conn, true, sql); + allOk = false; + } Moreover, It doesn't make much sense to try to abort prepared xacts, since if we failed to prepare it somewhere, then some foreign servers may become unavailable already and this doesn't provide us a 100% guarantee of clean up. + /* COMMIT open transaction of we were doing 2PC */ + if (fdwTransState->two_phase_commit && + (event == XACT_EVENT_PARALLEL_COMMIT || event == XACT_EVENT_COMMIT)) + { + BroadcastCmd(psprintf("COMMIT PREPARED '%s'", fdwTransState->gid)); + } At this point, the host (local) transaction is already committed and there is no way to abort it gracefully. However, BroadcastCmd may rise an ERROR that will cause a PANIC, since it is non-recoverable state: PANIC: cannot abort transaction 487, it was already committed Attached is a patch, which implements a plain 2PC in the postgres_fdw and adds a GUC 'postgres_fdw.use_twophase'. Also it solves these errors handling issues above and tries to add proper comments everywhere. I think, that 0003 should be rebased on the top of it, or it could be a first patch in the set, since it may be used independently. What do you think? Regards -- Alexey Kondratov Postgres Professional https://www.postgrespro.com Russian Postgres Company --=_74e1ed9ea16c674d3e63c2321babe178 Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=0001-Add-postgres_fdw.use_twophase-GUC-to-use-2PC.patch Content-Disposition: attachment; filename=0001-Add-postgres_fdw.use_twophase-GUC-to-use-2PC.patch; size=13153 RnJvbSBkZWJkZmZhZGU3YWJjZGJmMjkwMzFiZGE2YzgzNTlhODk3NzZhZDM2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4ZXkgS29uZHJhdG92IDxrb25kcmF0b3YuYWxla3NleUBn bWFpbC5jb20+CkRhdGU6IEZyaSwgNyBBdWcgMjAyMCAxNjo1MDo1NyArMDMwMApTdWJqZWN0OiBb UEFUQ0hdIEFkZCBwb3N0Z3Jlc19mZHcudXNlX3R3b3BoYXNlIEdVQyB0byB1c2UgMlBDIGZvciB0 cmFuc2FjdGlvbnMKIGludm9sdmluZyBzZXZlcmFsIHNlcnZlcnMuCgotLS0KIGNvbnRyaWIvcG9z dGdyZXNfZmR3L2Nvbm5lY3Rpb24uYyAgIHwgMjM0ICsrKysrKysrKysrKysrKysrKysrKysrKyst LS0KIGNvbnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5jIHwgIDE3ICsrCiBjb250cmli L3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuaCB8ICAgMiArCiAzIGZpbGVzIGNoYW5nZWQsIDIy OCBpbnNlcnRpb25zKCspLCAyNSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9jb250cmliL3Bv c3RncmVzX2Zkdy9jb25uZWN0aW9uLmMgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9jb25uZWN0aW9u LmMKaW5kZXggMDhkYWYyNmZkZjAuLmQxOGZkZDFmOTRlIDEwMDY0NAotLS0gYS9jb250cmliL3Bv c3RncmVzX2Zkdy9jb25uZWN0aW9uLmMKKysrIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvY29ubmVj dGlvbi5jCkBAIC02Niw2ICs2NiwyMCBAQCB0eXBlZGVmIHN0cnVjdCBDb25uQ2FjaGVFbnRyeQog ICovCiBzdGF0aWMgSFRBQiAqQ29ubmVjdGlvbkhhc2ggPSBOVUxMOwogCisvKgorICogRmR3VHJh bnNhY3Rpb25TdGF0ZQorICoKKyAqIEhvbGRzIG51bWJlciBvZiBvcGVuIHJlbW90ZSB0cmFuc2Fj dGlvbnMgYW5kIHNoYXJlZCBzdGF0ZQorICogbmVlZGVkIGZvciBhbGwgY29ubmVjdGlvbiBlbnRy aWVzLgorICovCit0eXBlZGVmIHN0cnVjdCBGZHdUcmFuc2FjdGlvblN0YXRlCit7CisJY2hhcgkg ICAqZ2lkOworCWludAkJCW5wYXJ0aWNpcGFudHM7CisJYm9vbAkJdHdvX3BoYXNlX2NvbW1pdDsK K30gRmR3VHJhbnNhY3Rpb25TdGF0ZTsKK3N0YXRpYyBGZHdUcmFuc2FjdGlvblN0YXRlICpmZHdU cmFuc1N0YXRlOworCiAvKiBmb3IgYXNzaWduaW5nIGN1cnNvciBudW1iZXJzIGFuZCBwcmVwYXJl ZCBzdGF0ZW1lbnQgbnVtYmVycyAqLwogc3RhdGljIHVuc2lnbmVkIGludCBjdXJzb3JfbnVtYmVy ID0gMDsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcHJlcF9zdG10X251bWJlciA9IDA7CkBAIC03Myw2 ICs4Nyw5IEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgcHJlcF9zdG10X251bWJlciA9IDA7CiAvKiB0 cmFja3Mgd2hldGhlciBhbnkgd29yayBpcyBuZWVkZWQgaW4gY2FsbGJhY2sgZnVuY3Rpb25zICov CiBzdGF0aWMgYm9vbCB4YWN0X2dvdF9jb25uZWN0aW9uID0gZmFsc2U7CiAKKy8qIGNvdW50ZXIg b2YgcHJlcGFyZWQgdHggbWFkZSBieSB0aGlzIGJhY2tlbmQgKi8KK3N0YXRpYyBpbnQgdHdvX3Bo YXNlX3hhY3RfY291bnQgPSAwOworCiAvKiBwcm90b3R5cGVzIG9mIHByaXZhdGUgZnVuY3Rpb25z ICovCiBzdGF0aWMgUEdjb25uICpjb25uZWN0X3BnX3NlcnZlcihGb3JlaWduU2VydmVyICpzZXJ2 ZXIsIFVzZXJNYXBwaW5nICp1c2VyKTsKIHN0YXRpYyB2b2lkIGRpc2Nvbm5lY3RfcGdfc2VydmVy KENvbm5DYWNoZUVudHJ5ICplbnRyeSk7CkBAIC04MSw2ICs5OCw3IEBAIHN0YXRpYyB2b2lkIGNv bmZpZ3VyZV9yZW1vdGVfc2Vzc2lvbihQR2Nvbm4gKmNvbm4pOwogc3RhdGljIHZvaWQgZG9fc3Fs X2NvbW1hbmQoUEdjb25uICpjb25uLCBjb25zdCBjaGFyICpzcWwpOwogc3RhdGljIHZvaWQgYmVn aW5fcmVtb3RlX3hhY3QoQ29ubkNhY2hlRW50cnkgKmVudHJ5KTsKIHN0YXRpYyB2b2lkIHBnZmR3 X3hhY3RfY2FsbGJhY2soWGFjdEV2ZW50IGV2ZW50LCB2b2lkICphcmcpOworc3RhdGljIHZvaWQg ZGVhbGxvY2F0ZV9wcmVwYXJlZF9zdG10cyhDb25uQ2FjaGVFbnRyeSAqZW50cnkpOwogc3RhdGlj IHZvaWQgcGdmZHdfc3VieGFjdF9jYWxsYmFjayhTdWJYYWN0RXZlbnQgZXZlbnQsCiAJCQkJCQkJ CSAgIFN1YlRyYW5zYWN0aW9uSWQgbXlTdWJpZCwKIAkJCQkJCQkJICAgU3ViVHJhbnNhY3Rpb25J ZCBwYXJlbnRTdWJpZCwKQEAgLTEzNyw2ICsxNTUsMTYgQEAgR2V0Q29ubmVjdGlvbihVc2VyTWFw cGluZyAqdXNlciwgYm9vbCB3aWxsX3ByZXBfc3RtdCkKIAkJCQkJCQkJCSAgcGdmZHdfaW52YWxf Y2FsbGJhY2ssIChEYXR1bSkgMCk7CiAJfQogCisJLyogQWxsb2NhdGUgRmR3VHJhbnNhY3Rpb25T dGF0ZSAqLworCWlmIChmZHdUcmFuc1N0YXRlID09IE5VTEwpCisJeworCQlNZW1vcnlDb250ZXh0 IG9sZGN4dDsKKwkJb2xkY3h0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKENhY2hlTWVtb3J5Q29u dGV4dCk7CisJCWZkd1RyYW5zU3RhdGUgPSBwYWxsb2MwKHNpemVvZihGZHdUcmFuc2FjdGlvblN0 YXRlKSk7CisJCWZkd1RyYW5zU3RhdGUtPm5wYXJ0aWNpcGFudHMgPSAwOworCQlNZW1vcnlDb250 ZXh0U3dpdGNoVG8ob2xkY3h0KTsKKwl9CisKIAkvKiBTZXQgZmxhZyB0aGF0IHdlIGRpZCBHZXRD b25uZWN0aW9uIGR1cmluZyB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiAqLwogCXhhY3RfZ290X2Nv bm5lY3Rpb24gPSB0cnVlOwogCkBAIC00NDgsNyArNDc2LDggQEAgY29uZmlndXJlX3JlbW90ZV9z ZXNzaW9uKFBHY29ubiAqY29ubikKIH0KIAogLyoKLSAqIENvbnZlbmllbmNlIHN1YnJvdXRpbmUg dG8gaXNzdWUgYSBub24tZGF0YS1yZXR1cm5pbmcgU1FMIGNvbW1hbmQgdG8gcmVtb3RlCisgKiBD b252ZW5pZW5jZSBzdWJyb3V0aW5lIHRvIGlzc3VlIGEgbm9uLWRhdGEtcmV0dXJuaW5nIFNRTCBj b21tYW5kIG9yCisgKiBzdGF0ZW1lbnQgdG8gcmVtb3RlIG5vZGUuCiAgKi8KIHN0YXRpYyB2b2lk CiBkb19zcWxfY29tbWFuZChQR2Nvbm4gKmNvbm4sIGNvbnN0IGNoYXIgKnNxbCkKQEAgLTQ5NCw2 ICs1MjMsOCBAQCBiZWdpbl9yZW1vdGVfeGFjdChDb25uQ2FjaGVFbnRyeSAqZW50cnkpCiAJCWRv X3NxbF9jb21tYW5kKGVudHJ5LT5jb25uLCBzcWwpOwogCQllbnRyeS0+eGFjdF9kZXB0aCA9IDE7 CiAJCWVudHJ5LT5jaGFuZ2luZ194YWN0X3N0YXRlID0gZmFsc2U7CisKKwkJZmR3VHJhbnNTdGF0 ZS0+bnBhcnRpY2lwYW50cyArPSAxOwogCX0KIAogCS8qCkBAIC03MDEsNiArNzMyLDc2IEBAIHBn ZmR3X3JlcG9ydF9lcnJvcihpbnQgZWxldmVsLCBQR3Jlc3VsdCAqcmVzLCBQR2Nvbm4gKmNvbm4s CiAJUEdfRU5EX1RSWSgpOwogfQogCisvKiBDYWxsYmFjayB0eXBlZGVmIGZvciBCcm9hZGNhc3RT dG10ICovCit0eXBlZGVmIGJvb2wgKCpCcm9hZGNhc3RDbWRSZXNIYW5kbGVyKSAoUEdyZXN1bHQg KnJlc3VsdCwgdm9pZCAqYXJnKTsKKworLyoKKyAqIEJyb2FkY2FzdCBzcWwgaW4gcGFyYWxsZWwg dG8gYWxsIENvbm5lY3Rpb25IYXNoIGVudHJpZXMuCisgKgorICogSW4gdGhlIGNhc2Ugb2YgZWxl dmVsIDwgRVJST1IgYW5kIGVycm9yIG9jY3VyZWQgb25seSBhIGVsZXZlbCBtZXNzYWdlCisgKiB3 aWxsIGJlIHJpc2VkIGFuZCAwIChmYWxzZSkgd2lsbCBiZSByZXR1cm5lZCBhcyBhIHJldHVybiBj b2RlLiAgVGhhdCB3YXksCisgKiBpdCB3aWxsIGJlIHVwIHRvIHRoZSBjYWxsZXIgdG8gaGFuZGxl IHRoaXMgc2l0dWF0aW9uIGdyYWNlZnVsbHkuCisgKi8KK3N0YXRpYyBib29sCitCcm9hZGNhc3RT dG10KGNoYXIgY29uc3QgKiBzcWwsIHVuc2lnbmVkIGV4cGVjdGVkU3RhdHVzLAorCQkJICBpbnQg ZWxldmVsLCBCcm9hZGNhc3RDbWRSZXNIYW5kbGVyIGhhbmRsZXIsCisJCQkgIHZvaWQgKmFyZykK K3sKKwlIQVNIX1NFUV9TVEFUVVMgc2NhbjsKKwlDb25uQ2FjaGVFbnRyeSAqZW50cnk7CisJYm9v bAkJYWxsT2sgPSB0cnVlOworCisJLyogQnJvYWRjYXN0IHNxbCAqLworCWhhc2hfc2VxX2luaXQo JnNjYW4sIENvbm5lY3Rpb25IYXNoKTsKKwl3aGlsZSAoKGVudHJ5ID0gKENvbm5DYWNoZUVudHJ5 ICopIGhhc2hfc2VxX3NlYXJjaCgmc2NhbikpKQorCXsKKwkJcGdmZHdfcmVqZWN0X2luY29tcGxl dGVfeGFjdF9zdGF0ZV9jaGFuZ2UoZW50cnkpOworCisJCWlmIChlbnRyeS0+eGFjdF9kZXB0aCA+ IDAgJiYgZW50cnktPmNvbm4gIT0gTlVMTCkKKwkJeworCQkJaWYgKCFQUXNlbmRRdWVyeShlbnRy eS0+Y29ubiwgc3FsKSkKKwkJCXsKKwkJCQlQR3Jlc3VsdCAgICpyZXMgPSBQUWdldFJlc3VsdChl bnRyeS0+Y29ubik7CisKKwkJCQllbG9nKGVsZXZlbCA8IEVSUk9SID8gZWxldmVsIDogV0FSTklO RywgImZhaWxlZCB0byBzZW5kIGNvbW1hbmQgJXMiLCBzcWwpOworCQkJCXBnZmR3X3JlcG9ydF9l cnJvcihlbGV2ZWwsIHJlcywgZW50cnktPmNvbm4sIHRydWUsIHNxbCk7CisJCQkJUFFjbGVhcihy ZXMpOworCQkJfQorCQl9CisJfQorCisJLyogQ29sbGVjdCByZXNwb25zZXMgKi8KKwloYXNoX3Nl cV9pbml0KCZzY2FuLCBDb25uZWN0aW9uSGFzaCk7CisJd2hpbGUgKChlbnRyeSA9IChDb25uQ2Fj aGVFbnRyeSAqKSBoYXNoX3NlcV9zZWFyY2goJnNjYW4pKSkKKwl7CisJCWlmIChlbnRyeS0+eGFj dF9kZXB0aCA+IDAgJiYgZW50cnktPmNvbm4gIT0gTlVMTCkKKwkJeworCQkJUEdyZXN1bHQgICAq cmVzdWx0ID0gUFFnZXRSZXN1bHQoZW50cnktPmNvbm4pOworCisJCQlpZiAoUFFyZXN1bHRTdGF0 dXMocmVzdWx0KSAhPSBleHBlY3RlZFN0YXR1cyB8fAorCQkJCShoYW5kbGVyICYmICFoYW5kbGVy KHJlc3VsdCwgYXJnKSkpCisJCQl7CisJCQkJZWxvZyhlbGV2ZWwgPCBFUlJPUiA/IGVsZXZlbCA6 IFdBUk5JTkcsCisJCQkJCSAiZmFpbGVkIGNvbW1hbmQgJXM6IHN0YXR1cz0lZCwgZXhwZWN0ZWQg c3RhdHVzPSVkIiwKKwkJCQkJIHNxbCwgUFFyZXN1bHRTdGF0dXMocmVzdWx0KSwgZXhwZWN0ZWRT dGF0dXMpOworCQkJCXBnZmR3X3JlcG9ydF9lcnJvcihlbGV2ZWwsIHJlc3VsdCwgZW50cnktPmNv bm4sIHRydWUsIHNxbCk7CisJCQkJYWxsT2sgPSBmYWxzZTsKKwkJCX0KKwkJCVBRY2xlYXIocmVz dWx0KTsKKwkJCVBRZ2V0UmVzdWx0KGVudHJ5LT5jb25uKTsJLyogY29uc3VtZSBOVUxMIHJlc3Vs dCAqLworCQl9CisJfQorCisJcmV0dXJuIGFsbE9rOworfQorCisvKiBXcmFwcGVyIGZvciBicm9h ZGNhc3RpbmcgY29tbWFuZHMgKi8KK3N0YXRpYyBib29sCitCcm9hZGNhc3RDbWQoY2hhciBjb25z dCAqc3FsLCBpbnQgZWxldmVsKQoreworCXJldHVybiBCcm9hZGNhc3RTdG10KHNxbCwgUEdSRVNf Q09NTUFORF9PSywgZWxldmVsLCBOVUxMLCBOVUxMKTsKK30KKwogLyoKICAqIHBnZmR3X3hhY3Rf Y2FsbGJhY2sgLS0tIGNsZWFudXAgYXQgbWFpbi10cmFuc2FjdGlvbiBlbmQuCiAgKi8KQEAgLTcx NCw2ICs4MTUsNzQgQEAgcGdmZHdfeGFjdF9jYWxsYmFjayhYYWN0RXZlbnQgZXZlbnQsIHZvaWQg KmFyZykKIAlpZiAoIXhhY3RfZ290X2Nvbm5lY3Rpb24pCiAJCXJldHVybjsKIAorCS8qCisJICog T24gUFJFX0NPTU1JVCBldmVudCB3ZSBzaG91bGQgZmlndXJlIG91dCB3aGV0aGVyIHRvIHVzZSAy UEMgb3Igbm90LgorCSAqIFRoaXMgZGVjaXNpb24gaXMgYmFzZWQgb24gdHdvIGZhY3RvcnM6CisJ ICogICAgIyBwb3N0Z3Jlc19mZHcudXNlX3R3b3BoYXNlIGlzIHR1cm5lZCBvbjsKKwkgKiAgICAj IG1vcmUgdGhhbiBvbmUgc2VydmVyIGhhdmUgcGFydGljaXBhdGVkIGluIHRoaXMgdHJhbnNhY3Rp b24uCisJICoKKwkgKiBJZiB3ZSBkZWNpZGUgdG8gdXNlIDJQQyBmb3IgdGhpcyB4YWN0LCB0aGVu IHdlIHNob3VsZCBicm9hZGNhc3QKKwkgKiBQUkVQQVJFIHRvIGFsbCBwYXJ0aWNpcGF0ZWQgZm9y ZWlnbiBzZXJ2ZXJzLgorCSAqLworCWlmIChldmVudCA9PSBYQUNUX0VWRU5UX1BBUkFMTEVMX1BS RV9DT01NSVQgfHwgZXZlbnQgPT0gWEFDVF9FVkVOVF9QUkVfQ09NTUlUKQorCXsKKwkJLyogU2hv dWxkIHdlIHRha2UgaW50byBhY2NvdW50IHRoaXMgbm9kZT8gKi8KKwkJaWYgKFRyYW5zYWN0aW9u SWRJc1ZhbGlkKEdldEN1cnJlbnRUcmFuc2FjdGlvbklkSWZBbnkoKSkpCisJCQlmZHdUcmFuc1N0 YXRlLT5ucGFydGljaXBhbnRzICs9IDE7CisKKwkJLyogU3dpdGNoIHRvIDJQQyBtb2RlIGlmIHRo ZXJlIHdlcmUgbW9yZSB0aGFuIG9uZSBwYXJ0aWNpcGFudCAqLworCQlpZiAoVXNlMlBDICYmIGZk d1RyYW5zU3RhdGUtPm5wYXJ0aWNpcGFudHMgPiAxKQorCQkJZmR3VHJhbnNTdGF0ZS0+dHdvX3Bo YXNlX2NvbW1pdCA9IHRydWU7CisKKwkJaWYgKGZkd1RyYW5zU3RhdGUtPnR3b19waGFzZV9jb21t aXQpCisJCXsKKwkJCWNoYXIgICAqc3FsOworCisJCQlmZHdUcmFuc1N0YXRlLT5naWQgPSBwc3By aW50ZigicGdmZHc6JWxsZDolbGx1OiVkOiV1OiVkOiVkIiwKKwkJCQkJCQkJCQkgIChsb25nIGxv bmcpIEdldEN1cnJlbnRUaW1lc3RhbXAoKSwKKwkJCQkJCQkJCQkgIChsb25nIGxvbmcpIEdldFN5 c3RlbUlkZW50aWZpZXIoKSwKKwkJCQkJCQkJCQkgIE15UHJvY1BpZCwKKwkJCQkJCQkJCQkgIEdl dEN1cnJlbnRUcmFuc2FjdGlvbklkSWZBbnkoKSwKKwkJCQkJCQkJCQkgICsrdHdvX3BoYXNlX3hh Y3RfY291bnQsCisJCQkJCQkJCQkJICBmZHdUcmFuc1N0YXRlLT5ucGFydGljaXBhbnRzKTsKKwor CQkJLyogQnJvYWRjYXN0IFBSRVBBUkUgKi8KKwkJCXNxbCA9IHBzcHJpbnRmKCJQUkVQQVJFIFRS QU5TQUNUSU9OICclcyciLCBmZHdUcmFuc1N0YXRlLT5naWQpOworCisJCQkvKgorCQkJICogSWYg d2UgZ290IGFueSBwcm9ibGVtLCB0aGVuIGl0IGRvZXMgbm90IG1ha2UgbXVjaCBzZW5jZSB0bwor CQkJICogYnJvYWRjYXN0IEFCT1JUIFBSRVBBUkVEIGluIG9yZGVyIHRvIGNsZWFuIHVwIHByZXBh cmVkIHhhY3RzCisJCQkgKiBldmVyeXdoZXJlLCBzaW5jZSB0aGlzIG1ldGhvZCBkb2VzIG5vdCBn dWFyYW50ZWUgYSAxMDAlCisJCQkgKiBzdWNjZXNzLiAgVGhpcyBpcyBhIHdvcmsgZm9yIGV4dGVy bmFsIHRvb2xzLiAgUmlzZSBhbiBFUlJPUgorCQkJICogaW1tZWRpYXRlbHkgaW4gdGhlIGNhc2Ug b2YgZmFpbHVyZSBkdXJpbmcgYnJvYWRjYXN0LgorCQkJICovCisJCQlCcm9hZGNhc3RDbWQoc3Fs LCBFUlJPUik7CisKKwkJCS8qCisJCQkgKiBEbyBub3QgZmFsbCBkb3duLiBDb25zZXF1ZW50IENP TU1JVCBldmVudCB3aWxsIGNsZWFuIHRoaW5ncyB1cC4KKwkJCSAqLworCQkJcmV0dXJuOworCQl9 CisJfQorCisJLyoKKwkgKiBDT01NSVQgZXZlbnQgb2NjdXJzIHdoZW4gdGhlIGxvY2FsIHRyYW5z YWN0aW9uIGlzIGZ1bGx5IGNvbW1pdHRlZC4KKwkgKiBUaGF0IHdheSwgd2UgaGF2ZSB0byBicm9h ZGNhc3QgQ09NTUlUIFBSRVBBUkVEIHRvIGFsbCBwYXJ0aWNpcGF0ZWQKKwkgKiBmb3JlaWduIHNl cnZlcnMgaW4gb3JkZXIgdG8gZmluYWxpemUgdGhpcyAnZGlzdHJpYnV0ZWQnIHRyYW5zYWN0aW9u LgorCSAqIEFjdHVhbGx5LCBpdCBpcyB0b28gbGF0ZSB0byBhYm9ydCB0aGUgaG9zdCB0cmFuc2Fj dGlvbiBpZiBhbnkgZXJyb3IKKwkgKiBvY2N1cnMgZHVyaW5nIENPTU1JVCBQUkVQQVJFRCBicm9h ZGNhc3Qgc3RhZ2UuCisJICovCisJaWYgKGZkd1RyYW5zU3RhdGUtPnR3b19waGFzZV9jb21taXQg JiYKKwkJKGV2ZW50ID09IFhBQ1RfRVZFTlRfUEFSQUxMRUxfQ09NTUlUIHx8IGV2ZW50ID09IFhB Q1RfRVZFTlRfQ09NTUlUKSkKKwl7CisJCWlmICghQnJvYWRjYXN0Q21kKHBzcHJpbnRmKCJDT01N SVQgUFJFUEFSRUQgJyVzJyIsIGZkd1RyYW5zU3RhdGUtPmdpZCksIFdBUk5JTkcpKQorCQkJZXJl cG9ydChXQVJOSU5HLAorCQkJCQkoZXJyY29kZShFUlJDT0RFX0NPTk5FQ1RJT05fRkFJTFVSRSks CisJCQkJCSBlcnJtc2coImNhbmNlbGluZyB0aGUgd2FpdCBmb3IgZm9yZWlnbiBzZXJ2ZXJzIHRv IGNvbW1pdCBwcmVwYXJlZCB0cmFuc2FjdGlvbiBkdWUgdG8gdGhlIGVycm9yIG9jY3VyZWQgb24g b25lIG9mIHRoZW0iKSwKKwkJCQkJIGVycmRldGFpbCgiVGhlIHRyYW5zYWN0aW9uIGhhcyBhbHJl YWR5IGNvbW1pdHRlZCBsb2NhbGx5LCBidXQgbWlnaHQgbm90IGhhdmUgYmVlbiBjb21taXR0ZWQg b24gYWxsIHBhcnRpY2lwYXRlZCBmb3JlaWduIHNlcnZlcnMuIiksCisJCQkJCSBlcnJoaW50KCJD b25zaWRlciBjb21taXR0aW5nIGl0IGV2ZXJ5d2hlcmUgbWFudWFsbHkgd2l0aCBDT01NSVQgUFJF UEFSRUQgJyVzJyIsIGZkd1RyYW5zU3RhdGUtPmdpZCkpKTsKKwl9CisKIAkvKgogCSAqIFNjYW4g YWxsIGNvbm5lY3Rpb24gY2FjaGUgZW50cmllcyB0byBmaW5kIG9wZW4gcmVtb3RlIHRyYW5zYWN0 aW9ucywgYW5kCiAJICogY2xvc2UgdGhlbS4KQEAgLTcyMSw4ICs4OTAsNiBAQCBwZ2Zkd194YWN0 X2NhbGxiYWNrKFhhY3RFdmVudCBldmVudCwgdm9pZCAqYXJnKQogCWhhc2hfc2VxX2luaXQoJnNj YW4sIENvbm5lY3Rpb25IYXNoKTsKIAl3aGlsZSAoKGVudHJ5ID0gKENvbm5DYWNoZUVudHJ5ICop IGhhc2hfc2VxX3NlYXJjaCgmc2NhbikpKQogCXsKLQkJUEdyZXN1bHQgICAqcmVzOwotCiAJCS8q IElnbm9yZSBjYWNoZSBlbnRyeSBpZiBubyBvcGVuIGNvbm5lY3Rpb24gcmlnaHQgbm93ICovCiAJ CWlmIChlbnRyeS0+Y29ubiA9PSBOVUxMKQogCQkJY29udGludWU7CkBAIC03MzksNiArOTA2LDcg QEAgcGdmZHdfeGFjdF9jYWxsYmFjayhYYWN0RXZlbnQgZXZlbnQsIHZvaWQgKmFyZykKIAkJCXsK IAkJCQljYXNlIFhBQ1RfRVZFTlRfUEFSQUxMRUxfUFJFX0NPTU1JVDoKIAkJCQljYXNlIFhBQ1Rf RVZFTlRfUFJFX0NPTU1JVDoKKwkJCQkJQXNzZXJ0KCFmZHdUcmFuc1N0YXRlLT50d29fcGhhc2Vf Y29tbWl0KTsKIAogCQkJCQkvKgogCQkJCQkgKiBJZiBhYm9ydCBjbGVhbnVwIHByZXZpb3VzbHkg ZmFpbGVkIGZvciB0aGlzIGNvbm5lY3Rpb24sCkBAIC03NTEsMjggKzkxOSw3IEBAIHBnZmR3X3hh Y3RfY2FsbGJhY2soWGFjdEV2ZW50IGV2ZW50LCB2b2lkICphcmcpCiAJCQkJCWRvX3NxbF9jb21t YW5kKGVudHJ5LT5jb25uLCAiQ09NTUlUIFRSQU5TQUNUSU9OIik7CiAJCQkJCWVudHJ5LT5jaGFu Z2luZ194YWN0X3N0YXRlID0gZmFsc2U7CiAKLQkJCQkJLyoKLQkJCQkJICogSWYgdGhlcmUgd2Vy ZSBhbnkgZXJyb3JzIGluIHN1YnRyYW5zYWN0aW9ucywgYW5kIHdlCi0JCQkJCSAqIG1hZGUgcHJl cGFyZWQgc3RhdGVtZW50cywgZG8gYSBERUFMTE9DQVRFIEFMTCB0byBtYWtlCi0JCQkJCSAqIHN1 cmUgd2UgZ2V0IHJpZCBvZiBhbGwgcHJlcGFyZWQgc3RhdGVtZW50cy4gVGhpcyBpcwotCQkJCQkg KiBhbm5veWluZyBhbmQgbm90IHRlcnJpYmx5IGJ1bGxldHByb29mLCBidXQgaXQncwotCQkJCQkg KiBwcm9iYWJseSBub3Qgd29ydGggdHJ5aW5nIGhhcmRlci4KLQkJCQkJICoKLQkJCQkJICogREVB TExPQ0FURSBBTEwgb25seSBleGlzdHMgaW4gOC4zIGFuZCBsYXRlciwgc28gdGhpcwotCQkJCQkg KiBjb25zdHJhaW5zIGhvdyBvbGQgYSBzZXJ2ZXIgcG9zdGdyZXNfZmR3IGNhbgotCQkJCQkgKiBj b21tdW5pY2F0ZSB3aXRoLiAgV2UgaW50ZW50aW9uYWxseSBpZ25vcmUgZXJyb3JzIGluCi0JCQkJ CSAqIHRoZSBERUFMTE9DQVRFLCBzbyB0aGF0IHdlIGNhbiBob2JibGUgYWxvbmcgdG8gc29tZQot CQkJCQkgKiBleHRlbnQgd2l0aCBvbGRlciBzZXJ2ZXJzIChsZWFraW5nIHByZXBhcmVkIHN0YXRl bWVudHMKLQkJCQkJICogYXMgd2UgZ287IGJ1dCB3ZSBkb24ndCByZWFsbHkgc3VwcG9ydCB1cGRh dGUgb3BlcmF0aW9ucwotCQkJCQkgKiBwcmUtOC4zIGFueXdheSkuCi0JCQkJCSAqLwotCQkJCQlp ZiAoZW50cnktPmhhdmVfcHJlcF9zdG10ICYmIGVudHJ5LT5oYXZlX2Vycm9yKQotCQkJCQl7Ci0J CQkJCQlyZXMgPSBQUWV4ZWMoZW50cnktPmNvbm4sICJERUFMTE9DQVRFIEFMTCIpOwotCQkJCQkJ UFFjbGVhcihyZXMpOwotCQkJCQl9Ci0JCQkJCWVudHJ5LT5oYXZlX3ByZXBfc3RtdCA9IGZhbHNl OwotCQkJCQllbnRyeS0+aGF2ZV9lcnJvciA9IGZhbHNlOworCQkJCQlkZWFsbG9jYXRlX3ByZXBh cmVkX3N0bXRzKGVudHJ5KTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBYQUNUX0VWRU5UX1BSRV9Q UkVQQVJFOgogCkBAIC03OTEsNiArOTM4LDExIEBAIHBnZmR3X3hhY3RfY2FsbGJhY2soWGFjdEV2 ZW50IGV2ZW50LCB2b2lkICphcmcpCiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgWEFDVF9FVkVOVF9Q QVJBTExFTF9DT01NSVQ6CiAJCQkJY2FzZSBYQUNUX0VWRU5UX0NPTU1JVDoKKwkJCQkJaWYgKGZk d1RyYW5zU3RhdGUtPnR3b19waGFzZV9jb21taXQpCisJCQkJCQlkZWFsbG9jYXRlX3ByZXBhcmVk X3N0bXRzKGVudHJ5KTsKKwkJCQkJZWxzZSAvKiBQcmUtY29tbWl0IHNob3VsZCBoYXZlIGNsb3Nl ZCB0aGUgb3BlbiB0cmFuc2FjdGlvbiAqLworCQkJCQkJZWxvZyhFUlJPUiwgIm1pc3NlZCBjbGVh bmluZyB1cCBjb25uZWN0aW9uIGR1cmluZyBwcmUtY29tbWl0Iik7CisJCQkJCWJyZWFrOwogCQkJ CWNhc2UgWEFDVF9FVkVOVF9QUkVQQVJFOgogCQkJCQkvKiBQcmUtY29tbWl0IHNob3VsZCBoYXZl IGNsb3NlZCB0aGUgb3BlbiB0cmFuc2FjdGlvbiAqLwogCQkJCQllbG9nKEVSUk9SLCAibWlzc2Vk IGNsZWFuaW5nIHVwIGNvbm5lY3Rpb24gZHVyaW5nIHByZS1jb21taXQiKTsKQEAgLTg4Niw2ICsx MDM4LDM4IEBAIHBnZmR3X3hhY3RfY2FsbGJhY2soWGFjdEV2ZW50IGV2ZW50LCB2b2lkICphcmcp CiAKIAkvKiBBbHNvIHJlc2V0IGN1cnNvciBudW1iZXJpbmcgZm9yIG5leHQgdHJhbnNhY3Rpb24g Ki8KIAljdXJzb3JfbnVtYmVyID0gMDsKKworCS8qIFJlc2V0IGZkd1RyYW5zU3RhdGUgKi8KKwlt ZW1zZXQoZmR3VHJhbnNTdGF0ZSwgJ1wwJywgc2l6ZW9mKEZkd1RyYW5zYWN0aW9uU3RhdGUpKTsK K30KKworLyoKKyAqIElmIHRoZXJlIHdlcmUgYW55IGVycm9ycyBpbiBzdWJ0cmFuc2FjdGlvbnMs IGFuZCB3ZQorICogbWFkZSBwcmVwYXJlZCBzdGF0ZW1lbnRzLCBkbyBhIERFQUxMT0NBVEUgQUxM IHRvIG1ha2UKKyAqIHN1cmUgd2UgZ2V0IHJpZCBvZiBhbGwgcHJlcGFyZWQgc3RhdGVtZW50cy4g VGhpcyBpcworICogYW5ub3lpbmcgYW5kIG5vdCB0ZXJyaWJseSBidWxsZXRwcm9vZiwgYnV0IGl0 J3MKKyAqIHByb2JhYmx5IG5vdCB3b3J0aCB0cnlpbmcgaGFyZGVyLgorICoKKyAqIERFQUxMT0NB VEUgQUxMIG9ubHkgZXhpc3RzIGluIDguMyBhbmQgbGF0ZXIsIHNvIHRoaXMKKyAqIGNvbnN0cmFp bnMgaG93IG9sZCBhIHNlcnZlciBwb3N0Z3Jlc19mZHcgY2FuCisgKiBjb21tdW5pY2F0ZSB3aXRo LiAgV2UgaW50ZW50aW9uYWxseSBpZ25vcmUgZXJyb3JzIGluCisgKiB0aGUgREVBTExPQ0FURSwg c28gdGhhdCB3ZSBjYW4gaG9iYmxlIGFsb25nIHRvIHNvbWUKKyAqIGV4dGVudCB3aXRoIG9sZGVy IHNlcnZlcnMgKGxlYWtpbmcgcHJlcGFyZWQgc3RhdGVtZW50cworICogYXMgd2UgZ287IGJ1dCB3 ZSBkb24ndCByZWFsbHkgc3VwcG9ydCB1cGRhdGUgb3BlcmF0aW9ucworICogcHJlLTguMyBhbnl3 YXkpLgorICovCitzdGF0aWMgdm9pZAorZGVhbGxvY2F0ZV9wcmVwYXJlZF9zdG10cyhDb25uQ2Fj aGVFbnRyeSAqZW50cnkpCit7CisJUEdyZXN1bHQgICAqcmVzOworCisJaWYgKGVudHJ5LT5oYXZl X3ByZXBfc3RtdCAmJiBlbnRyeS0+aGF2ZV9lcnJvcikKKwl7CisJCXJlcyA9IFBRZXhlYyhlbnRy eS0+Y29ubiwgIkRFQUxMT0NBVEUgQUxMIik7CisJCVBRY2xlYXIocmVzKTsKKwl9CisJZW50cnkt PmhhdmVfcHJlcF9zdG10ID0gZmFsc2U7CisJZW50cnktPmhhdmVfZXJyb3IgPSBmYWxzZTsKIH0K IAogLyoKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5jIGIv Y29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmMKaW5kZXggYTMxYWJjZTdjOTkuLjdh Nzc3MmY1ZGQzIDEwMDY0NAotLS0gYS9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcu YworKysgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuYwpAQCAtMzAxLDYgKzMw MSwxMiBAQCB0eXBlZGVmIHN0cnVjdAogCUxpc3QJICAgKmFscmVhZHlfdXNlZDsJLyogZXhwcmVz c2lvbnMgYWxyZWFkeSBkZWFsdCB3aXRoICovCiB9IGVjX21lbWJlcl9mb3JlaWduX2FyZzsKIAor Ym9vbAkJVXNlMlBDID0gZmFsc2U7CisKKyNpZm5kZWYgUEdfRkRXX0JVSUxUSU4KK3ZvaWQJCV9Q R19pbml0KHZvaWQpOworI2VuZGlmCisKIC8qCiAgKiBTUUwgZnVuY3Rpb25zCiAgKi8KQEAgLTY1 ODMsMyArNjU4OSwxNCBAQCBmaW5kX2VtX2V4cHJfZm9yX2lucHV0X3RhcmdldChQbGFubmVySW5m byAqcm9vdCwKIAllbG9nKEVSUk9SLCAiY291bGQgbm90IGZpbmQgcGF0aGtleSBpdGVtIHRvIHNv cnQiKTsKIAlyZXR1cm4gTlVMTDsJCQkJLyoga2VlcCBjb21waWxlciBxdWlldCAqLwogfQorCisj aWZuZGVmIFBHX0ZEV19CVUlMVElOCit2b2lkCitfUEdfaW5pdCh2b2lkKQoreworCURlZmluZUN1 c3RvbUJvb2xWYXJpYWJsZSgicG9zdGdyZXNfZmR3LnVzZV90d29waGFzZSIsCisJCQkJCQkJICJV c2UgdHdvIHBoYXNlIGNvbW1pdCBmb3IgZGlzdHJpYnV0ZWQgdHJhbnNhY3Rpb25zIiwgTlVMTCwK KwkJCQkJCQkgJlVzZTJQQywgZmFsc2UsIFBHQ19VU0VSU0VULCAwLCBOVUxMLAorCQkJCQkJCSBO VUxMLCBOVUxMKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wb3N0Z3Jlc19mZHcv cG9zdGdyZXNfZmR3LmggYi9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuaAppbmRl eCBlZWY0MTBkYjM5Mi4uM2M4Y2FkYzUwOGEgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvcG9zdGdyZXNf ZmR3L3Bvc3RncmVzX2Zkdy5oCisrKyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zk dy5oCkBAIC0yMDgsNCArMjA4LDYgQEAgZXh0ZXJuIGNvbnN0IGNoYXIgKmdldF9qb2ludHlwZV9u YW1lKEpvaW5UeXBlIGpvaW50eXBlKTsKIGV4dGVybiBib29sIGlzX2J1aWx0aW4oT2lkIG9iamVj dElkKTsKIGV4dGVybiBib29sIGlzX3NoaXBwYWJsZShPaWQgb2JqZWN0SWQsIE9pZCBjbGFzc0lk LCBQZ0Zkd1JlbGF0aW9uSW5mbyAqZnBpbmZvKTsKIAorZXh0ZXJuIGJvb2wgVXNlMlBDOworCiAj ZW5kaWYJCQkJCQkJLyogUE9TVEdSRVNfRkRXX0ggKi8KCmJhc2UtY29tbWl0OiA0OWQ3MTY1MTE3 ODkzNDA1YWU5YjViOGQ4ZTc4NzdhY2ZmMzNjMGU3Ci0tIAoyLjE5LjEKCg== --=_74e1ed9ea16c674d3e63c2321babe178--