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 1tVbtn-009ylV-RK for pgsql-hackers@arkaria.postgresql.org; Wed, 08 Jan 2025 19:39:28 +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 1tVbtm-005SIe-UU for pgsql-hackers@arkaria.postgresql.org; Wed, 08 Jan 2025 19:39:26 +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 1tVbtm-005SIW-GA for pgsql-hackers@lists.postgresql.org; Wed, 08 Jan 2025 19:39:26 +0000 Received: from forward102d.mail.yandex.net ([178.154.239.213]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1tVbti-000aaS-1z for pgsql-hackers@postgresql.org; Wed, 08 Jan 2025 19:39:25 +0000 Received: from mail-nwsmtp-smtp-production-main-42.klg.yp-c.yandex.net (mail-nwsmtp-smtp-production-main-42.klg.yp-c.yandex.net [IPv6:2a02:6b8:c42:55a0:0:640:1286:0]) by forward102d.mail.yandex.net (Yandex) with ESMTPS id 636B1608F3; Wed, 8 Jan 2025 22:39:21 +0300 (MSK) Received: by mail-nwsmtp-smtp-production-main-42.klg.yp-c.yandex.net (smtp/Yandex) with ESMTPSA id IdsA1ZYOe4Y0-cIT5XSm1; Wed, 08 Jan 2025 22:39:20 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tantorlabs.com; s=mail; t=1736365160; bh=b9EnYuA1uSvYIi7g85fF6UbHpSlgPq3G2ZWmHINCt1U=; h=In-Reply-To:Cc:Date:References:To:Subject:Message-ID:From; b=J1IIBNZQviT+FezyPePqI5bmW9Z6nPJVnVp72n3kVS4KQOeap9uIcn55/diViRh9I vADMQuCJtiSoOtHR9lp3Dqyfq3UOhbMOcQQTrNvzRChTFYEjjPrSov1fzE/S+oebbd YPnGTJ2zQb63BLBhimVc3PhzW8LOXEW3cTWvT4uo= Authentication-Results: mail-nwsmtp-smtp-production-main-42.klg.yp-c.yandex.net; dkim=pass header.i=@tantorlabs.com Content-Type: multipart/mixed; boundary="------------91D6H6Yjk3avNcdr0GIVu0By" Message-ID: <6cf6270b-e8fa-4d99-b74a-17e781cdf309@tantorlabs.com> Date: Wed, 8 Jan 2025 22:39:18 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Sample rate added to pg_stat_statements To: Sami Imseih , "Andrey M. Borodin" Cc: Alexander Korotkov , Michael Paquier , Greg Sabino Mullane , pgsql-hackers References: <6707FCA9-FD1A-4609-A1A6-142456C14E0C@yandex-team.ru> <320a31e6-4c91-438b-ab17-8a1d72384727@tantorlabs.com> <52e5e3aa-066a-4daf-8d65-77c34a2f0d98@tantorlabs.com> <6482A576-4465-4E46-A42C-F1767E8DDE30@yandex-team.ru> <20994d10-ab44-4c6b-91bc-c4675cd2e58e@tantorlabs.com> <9D8A5BC8-A3A5-4DA9-9382-F30D343247D1@yandex-team.ru> Content-Language: en-US From: Ilia Evdokimov In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------91D6H6Yjk3avNcdr0GIVu0By Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 07.01.2025 22:29, Sami Imseih wrote: >>> You are right. This is absolutely unexpected for users. Thank you for >>> the review. >>> >>> To fix this, I suggest storing a random number in the [0, 1) range in a >>> separate variable, which will be used for comparisons in any place. We >>> will compare 'sample_rate' and random value not only in >>> pgss_post_parse_analyze(), but also in pgss_ProcessUtility() and >>> pgss_planner(). >>> >>> I attached patch with test and fixes. > I still think this is not the correct approach. It seems that post_parse_analyze > should not have to deal with checking for a sample rate. This is because > post_parse_analyze, which is the only hook with access to jstate, is > only responsible > for storing a normalized query text on disk and creating a not-yet > user visible entry > in the hash. i.e. pgss_store will never increment counters when called from > pgss_post_parse_analyze. > > /* Increment the counts, except when jstate is not NULL */ > if (!jstate) > { > > What I think may be a better idea is to add something similar > to auto_explain.c, but it should only be added to the top of > pgss_planner, pgss_ExecutorStart and pgss_ProcessUtility. > > if (nesting_level == 0) > { > if (!IsParallelWorker()) > current_query_sampled = pg_prng_double(&pg_global_prng_state) < > pgss_sample_rate; > else > current_query_sampled = false; > } > > This is needed for ExecutorStart and not ExecutorEnd because > ExecutorStart is where the instrumentation is initialized with > queryDesc->totaltime. The above code block could be > turned into a macro and reused in the routines mentioned. I added this code in to the top of pgss_planner, pgss_ExecutorStart and pgss_ProcessUtility. I removed this checking from pgss_post_parse_analyze. I attached v9-patch. > > However, it seems with this change, we can see a much > higher likelihood of non-normalized query texts being stored. > This is because jstate is only available during post_parse_analyze. > Therefore, if the first time you are sampling the statement is in ExecutorEnd, > then you will end up storing a non-normalized version of the query text, > see below example with the attached v8. > > postgres=# set pg_stat_statements.sample_rate = 0; > SET > postgres=# select pg_stat_statements_reset(); > pg_stat_statements_reset > ------------------------------- > 2025-01-07 13:02:11.807952-06 > (1 row) > > postgres=# SELECT 1 \parse stmt > > postgres=# \bind_named stmt \g > ?column? > ---------- > 1 > (1 row) > > postgres=# \bind_named stmt \g > ?column? > ---------- > 1 > (1 row) > > postgres=# SELECT query, calls FROM pg_stat_statements; > query | calls > -------+------- > (0 rows) > > postgres=# set pg_stat_statements.sample_rate = 1; > SET > postgres=# \bind_named stmt \g > ?column? > ---------- > 1 > (1 row) > > postgres=# \bind_named stmt \g > ?column? > ---------- > 1 > (1 row) > > postgres=# SELECT query, calls FROM pg_stat_statements; > query | calls > -------+------- > (0 rows) > > postgres=# \bind_named stmt \g > ?column? > ---------- > 1 > (1 row) > > postgres=# SELECT query, calls FROM pg_stat_statements; > query | calls > ---------------------------------------------+------- > SELECT 1 | 1 > SELECT query, calls FROM pg_stat_statements | 1 > (2 rows) > > postgres=# \bind_named stmt \g > ?column? > ---------- > 1 > (1 row) > > postgres=# SELECT query, calls FROM pg_stat_statements; > query | calls > ---------------------------------------------+------- > SELECT 1 | 2 > SELECT query, calls FROM pg_stat_statements | 2 > (2 rows) > > One idea is to make jstate available to all hooks, and completely > remove reliance on post_parse_analyze in pg_stat_statements. > I can't find the thread now, but I know this has come up in past discussions > when troubleshooting gaps in query normalization. My concern is this > feature will greatly increase the likelihood of non-normalized query texts. > > Also, with regards to the benchmarks, it seems > sampling will be beneficial for workloads that are touching a small number > of entries with high concurrency. This is why we see benefit for > a standard pgbench workload. > Samping becomes less beneficial when there is a large set of queries > being updated. > I still think this is a good approach for workloads that touch a small set > of entries. > > Regards, > > Sami > > After the changes in v9-patch, won’t all the necessary queries now be normalized? Since there are no longer any restrictions in the parser hook, queries will be normalized as usual, and pgss_planner, pgss_ExecutorStart, and ExecutorEnd will simply fetch them from 'pgss_query_texts.stat' file. For now, this seems like the simplest approach instead of making JumbleState available to other hooks. Moreover, if we do proceed with that, we might be able to remove the 'pgss_query_texts.stat' file altogether and more other improvements. In my view, if no other options arise, we should address making JumbleState available to other hooks in a separate thread. If you have any suggestions, I'm always open to feedback. I attached v9 patch with changes and test above. -- Best regards, Ilia Evdokimov, Tantor Labs LLC. --------------91D6H6Yjk3avNcdr0GIVu0By Content-Type: text/x-patch; charset=UTF-8; name="v9-0001-Allow-setting-sample-ratio-for-pg_stat_statements.patch" Content-Disposition: attachment; filename*0="v9-0001-Allow-setting-sample-ratio-for-pg_stat_statements.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSBiNDBhYjA2MTU1Y2FjMzhlNTdmMDU1MWEzODU4ZDA1NzRkOTY4NjVmIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBJbGlhIEV2ZG9raW1vdiA8aWx5YS5ldmRva2ltb3ZA dGFudG9ybGFicy5jb20+CkRhdGU6IFdlZCwgOCBKYW4gMjAyNSAyMjoxNTowMiArMDMwMApT dWJqZWN0OiBbUEFUQ0hdIEFsbG93IHNldHRpbmcgc2FtcGxlIHJhdGlvIGZvciBwZ19zdGF0 X3N0YXRlbWVudHMKCk5ldyBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBwZ19zdGF0X3N0YXRl bWVudHMuc2FtcGxlX3JhdGlvIG1ha2VzIGl0CnBvc3NpYmxlIHRvIHRyYWNrIGp1c3QgYSBm cmFjdGlvbiBvZiB0aGUgcXVlcmllcyBtZWV0aW5nIHRoZSBjb25maWd1cmVkCnRocmVzaG9s ZCwgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2YgdHJhY2tpbmcuCi0tLQogLi4uL3BnX3N0YXRf c3RhdGVtZW50cy9leHBlY3RlZC9zZWxlY3Qub3V0ICAgIHwgNzYgKysrKysrKysrKysrKysr KysrKwogLi4uL3BnX3N0YXRfc3RhdGVtZW50cy9wZ19zdGF0X3N0YXRlbWVudHMuYyAgIHwg NTQgKysrKysrKysrKysrLQogY29udHJpYi9wZ19zdGF0X3N0YXRlbWVudHMvc3FsL3NlbGVj dC5zcWwgICAgIHwgMjEgKysrKysKIGRvYy9zcmMvc2dtbC9wZ3N0YXRzdGF0ZW1lbnRzLnNn bWwgICAgICAgICAgICB8IDE4ICsrKysrCiA0IGZpbGVzIGNoYW5nZWQsIDE2NiBpbnNlcnRp b25zKCspLCAzIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdfc3RhdF9z dGF0ZW1lbnRzL2V4cGVjdGVkL3NlbGVjdC5vdXQgYi9jb250cmliL3BnX3N0YXRfc3RhdGVt ZW50cy9leHBlY3RlZC9zZWxlY3Qub3V0CmluZGV4IDM3YTMwYWYwMzQuLjU1OGQ5M2ZiNDYg MTAwNjQ0Ci0tLSBhL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL2V4cGVjdGVkL3NlbGVj dC5vdXQKKysrIGIvY29udHJpYi9wZ19zdGF0X3N0YXRlbWVudHMvZXhwZWN0ZWQvc2VsZWN0 Lm91dApAQCAtMTUzLDYgKzE1Myw4MiBAQCBTRUxFQ1QgcGdfc3RhdF9zdGF0ZW1lbnRzX3Jl c2V0KCkgSVMgTk9UIE5VTEwgQVMgdDsKICB0CiAoMSByb3cpCiAKKy0tCistLSBzYW1wbGUg c3RhdGVtZW50cworLS0KK1NFVCBwZ19zdGF0X3N0YXRlbWVudHMuc2FtcGxlX3JhdGUgPSAw LjA7CitTRUxFQ1QgMSBBUyAiaW50IjsKKyBpbnQgCistLS0tLQorICAgMQorKDEgcm93KQor CitTRUxFQ1QgcXVlcnksIGNhbGxzIEZST00gcGdfc3RhdF9zdGF0ZW1lbnRzIE9SREVSIEJZ IHF1ZXJ5IENPTExBVEUgIkMiOworICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSAgICAg ICAgICAgICAgICAgICAgICAgIHwgY2FsbHMgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0KKyBTRUxFQ1QgcGdfc3RhdF9z dGF0ZW1lbnRzX3Jlc2V0KCkgSVMgTk9UIE5VTEwgQVMgdCB8ICAgICAxCisoMSByb3cpCisK K1NFVCBwZ19zdGF0X3N0YXRlbWVudHMuc2FtcGxlX3JhdGUgPSAxLjA7CitTRUxFQ1QgMSBB UyAiaW50IjsKKyBpbnQgCistLS0tLQorICAgMQorKDEgcm93KQorCitTRUxFQ1QgcXVlcnks IGNhbGxzIEZST00gcGdfc3RhdF9zdGF0ZW1lbnRzIE9SREVSIEJZIHF1ZXJ5IENPTExBVEUg IkMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCBjYWxscyAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tCisgU0VMRUNUICQxIEFTICJpbnQiICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAxCisgU0VMRUNUIHBnX3N0YXRfc3Rh dGVtZW50c19yZXNldCgpIElTIE5PVCBOVUxMIEFTIHQgICAgICAgICAgICAgICAgICAgICB8 ICAgICAxCisgU0VMRUNUIHF1ZXJ5LCBjYWxscyBGUk9NIHBnX3N0YXRfc3RhdGVtZW50cyBP UkRFUiBCWSBxdWVyeSBDT0xMQVRFICJDIiB8ICAgICAwCisoMyByb3dzKQorCitTRUxFQ1Qg cGdfc3RhdF9zdGF0ZW1lbnRzX3Jlc2V0KCkgSVMgTk9UIE5VTEwgQVMgdDsKKyB0IAorLS0t CisgdAorKDEgcm93KQorCitzZXQgcGdfc3RhdF9zdGF0ZW1lbnRzLnNhbXBsZV9yYXRlID0g MC4wOworc2VsZWN0IHBnX3N0YXRfc3RhdGVtZW50c19yZXNldCgpIElTIE5PVCBOVUxMIEFT IHQ7CisgdCAKKy0tLQorIHQKKygxIHJvdykKKworU0VMRUNUIDEgXHBhcnNlIHN0bXQKK1xi aW5kX25hbWVkIHN0bXQgXGcKKyA/Y29sdW1uPyAKKy0tLS0tLS0tLS0KKyAgICAgICAgMQor KDEgcm93KQorCitTRUxFQ1QgcXVlcnksIGNhbGxzIEZST00gcGdfc3RhdF9zdGF0ZW1lbnRz IE9SREVSIEJZIHF1ZXJ5IENPTExBVEUgIkMiOworIHF1ZXJ5IHwgY2FsbHMgCistLS0tLS0t Ky0tLS0tLS0KKygwIHJvd3MpCisKK3NldCBwZ19zdGF0X3N0YXRlbWVudHMuc2FtcGxlX3Jh dGUgPSAxLjA7CitcYmluZF9uYW1lZCBzdG10IFxnCisgP2NvbHVtbj8gCistLS0tLS0tLS0t CisgICAgICAgIDEKKygxIHJvdykKKworU0VMRUNUIHF1ZXJ5LCBjYWxscyBGUk9NIHBnX3N0 YXRfc3RhdGVtZW50cyBPUkRFUiBCWSBxdWVyeSBDT0xMQVRFICJDIjsKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgY2FsbHMgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLQorIFNFTEVDVCAk MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgICAgMQorIFNFTEVDVCBxdWVyeSwgY2FsbHMgRlJPTSBwZ19zdGF0X3N0 YXRlbWVudHMgT1JERVIgQlkgcXVlcnkgQ09MTEFURSAiQyIgfCAgICAgMAorKDIgcm93cykK Kworc2VsZWN0IHBnX3N0YXRfc3RhdGVtZW50c19yZXNldCgpIElTIE5PVCBOVUxMIEFTIHQ7 CisgdCAKKy0tLQorIHQKKygxIHJvdykKKwogLS0KIC0tIHF1ZXJpZXMgd2l0aCBsb2NraW5n IGNsYXVzZXMKIC0tCmRpZmYgLS1naXQgYS9jb250cmliL3BnX3N0YXRfc3RhdGVtZW50cy9w Z19zdGF0X3N0YXRlbWVudHMuYyBiL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3BnX3N0 YXRfc3RhdGVtZW50cy5jCmluZGV4IGJlYmY4MTM0ZWIuLjUyOTU3YzQ2MjggMTAwNjQ0Ci0t LSBhL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3BnX3N0YXRfc3RhdGVtZW50cy5jCisr KyBiL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3BnX3N0YXRfc3RhdGVtZW50cy5jCkBA IC01MCw2ICs1MCw3IEBACiAjaW5jbHVkZSAiYWNjZXNzL3BhcmFsbGVsLmgiCiAjaW5jbHVk ZSAiY2F0YWxvZy9wZ19hdXRoaWQuaCIKICNpbmNsdWRlICJjb21tb24vaW50LmgiCisjaW5j bHVkZSAiY29tbW9uL3BnX3BybmcuaCIKICNpbmNsdWRlICJleGVjdXRvci9pbnN0cnVtZW50 LmgiCiAjaW5jbHVkZSAiZnVuY2FwaS5oIgogI2luY2x1ZGUgImppdC9qaXQuaCIKQEAgLTI5 NCw2ICsyOTUsMTAgQEAgc3RhdGljIGJvb2wgcGdzc190cmFja191dGlsaXR5ID0gdHJ1ZTsJ Lyogd2hldGhlciB0byB0cmFjayB1dGlsaXR5IGNvbW1hbmRzICovCiBzdGF0aWMgYm9vbCBw Z3NzX3RyYWNrX3BsYW5uaW5nID0gZmFsc2U7CS8qIHdoZXRoZXIgdG8gdHJhY2sgcGxhbm5p bmcKIAkJCQkJCQkJCQkJICogZHVyYXRpb24gKi8KIHN0YXRpYyBib29sIHBnc3Nfc2F2ZSA9 IHRydWU7CS8qIHdoZXRoZXIgdG8gc2F2ZSBzdGF0cyBhY3Jvc3Mgc2h1dGRvd24gKi8KK3N0 YXRpYyBkb3VibGUgcGdzc19zYW1wbGVfcmF0ZSA9IDE7CisKKy8qIElzIHRoZSBjdXJyZW50 IHRvcC1sZXZlbCBxdWVyeSB0byBiZSBzYW1wbGVkPyAqLworc3RhdGljIGJvb2wgY3VycmVu dF9xdWVyeV9zYW1wbGVkID0gZmFsc2U7CiAKIAogI2RlZmluZSBwZ3NzX2VuYWJsZWQobGV2 ZWwpIFwKQEAgLTQxNCw2ICs0MTksMTkgQEAgX1BHX2luaXQodm9pZCkKIAkJCQkJCQlOVUxM LAogCQkJCQkJCU5VTEwpOwogCisJRGVmaW5lQ3VzdG9tUmVhbFZhcmlhYmxlKCJwZ19zdGF0 X3N0YXRlbWVudHMuc2FtcGxlX3JhdGUiLAorCQkJCQkJCSAiRnJhY3Rpb24gb2YgcXVlcmll cyB0byB0cmFjay4iLAorCQkJCQkJCSBOVUxMLAorCQkJCQkJCSAmcGdzc19zYW1wbGVfcmF0 ZSwKKwkJCQkJCQkgMS4wLAorCQkJCQkJCSAwLjAsCisJCQkJCQkJIDEuMCwKKwkJCQkJCQkg UEdDX1NVU0VULAorCQkJCQkJCSAwLAorCQkJCQkJCSBOVUxMLAorCQkJCQkJCSBOVUxMLAor CQkJCQkJCSBOVUxMKTsKKwogCURlZmluZUN1c3RvbUVudW1WYXJpYWJsZSgicGdfc3RhdF9z dGF0ZW1lbnRzLnRyYWNrIiwKIAkJCQkJCQkgIlNlbGVjdHMgd2hpY2ggc3RhdGVtZW50cyBh cmUgdHJhY2tlZCBieSBwZ19zdGF0X3N0YXRlbWVudHMuIiwKIAkJCQkJCQkgTlVMTCwKQEAg LTg4OSwxMiArOTA3LDIxIEBAIHBnc3NfcGxhbm5lcihRdWVyeSAqcGFyc2UsCiB7CiAJUGxh bm5lZFN0bXQgKnJlc3VsdDsKIAorCWlmIChuZXN0aW5nX2xldmVsID09IDApCisJeworCQlp ZiAoIUlzUGFyYWxsZWxXb3JrZXIoKSkKKwkJCWN1cnJlbnRfcXVlcnlfc2FtcGxlZCA9IHBn X3BybmdfZG91YmxlKCZwZ19nbG9iYWxfcHJuZ19zdGF0ZSkgPCBwZ3NzX3NhbXBsZV9yYXRl OworCQllbHNlCisJCQljdXJyZW50X3F1ZXJ5X3NhbXBsZWQgPSBmYWxzZTsKKworCX0KKwog CS8qCiAJICogV2UgY2FuJ3QgcHJvY2VzcyB0aGUgcXVlcnkgaWYgbm8gcXVlcnlfc3RyaW5n IGlzIHByb3ZpZGVkLCBhcwogCSAqIHBnc3Nfc3RvcmUgbmVlZHMgaXQuICBXZSBhbHNvIGln bm9yZSBxdWVyeSB3aXRob3V0IHF1ZXJ5aWQsIGFzIGl0IHdvdWxkCiAJICogYmUgdHJlYXRl ZCBhcyBhIHV0aWxpdHkgc3RhdGVtZW50LCB3aGljaCBtYXkgbm90IGJlIHRoZSBjYXNlLgog CSAqLwotCWlmIChwZ3NzX2VuYWJsZWQobmVzdGluZ19sZXZlbCkKKwlpZiAocGdzc19lbmFi bGVkKG5lc3RpbmdfbGV2ZWwpICYmIGN1cnJlbnRfcXVlcnlfc2FtcGxlZAogCQkmJiBwZ3Nz X3RyYWNrX3BsYW5uaW5nICYmIHF1ZXJ5X3N0cmluZwogCQkmJiBwYXJzZS0+cXVlcnlJZCAh PSBVSU5UNjRDT05TVCgwKSkKIAl7CkBAIC05OTQsMTIgKzEwMjEsMjIgQEAgcGdzc19FeGVj dXRvclN0YXJ0KFF1ZXJ5RGVzYyAqcXVlcnlEZXNjLCBpbnQgZWZsYWdzKQogCWVsc2UKIAkJ c3RhbmRhcmRfRXhlY3V0b3JTdGFydChxdWVyeURlc2MsIGVmbGFncyk7CiAKKwlpZiAobmVz dGluZ19sZXZlbCA9PSAwKQorCXsKKwkJaWYgKCFJc1BhcmFsbGVsV29ya2VyKCkpCisJCQlj dXJyZW50X3F1ZXJ5X3NhbXBsZWQgPSBwZ19wcm5nX2RvdWJsZSgmcGdfZ2xvYmFsX3Bybmdf c3RhdGUpIDwgcGdzc19zYW1wbGVfcmF0ZTsKKwkJZWxzZQorCQkJY3VycmVudF9xdWVyeV9z YW1wbGVkID0gZmFsc2U7CisKKwl9CisKIAkvKgogCSAqIElmIHF1ZXJ5IGhhcyBxdWVyeUlk IHplcm8sIGRvbid0IHRyYWNrIGl0LiAgVGhpcyBwcmV2ZW50cyBkb3VibGUKIAkgKiBjb3Vu dGluZyBvZiBvcHRpbWl6YWJsZSBzdGF0ZW1lbnRzIHRoYXQgYXJlIGRpcmVjdGx5IGNvbnRh aW5lZCBpbgogCSAqIHV0aWxpdHkgc3RhdGVtZW50cy4KIAkgKi8KLQlpZiAocGdzc19lbmFi bGVkKG5lc3RpbmdfbGV2ZWwpICYmIHF1ZXJ5RGVzYy0+cGxhbm5lZHN0bXQtPnF1ZXJ5SWQg IT0gVUlOVDY0Q09OU1QoMCkpCisJaWYgKHBnc3NfZW5hYmxlZChuZXN0aW5nX2xldmVsKSAm JiBjdXJyZW50X3F1ZXJ5X3NhbXBsZWQgJiYKKwkJcXVlcnlEZXNjLT5wbGFubmVkc3RtdC0+ cXVlcnlJZCAhPSBVSU5UNjRDT05TVCgwKSkKIAl7CiAJCS8qCiAJCSAqIFNldCB1cCB0byB0 cmFjayB0b3RhbCBlbGFwc2VkIHRpbWUgaW4gRXhlY3V0b3JSdW4uICBNYWtlIHN1cmUgdGhl CkBAIC0xMTExLDcgKzExNDgsMTggQEAgcGdzc19Qcm9jZXNzVXRpbGl0eShQbGFubmVkU3Rt dCAqcHN0bXQsIGNvbnN0IGNoYXIgKnF1ZXJ5U3RyaW5nLAogCXVpbnQ2NAkJc2F2ZWRfcXVl cnlJZCA9IHBzdG10LT5xdWVyeUlkOwogCWludAkJCXNhdmVkX3N0bXRfbG9jYXRpb24gPSBw c3RtdC0+c3RtdF9sb2NhdGlvbjsKIAlpbnQJCQlzYXZlZF9zdG10X2xlbiA9IHBzdG10LT5z dG10X2xlbjsKLQlib29sCQllbmFibGVkID0gcGdzc190cmFja191dGlsaXR5ICYmIHBnc3Nf ZW5hYmxlZChuZXN0aW5nX2xldmVsKTsKKwlib29sCQllbmFibGVkOworCisJaWYgKG5lc3Rp bmdfbGV2ZWwgPT0gMCkKKwl7CisJCWlmICghSXNQYXJhbGxlbFdvcmtlcigpKQorCQkJY3Vy cmVudF9xdWVyeV9zYW1wbGVkID0gcGdfcHJuZ19kb3VibGUoJnBnX2dsb2JhbF9wcm5nX3N0 YXRlKSA8IHBnc3Nfc2FtcGxlX3JhdGU7CisJCWVsc2UKKwkJCWN1cnJlbnRfcXVlcnlfc2Ft cGxlZCA9IGZhbHNlOworCX0KKworCS8qIGN1cnJlbnRfcXVlcnlfc2FtcGxlZCBpcyBpbiBw Z3NzX2VuYWJsZWQgKi8KKwllbmFibGVkID0gcGdzc190cmFja191dGlsaXR5ICYmIHBnc3Nf ZW5hYmxlZChuZXN0aW5nX2xldmVsKSAmJiBjdXJyZW50X3F1ZXJ5X3NhbXBsZWQ7CiAKIAkv KgogCSAqIEZvcmNlIHV0aWxpdHkgc3RhdGVtZW50cyB0byBnZXQgcXVlcnlJZCB6ZXJvLiAg V2UgZG8gdGhpcyBldmVuIGluIGNhc2VzCmRpZmYgLS1naXQgYS9jb250cmliL3BnX3N0YXRf c3RhdGVtZW50cy9zcWwvc2VsZWN0LnNxbCBiL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRz L3NxbC9zZWxlY3Quc3FsCmluZGV4IGUwYmU1OGQ1ZTIuLjIxZjA5ZWY5NGEgMTAwNjQ0Ci0t LSBhL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3NxbC9zZWxlY3Quc3FsCisrKyBiL2Nv bnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3NxbC9zZWxlY3Quc3FsCkBAIC01OSw2ICs1OSwy NyBAQCBERUFMTE9DQVRFIHBnc3NfdGVzdDsKIFNFTEVDVCBjYWxscywgcm93cywgcXVlcnkg RlJPTSBwZ19zdGF0X3N0YXRlbWVudHMgT1JERVIgQlkgcXVlcnkgQ09MTEFURSAiQyI7CiBT RUxFQ1QgcGdfc3RhdF9zdGF0ZW1lbnRzX3Jlc2V0KCkgSVMgTk9UIE5VTEwgQVMgdDsKIAor LS0KKy0tIHNhbXBsZSBzdGF0ZW1lbnRzCistLQorU0VUIHBnX3N0YXRfc3RhdGVtZW50cy5z YW1wbGVfcmF0ZSA9IDAuMDsKK1NFTEVDVCAxIEFTICJpbnQiOworU0VMRUNUIHF1ZXJ5LCBj YWxscyBGUk9NIHBnX3N0YXRfc3RhdGVtZW50cyBPUkRFUiBCWSBxdWVyeSBDT0xMQVRFICJD IjsKK1NFVCBwZ19zdGF0X3N0YXRlbWVudHMuc2FtcGxlX3JhdGUgPSAxLjA7CitTRUxFQ1Qg MSBBUyAiaW50IjsKK1NFTEVDVCBxdWVyeSwgY2FsbHMgRlJPTSBwZ19zdGF0X3N0YXRlbWVu dHMgT1JERVIgQlkgcXVlcnkgQ09MTEFURSAiQyI7CitTRUxFQ1QgcGdfc3RhdF9zdGF0ZW1l bnRzX3Jlc2V0KCkgSVMgTk9UIE5VTEwgQVMgdDsKKworc2V0IHBnX3N0YXRfc3RhdGVtZW50 cy5zYW1wbGVfcmF0ZSA9IDAuMDsKK3NlbGVjdCBwZ19zdGF0X3N0YXRlbWVudHNfcmVzZXQo KSBJUyBOT1QgTlVMTCBBUyB0OworU0VMRUNUIDEgXHBhcnNlIHN0bXQKK1xiaW5kX25hbWVk IHN0bXQgXGcKK1NFTEVDVCBxdWVyeSwgY2FsbHMgRlJPTSBwZ19zdGF0X3N0YXRlbWVudHMg T1JERVIgQlkgcXVlcnkgQ09MTEFURSAiQyI7CitzZXQgcGdfc3RhdF9zdGF0ZW1lbnRzLnNh bXBsZV9yYXRlID0gMS4wOworXGJpbmRfbmFtZWQgc3RtdCBcZworU0VMRUNUIHF1ZXJ5LCBj YWxscyBGUk9NIHBnX3N0YXRfc3RhdGVtZW50cyBPUkRFUiBCWSBxdWVyeSBDT0xMQVRFICJD IjsKK3NlbGVjdCBwZ19zdGF0X3N0YXRlbWVudHNfcmVzZXQoKSBJUyBOT1QgTlVMTCBBUyB0 OworCiAtLQogLS0gcXVlcmllcyB3aXRoIGxvY2tpbmcgY2xhdXNlcwogLS0KZGlmZiAtLWdp dCBhL2RvYy9zcmMvc2dtbC9wZ3N0YXRzdGF0ZW1lbnRzLnNnbWwgYi9kb2Mvc3JjL3NnbWwv cGdzdGF0c3RhdGVtZW50cy5zZ21sCmluZGV4IDUwMWI0NjhlOWEuLjhhZGU0ZTNjZWQgMTAw NjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9wZ3N0YXRzdGF0ZW1lbnRzLnNnbWwKKysrIGIvZG9j L3NyYy9zZ21sL3Bnc3RhdHN0YXRlbWVudHMuc2dtbApAQCAtOTM2LDYgKzkzNiwyNCBAQAog ICAgIDwvbGlzdGl0ZW0+CiAgICA8L3Zhcmxpc3RlbnRyeT4KIAorICAgPHZhcmxpc3RlbnRy eT4KKyAgICA8dGVybT4KKyAgICAgPHZhcm5hbWU+cGdfc3RhdF9zdGF0ZW1lbnRzLnNhbXBs ZV9yYXRlPC92YXJuYW1lPiAoPHR5cGU+cmVhbDwvdHlwZT4pCisgICAgIDxpbmRleHRlcm0+ CisgICAgICA8cHJpbWFyeT48dmFybmFtZT5wZ19zdGF0X3N0YXRlbWVudHMuc2FtcGxlX3Jh dGU8L3Zhcm5hbWU+IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyPC9wcmltYXJ5PgorICAgICA8 L2luZGV4dGVybT4KKyAgICA8L3Rlcm0+CisKKyAgICA8bGlzdGl0ZW0+CisgICAgIDxwYXJh PgorICAgICAgPHZhcm5hbWU+cGdfc3RhdF9zdGF0ZW1lbnRzLnNhbXBsZV9yYXRlPC92YXJu YW1lPiBjYXVzZXMgcGdfc3RhdF9zdGF0ZW1lbnRzIHRvIG9ubHkKKyAgICAgIHRyYWNrIGEg ZnJhY3Rpb24gb2YgdGhlIHN0YXRlbWVudHMgaW4gZWFjaCBzZXNzaW9uLiBUaGUgZGVmYXVs dCBpcyAxLAorICAgICAgbWVhbmluZyB0cmFjayBhbGwgdGhlIHF1ZXJpZXMuIEluIGNhc2Ug b2YgbmVzdGVkIHN0YXRlbWVudHMsCisgICAgICBlaXRoZXIgYWxsIHdpbGwgYmUgdHJhY2tl ZCBvciBub25lLiBPbmx5IHN1cGVydXNlcnMgY2FuIGNoYW5nZSB0aGlzIHNldHRpbmcuCisg ICAgIDwvcGFyYT4KKyAgICA8L2xpc3RpdGVtPgorICAgPC92YXJsaXN0ZW50cnk+CisKICAg IDx2YXJsaXN0ZW50cnk+CiAgICAgPHRlcm0+CiAgICAgIDx2YXJuYW1lPnBnX3N0YXRfc3Rh dGVtZW50cy5zYXZlPC92YXJuYW1lPiAoPHR5cGU+Ym9vbGVhbjwvdHlwZT4pCi0tIAoyLjM0 LjEKCg== --------------91D6H6Yjk3avNcdr0GIVu0By--