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 1kJC9W-0002CS-GM for pgsql-hackers@arkaria.postgresql.org; Fri, 18 Sep 2020 08:53:58 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1kJC9U-0006q6-F6 for pgsql-hackers@arkaria.postgresql.org; Fri, 18 Sep 2020 08:53:56 +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 1kJC9T-0006pz-WD for pgsql-hackers@lists.postgresql.org; Fri, 18 Sep 2020 08:53:56 +0000 Received: from oss.nttdata.com ([49.212.34.109]) by makus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kJC9M-0003N5-NA for pgsql-hackers@postgresql.org; Fri, 18 Sep 2020 08:53:55 +0000 Received: from oss.nttdata.com (localhost [127.0.0.1]) by oss.nttdata.com (Postfix) with ESMTP id E7E2B6009A for ; Fri, 18 Sep 2020 17:53:44 +0900 (JST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.102.3 at oss.nttdata.com MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_c9853884815d3d0e5b0c45d3835a4dc8" Date: Fri, 18 Sep 2020 17:53:44 +0900 From: Katsuragi Yuta To: pgsql-hackers@postgresql.org Subject: [PATCH] Add features to pg_stat_statements Message-ID: <0d9f1107772cf5c3f954e985464c7298@oss.nttdata.com> X-Sender: btkatsuragiyu@oss.nttdata.com User-Agent: Roundcube Webmail/1.1.9 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --=_c9853884815d3d0e5b0c45d3835a4dc8 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed This is a proposal to add some features to pg_stat_statements. Attached is the patch of this. pg_stat_statements uses a hash table to hold statistics, and the maximum number of its entries can be configured through pg_stat_statements.max. When the number of entries exceeds the pg_stat_statements.max, pg_stat_statements deallocate existing entries. Currently, it is impossible to know how many times/when this deallocation happened. But, with this information, more detailed performance analysis would be possible. So, this patch provides access to this information. This patch provides a view (pg_stat_statements_ctl) and a function (pg_stat_statements_ctl). The pg_stat_statements_ctl view is defined in terms of a function also named pg_stat_statements_ctl. The entry of pg_stat_statements_ctl view is removed when pg_stat_statements_reset(0,0,0) is called. Maybe, it is convenient to provide a function named pg_stat_statements_ctl_reset that removes only the entry of pg_stat_statements_ctl. The following is an example of this feature. Here, a deallocation is shown with the INFO message. pg_stat_statements_ctl tracks the number of deallocations and timestamp of last deallocation. testdb=# select * from pg_stat_statements_ctl; dealloc | last_dealloc ---------+------------------------------- 2 | 2020-09-18 16:55:31.128256+09 (1 row) testdb=# select count(*) from test1; 2020-09-18 16:59:20.745 JST [3920] INFO: deallocate 2020-09-18 16:59:20.745 JST [3920] STATEMENT: select count(*) from test1; INFO: deallocate count ------- 90 (1 row) testdb=# select * from pg_stat_statements_ctl; dealloc | last_dealloc ---------+------------------------------- 3 | 2020-09-18 16:59:20.745652+09 (1 row) Regards, Katsuragi Yuta --=_c9853884815d3d0e5b0c45d3835a4dc8 Content-Transfer-Encoding: base64 Content-Type: text/x-diff; charset=us-ascii; name=pg_stat_statements_ctl_v1.patch Content-Disposition: attachment; filename=pg_stat_statements_ctl_v1.patch; size=12403 ZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL01ha2VmaWxlIGIvY29udHJp Yi9wZ19zdGF0X3N0YXRlbWVudHMvTWFrZWZpbGUKaW5kZXggMDgxZjk5N2Q3MC4uNjNmZDQ4NzRi MSAxMDA2NDQKLS0tIGEvY29udHJpYi9wZ19zdGF0X3N0YXRlbWVudHMvTWFrZWZpbGUKKysrIGIv Y29udHJpYi9wZ19zdGF0X3N0YXRlbWVudHMvTWFrZWZpbGUKQEAgLTYsNyArNiw3IEBAIE9CSlMg PSBcCiAJcGdfc3RhdF9zdGF0ZW1lbnRzLm8KIAogRVhURU5TSU9OID0gcGdfc3RhdF9zdGF0ZW1l bnRzCi1EQVRBID0gcGdfc3RhdF9zdGF0ZW1lbnRzLS0xLjQuc3FsIFwKK0RBVEEgPSBwZ19zdGF0 X3N0YXRlbWVudHMtLTEuNC5zcWwgcGdfc3RhdF9zdGF0ZW1lbnRzLS0xLjgtLTEuOS5zcWxcCiAJ cGdfc3RhdF9zdGF0ZW1lbnRzLS0xLjctLTEuOC5zcWwgcGdfc3RhdF9zdGF0ZW1lbnRzLS0xLjYt LTEuNy5zcWwgXAogCXBnX3N0YXRfc3RhdGVtZW50cy0tMS41LS0xLjYuc3FsIHBnX3N0YXRfc3Rh dGVtZW50cy0tMS40LS0xLjUuc3FsIFwKIAlwZ19zdGF0X3N0YXRlbWVudHMtLTEuMy0tMS40LnNx bCBwZ19zdGF0X3N0YXRlbWVudHMtLTEuMi0tMS4zLnNxbCBcCmRpZmYgLS1naXQgYS9jb250cmli L3BnX3N0YXRfc3RhdGVtZW50cy9wZ19zdGF0X3N0YXRlbWVudHMtLTEuOC0tMS45LnNxbCBiL2Nv bnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3BnX3N0YXRfc3RhdGVtZW50cy0tMS44LS0xLjkuc3Fs Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAuLjQzYzc5NjY5NDYKLS0tIC9k ZXYvbnVsbAorKysgYi9jb250cmliL3BnX3N0YXRfc3RhdGVtZW50cy9wZ19zdGF0X3N0YXRlbWVu dHMtLTEuOC0tMS45LnNxbApAQCAtMCwwICsxLDE4IEBACisvKiBjb250cmliL3BnX3N0YXRfc3Rh dGVtZW50cy9wZ19zdGF0X3N0YXRlbWVudHMtLTEuOC0tMS45LnNxbCAqLworCistLSBjb21wbGFp biBpZiBzY3JpcHQgaXMgc291cmNlZCBpbiBwc3FsLCByYXRoZXIgdGhhbiB2aWEgQUxURVIgRVhU RU5TSU9OCitcZWNobyBVc2UgIkFMVEVSIEVYVEVOU0lPTiBwZ19zdGF0X3N0YXRlbWVudHMgVVBE QVRFIFRPICcxLjknIiB0byBsb2FkIHRoaXMgZmlsZS4gXHF1aXQKKworLS0tIERlZmluZSBwZ19z dGF0X3N0YXRlbWVudHNfY3RsCitDUkVBVEUgRlVOQ1RJT04gcGdfc3RhdF9zdGF0ZW1lbnRzX2N0 bCAoCisJT1VUIGRlYWxsb2MgaW50ZWdlciwKKwlPVVQgbGFzdF9kZWFsbG9jIFRJTUVTVEFNUCBX SVRIIFRJTUUgWk9ORQorKQorUkVUVVJOUyByZWNvcmQKK0FTICdNT0RVTEVfUEFUSE5BTUUnCitM QU5HVUFHRSAgQyBTVFJJQ1QgVk9MQVRJTEUgUEFSQUxMRUwgU0FGRTsKKworQ1JFQVRFIFZJRVcg cGdfc3RhdF9zdGF0ZW1lbnRzX2N0bCBBUworCVNFTEVDVCAqIEZST00gcGdfc3RhdF9zdGF0ZW1l bnRzX2N0bCgpOworCitHUkFOVCBTRUxFQ1QgT04gcGdfc3RhdF9zdGF0ZW1lbnRzIFRPIFBVQkxJ QzsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3BnX3N0YXRfc3RhdGVt ZW50cy5jIGIvY29udHJpYi9wZ19zdGF0X3N0YXRlbWVudHMvcGdfc3RhdF9zdGF0ZW1lbnRzLmMK aW5kZXggMWVhYzllZGFlZS4uYWExMTZkYjQ5OCAxMDA2NDQKLS0tIGEvY29udHJpYi9wZ19zdGF0 X3N0YXRlbWVudHMvcGdfc3RhdF9zdGF0ZW1lbnRzLmMKKysrIGIvY29udHJpYi9wZ19zdGF0X3N0 YXRlbWVudHMvcGdfc3RhdF9zdGF0ZW1lbnRzLmMKQEAgLTgxLDYgKzgxLDcgQEAKICNpbmNsdWRl ICJ1dGlscy9hY2wuaCIKICNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgogI2luY2x1ZGUgInV0 aWxzL21lbXV0aWxzLmgiCisjaW5jbHVkZSAidXRpbHMvdGltZXN0YW1wLmgiCiAKIFBHX01PRFVM RV9NQUdJQzsKIApAQCAtMTkzLDYgKzE5NCwxNyBAQCB0eXBlZGVmIHN0cnVjdCBDb3VudGVycwog CXVpbnQ2NAkJd2FsX2J5dGVzOwkJLyogdG90YWwgYW1vdW50IG9mIFdBTCBieXRlcyBnZW5lcmF0 ZWQgKi8KIH0gQ291bnRlcnM7CiAKKy8qCisgKiBDb3VudGVyIGZvciBwZ19zdGF0X3N0YXRlbWVu dHNfY3RsCisgKi8KK3R5cGVkZWYgc3RydWN0IHBnc3NDdGxDb3VudGVyCit7CisJaW50NjQJCWRl YWxsb2M7CS8qICMgb2YgZGVhbGxvY2F0aW9uICovCisJVGltZXN0YW1wVHoJbGFzdF9kZWFsbG9j OwkvKiB0aW1lc3RhbXAgb2YgbGFzdCBkZWFsbG9jYXRpb24gKi8KKwlib29sCQl0c19pc251bGw7 CS8qIGlmIHRydWUgbGFzdF9kZWFsbG9jIGlzIG51bGwgKi8KKwlzbG9ja190CQltdXRleDsKK30g cGdzc0N0bENvdW50ZXI7CisKIC8qCiAgKiBTdGF0aXN0aWNzIHBlciBzdGF0ZW1lbnQKICAqCkBA IC0yNzksNiArMjkxLDcgQEAgc3RhdGljIFByb2Nlc3NVdGlsaXR5X2hvb2tfdHlwZSBwcmV2X1By b2Nlc3NVdGlsaXR5ID0gTlVMTDsKIC8qIExpbmtzIHRvIHNoYXJlZCBtZW1vcnkgc3RhdGUgKi8K IHN0YXRpYyBwZ3NzU2hhcmVkU3RhdGUgKnBnc3MgPSBOVUxMOwogc3RhdGljIEhUQUIgKnBnc3Nf aGFzaCA9IE5VTEw7CitzdGF0aWMgcGdzc0N0bENvdW50ZXIgKnBnc3NfY3RsID0gTlVMTDsKIAog LyotLS0tIEdVQyB2YXJpYWJsZXMgLS0tLSovCiAKQEAgLTMyNyw2ICszNDAsNyBAQCBQR19GVU5D VElPTl9JTkZPX1YxKHBnX3N0YXRfc3RhdGVtZW50c18xXzIpOwogUEdfRlVOQ1RJT05fSU5GT19W MShwZ19zdGF0X3N0YXRlbWVudHNfMV8zKTsKIFBHX0ZVTkNUSU9OX0lORk9fVjEocGdfc3RhdF9z dGF0ZW1lbnRzXzFfOCk7CiBQR19GVU5DVElPTl9JTkZPX1YxKHBnX3N0YXRfc3RhdGVtZW50cyk7 CitQR19GVU5DVElPTl9JTkZPX1YxKHBnX3N0YXRfc3RhdGVtZW50c19jdGwpOwogCiBzdGF0aWMg dm9pZCBwZ3NzX3NobWVtX3N0YXJ0dXAodm9pZCk7CiBzdGF0aWMgdm9pZCBwZ3NzX3NobWVtX3No dXRkb3duKGludCBjb2RlLCBEYXR1bSBhcmcpOwpAQCAtMzgwLDYgKzM5NCw4IEBAIHN0YXRpYyBj aGFyICpnZW5lcmF0ZV9ub3JtYWxpemVkX3F1ZXJ5KHBnc3NKdW1ibGVTdGF0ZSAqanN0YXRlLCBj b25zdCBjaGFyICpxdWVyCiBzdGF0aWMgdm9pZCBmaWxsX2luX2NvbnN0YW50X2xlbmd0aHMocGdz c0p1bWJsZVN0YXRlICpqc3RhdGUsIGNvbnN0IGNoYXIgKnF1ZXJ5LAogCQkJCQkJCQkJIGludCBx dWVyeV9sb2MpOwogc3RhdGljIGludAljb21wX2xvY2F0aW9uKGNvbnN0IHZvaWQgKmEsIGNvbnN0 IHZvaWQgKmIpOworc3RhdGljIHZvaWQgdXBkYXRlX2N0bCh2b2lkKTsKK3N0YXRpYyB2b2lkIHJl c2V0X2N0bCh2b2lkKTsKIAogCiAvKgpAQCAtNTE4LDYgKzUzNCw3IEBAIHN0YXRpYyB2b2lkCiBw Z3NzX3NobWVtX3N0YXJ0dXAodm9pZCkKIHsKIAlib29sCQlmb3VuZDsKKwlib29sCQlmb3VuZF9j dGw7CiAJSEFTSENUTAkJaW5mbzsKIAlGSUxFCSAgICpmaWxlID0gTlVMTDsKIAlGSUxFCSAgICpx ZmlsZSA9IE5VTEw7CkBAIC01MzQsNiArNTUxLDcgQEAgcGdzc19zaG1lbV9zdGFydHVwKHZvaWQp CiAJLyogcmVzZXQgaW4gY2FzZSB0aGlzIGlzIGEgcmVzdGFydCB3aXRoaW4gdGhlIHBvc3RtYXN0 ZXIgKi8KIAlwZ3NzID0gTlVMTDsKIAlwZ3NzX2hhc2ggPSBOVUxMOworCXBnc3NfY3RsID0gTlVM TDsKIAogCS8qCiAJICogQ3JlYXRlIG9yIGF0dGFjaCB0byB0aGUgc2hhcmVkIG1lbW9yeSBzdGF0 ZSwgaW5jbHVkaW5nIGhhc2ggdGFibGUKQEAgLTU1Niw2ICs1NzQsMTcgQEAgcGdzc19zaG1lbV9z dGFydHVwKHZvaWQpCiAJCXBnc3MtPmdjX2NvdW50ID0gMDsKIAl9CiAKKwlwZ3NzX2N0bCA9IFNo bWVtSW5pdFN0cnVjdCgicGdfc3RhdF9zdGF0ZW1lbnRzIGN0bCIsCisJCQkJCQkJCXNpemVvZihw Z3NzQ3RsQ291bnRlciksCisJCQkJCQkJCSZmb3VuZF9jdGwpOworCWlmICghZm91bmRfY3RsKQor CXsKKwkJcGdzc19jdGwtPmRlYWxsb2MgPSAwOworCQlwZ3NzX2N0bC0+dHNfaXNudWxsID0gdHJ1 ZTsKKwkJU3BpbkxvY2tJbml0KCZwZ3NzX2N0bC0+bXV0ZXgpOworCQlBc3NlcnQocGdzc19jdGwt PmRlYWxsb2MgPT0gMCk7CisJfQorCiAJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOwog CWluZm8ua2V5c2l6ZSA9IHNpemVvZihwZ3NzSGFzaEtleSk7CiAJaW5mby5lbnRyeXNpemUgPSBz aXplb2YocGdzc0VudHJ5KTsKQEAgLTU3Nyw3ICs2MDYsMTAgQEAgcGdzc19zaG1lbV9zdGFydHVw KHZvaWQpCiAJICogRG9uZSBpZiBzb21lIG90aGVyIHByb2Nlc3MgYWxyZWFkeSBjb21wbGV0ZWQg b3VyIGluaXRpYWxpemF0aW9uLgogCSAqLwogCWlmIChmb3VuZCkKKwl7CisJCUFzc2VydChmb3Vu ZCA9PSBmb3VuZF9jdGwpOwogCQlyZXR1cm47CisJfQogCiAJLyoKIAkgKiBOb3RlOiB3ZSBkb24n dCBib3RoZXIgd2l0aCBsb2NrcyBoZXJlLCBiZWNhdXNlIHRoZXJlIHNob3VsZCBiZSBubyBvdGhl cgpAQCAtNjcyLDYgKzcwNCwxMiBAQCBwZ3NzX3NobWVtX3N0YXJ0dXAodm9pZCkKIAkJLyogY29w eSBpbiB0aGUgYWN0dWFsIHN0YXRzICovCiAJCWVudHJ5LT5jb3VudGVycyA9IHRlbXAuY291bnRl cnM7CiAJfQorCS8vIEFzc2VydChmZW9mKGZpbGUpICE9IDApOwkvLyBFT0YKKworCS8qIFJlYWQg cGdzc19jdGwgKi8KKwlpZiAoZmVvZihmaWxlKSA9PSAwKQorCQlpZiAoZnJlYWQocGdzc19jdGws IHNpemVvZihwZ3NzQ3RsQ291bnRlciksIDEsIGZpbGUpICE9IDEpCisJCQlnb3RvIHJlYWRfZXJy b3I7CiAKIAlwZnJlZShidWZmZXIpOwogCUZyZWVGaWxlKGZpbGUpOwpAQCAtNzQ4LDcgKzc4Niw3 IEBAIHBnc3Nfc2htZW1fc2h1dGRvd24oaW50IGNvZGUsIERhdHVtIGFyZykKIAkJcmV0dXJuOwog CiAJLyogU2FmZXR5IGNoZWNrIC4uLiBzaG91bGRuJ3QgZ2V0IGhlcmUgdW5sZXNzIHNobWVtIGlz IHNldCB1cC4gKi8KLQlpZiAoIXBnc3MgfHwgIXBnc3NfaGFzaCkKKwlpZiAoIXBnc3MgfHwgIXBn c3NfaGFzaCB8fCAhcGdzc19jdGwpCiAJCXJldHVybjsKIAogCS8qIERvbid0IGR1bXAgaWYgdG9s ZCBub3QgdG8uICovCkBAIC03OTQsNiArODMyLDEwIEBAIHBnc3Nfc2htZW1fc2h1dGRvd24oaW50 IGNvZGUsIERhdHVtIGFyZykKIAkJfQogCX0KIAorCS8qIER1bXAgcGdzc19jdGwgKi8KKwlpZiAo ZndyaXRlKHBnc3NfY3RsLCBzaXplb2YocGdzc0N0bENvdW50ZXIpLCAxLCBmaWxlKSAhPSAxKQor CQlnb3RvIGVycm9yOworCiAJZnJlZShxYnVmZmVyKTsKIAlxYnVmZmVyID0gTlVMTDsKIApAQCAt ODE4LDYgKzg2MCw3IEBAIGVycm9yOgogCQkJKGVycmNvZGVfZm9yX2ZpbGVfYWNjZXNzKCksCiAJ CQkgZXJybXNnKCJjb3VsZCBub3Qgd3JpdGUgZmlsZSBcIiVzXCI6ICVtIiwKIAkJCQkJUEdTU19E VU1QX0ZJTEUgIi50bXAiKSkpOworCiAJaWYgKHFidWZmZXIpCiAJCWZyZWUocWJ1ZmZlcik7CiAJ aWYgKGZpbGUpCkBAIC0xNDUzLDYgKzE0OTYsMzMgQEAgZG9uZToKIAkJcGZyZWUobm9ybV9xdWVy eSk7CiB9CiAKK3N0YXRpYyB2b2lkCit1cGRhdGVfY3RsKHZvaWQpCit7CisJVGltZXN0YW1wVHoJ Y3VycmVudF90cyA9IEdldEN1cnJlbnRUaW1lc3RhbXAoKTsKKworCXsKKwkJdm9sYXRpbGUgcGdz c0N0bENvdW50ZXIgKmMgPSAodm9sYXRpbGUgcGdzc0N0bENvdW50ZXIgKikgcGdzc19jdGw7CisJ CVNwaW5Mb2NrQWNxdWlyZSgmYy0+bXV0ZXgpOworCQlwZ3NzX2N0bC0+ZGVhbGxvYyArPSAxOwkv KiBpbmNyZW1lbnQgZGVhbGxvYyBjb3VudCAqLworCQlwZ3NzX2N0bC0+bGFzdF9kZWFsbG9jID0g Y3VycmVudF90czsKKwkJcGdzc19jdGwtPnRzX2lzbnVsbCA9IGZhbHNlOworCQlTcGluTG9ja1Jl bGVhc2UoJmMtPm11dGV4KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCityZXNldF9jdGwodm9pZCkK K3sKKwl7CisJCXZvbGF0aWxlIHBnc3NDdGxDb3VudGVyICpjID0gKHZvbGF0aWxlIHBnc3NDdGxD b3VudGVyICopIHBnc3NfY3RsOworCQlTcGluTG9ja0FjcXVpcmUoJmMtPm11dGV4KTsKKwkJcGdz c19jdGwtPmRlYWxsb2MgPSAwOwkvKiByZXNldCBkZWFsbG9jIGNvdW50ICovCisJCXBnc3NfY3Rs LT50c19pc251bGwgPSB0cnVlOworCQlTcGluTG9ja1JlbGVhc2UoJmMtPm11dGV4KTsKKwl9Cit9 CisKIC8qCiAgKiBSZXNldCBzdGF0ZW1lbnQgc3RhdGlzdGljcyBjb3JyZXNwb25kaW5nIHRvIHVz ZXJpZCwgZGJpZCwgYW5kIHF1ZXJ5aWQuCiAgKi8KQEAgLTE0OTAsNiArMTU2MCw3IEBAIHBnX3N0 YXRfc3RhdGVtZW50c19yZXNldChQR19GVU5DVElPTl9BUkdTKQogI2RlZmluZSBQR19TVEFUX1NU QVRFTUVOVFNfQ09MU19WMV8zCTIzCiAjZGVmaW5lIFBHX1NUQVRfU1RBVEVNRU5UU19DT0xTX1Yx XzgJMzIKICNkZWZpbmUgUEdfU1RBVF9TVEFURU1FTlRTX0NPTFMJCQkzMgkvKiBtYXhpbXVtIG9m IGFib3ZlICovCisjZGVmaW5lIFBHX1NUQVRfU1RBVEVNRU5UU19DVExfQ09MUwkJMgogCiAvKgog ICogUmV0cmlldmUgc3RhdGVtZW50IHN0YXRpc3RpY3MuCkBAIC0xODYyLDYgKzE5MzMsNDQgQEAg cGdfc3RhdF9zdGF0ZW1lbnRzX2ludGVybmFsKEZ1bmN0aW9uQ2FsbEluZm8gZmNpbmZvLAogCXR1 cGxlc3RvcmVfZG9uZXN0b3JpbmcodHVwc3RvcmUpOwogfQogCitEYXR1bQorcGdfc3RhdF9zdGF0 ZW1lbnRzX2N0bChQR19GVU5DVElPTl9BUkdTKQoreworCVR1cGxlRGVzYwl0dXBkZXNjOworCUhl YXBUdXBsZQlyZXN1bHRfdHVwbGU7CisJRGF0dW0JCXJlc3VsdDsKKwlEYXR1bSAJCXZhbHVlc1tQ R19TVEFUX1NUQVRFTUVOVFNfQ1RMX0NPTFNdOworCWJvb2wgCQludWxsc1tQR19TVEFUX1NUQVRF TUVOVFNfQ1RMX0NPTFNdOworCWJvb2wJCXRzX2lzbnVsbDsKKwlpbnQgCQlpID0gMDsKKworCUFz c2VydChQR19TVEFUX1NUQVRFTUVOVFNfQ1RMX0NPTFMgPT0gMik7CisKKwlpZiAoZ2V0X2NhbGxf cmVzdWx0X3R5cGUoZmNpbmZvLCBOVUxMLCAmdHVwZGVzYykgIT0gVFlQRUZVTkNfQ09NUE9TSVRF KQorCQllbG9nKEVSUk9SLCAicmV0dXJuIHR5cGUgbXVzdCBiZSBhIHJvdyB0eXBlIik7CisKKwl0 dXBkZXNjID0gQmxlc3NUdXBsZURlc2ModHVwZGVzYyk7CisKKwltZW1zZXQobnVsbHMsIDAsIHNp emVvZihudWxscykpOworCisJeworCQl2b2xhdGlsZSBwZ3NzQ3RsQ291bnRlciAqYyA9ICh2b2xh dGlsZSBwZ3NzQ3RsQ291bnRlciAqKSBwZ3NzX2N0bDsKKwkJU3BpbkxvY2tBY3F1aXJlKCZjLT5t dXRleCk7CisJCXZhbHVlc1tpKytdID0gSW50NjRHZXREYXR1bShwZ3NzX2N0bC0+ZGVhbGxvYyk7 CisJCXRzX2lzbnVsbCA9IHBnc3NfY3RsLT50c19pc251bGw7CisJCWlmICghdHNfaXNudWxsKQor CQkJdmFsdWVzW2krK10gPSBUaW1lc3RhbXBUekdldERhdHVtKHBnc3NfY3RsLT5sYXN0X2RlYWxs b2MpOworCQllbHNlCisJCQludWxsc1tpKytdID0gdHJ1ZTsKKwkJU3BpbkxvY2tSZWxlYXNlKCZj LT5tdXRleCk7CisJfQorCisJcmVzdWx0X3R1cGxlID0gaGVhcF9mb3JtX3R1cGxlKHR1cGRlc2Ms IHZhbHVlcywgbnVsbHMpOworCXJlc3VsdCA9IEhlYXBUdXBsZUdldERhdHVtKHJlc3VsdF90dXBs ZSk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCiAvKgogICogRXN0aW1hdGUgc2hhcmVkIG1lbW9y eSBzcGFjZSBuZWVkZWQuCiAgKi8KQEAgLTE4NzIsNiArMTk4MSw3IEBAIHBnc3NfbWVtc2l6ZSh2 b2lkKQogCiAJc2l6ZSA9IE1BWEFMSUdOKHNpemVvZihwZ3NzU2hhcmVkU3RhdGUpKTsKIAlzaXpl ID0gYWRkX3NpemUoc2l6ZSwgaGFzaF9lc3RpbWF0ZV9zaXplKHBnc3NfbWF4LCBzaXplb2YocGdz c0VudHJ5KSkpOworCXNpemUgPSBhZGRfc2l6ZShzaXplLCBNQVhBTElHTihzaXplb2YocGdzc0N0 bENvdW50ZXIpKSk7CiAKIAlyZXR1cm4gc2l6ZTsKIH0KQEAgLTE5MDIsNyArMjAxMiwxMCBAQCBl bnRyeV9hbGxvYyhwZ3NzSGFzaEtleSAqa2V5LCBTaXplIHF1ZXJ5X29mZnNldCwgaW50IHF1ZXJ5 X2xlbiwgaW50IGVuY29kaW5nLAogCiAJLyogTWFrZSBzcGFjZSBpZiBuZWVkZWQgKi8KIAl3aGls ZSAoaGFzaF9nZXRfbnVtX2VudHJpZXMocGdzc19oYXNoKSA+PSBwZ3NzX21heCkKKwl7CiAJCWVu dHJ5X2RlYWxsb2MoKTsKKwkJdXBkYXRlX2N0bCgpOworCX0KIAogCS8qIEZpbmQgb3IgY3JlYXRl IGFuIGVudHJ5IHdpdGggZGVzaXJlZCBoYXNoIGNvZGUgKi8KIAllbnRyeSA9IChwZ3NzRW50cnkg KikgaGFzaF9zZWFyY2gocGdzc19oYXNoLCBrZXksIEhBU0hfRU5URVIsICZmb3VuZCk7CkBAIC0y NTAzLDYgKzI2MTYsOSBAQCBlbnRyeV9yZXNldChPaWQgdXNlcmlkLCBPaWQgZGJpZCwgdWludDY0 IHF1ZXJ5aWQpCiAJCQloYXNoX3NlYXJjaChwZ3NzX2hhc2gsICZlbnRyeS0+a2V5LCBIQVNIX1JF TU9WRSwgTlVMTCk7CiAJCQludW1fcmVtb3ZlKys7CiAJCX0KKworCQkvKiBSZXNldCBwZ3NzX2N0 bCAqLworCQlyZXNldF9jdGwoKTsKIAl9CiAKIAkvKiBBbGwgZW50cmllcyBhcmUgcmVtb3ZlZD8g Ki8KZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3BnX3N0YXRfc3RhdGVt ZW50cy5jb250cm9sIGIvY29udHJpYi9wZ19zdGF0X3N0YXRlbWVudHMvcGdfc3RhdF9zdGF0ZW1l bnRzLmNvbnRyb2wKaW5kZXggNjViMThiMTFkMi4uMmYxY2U2ZWQ1MCAxMDA2NDQKLS0tIGEvY29u dHJpYi9wZ19zdGF0X3N0YXRlbWVudHMvcGdfc3RhdF9zdGF0ZW1lbnRzLmNvbnRyb2wKKysrIGIv Y29udHJpYi9wZ19zdGF0X3N0YXRlbWVudHMvcGdfc3RhdF9zdGF0ZW1lbnRzLmNvbnRyb2wKQEAg LTEsNSArMSw1IEBACiAjIHBnX3N0YXRfc3RhdGVtZW50cyBleHRlbnNpb24KIGNvbW1lbnQgPSAn dHJhY2sgcGxhbm5pbmcgYW5kIGV4ZWN1dGlvbiBzdGF0aXN0aWNzIG9mIGFsbCBTUUwgc3RhdGVt ZW50cyBleGVjdXRlZCcKLWRlZmF1bHRfdmVyc2lvbiA9ICcxLjgnCitkZWZhdWx0X3ZlcnNpb24g PSAnMS45JwogbW9kdWxlX3BhdGhuYW1lID0gJyRsaWJkaXIvcGdfc3RhdF9zdGF0ZW1lbnRzJwog cmVsb2NhdGFibGUgPSB0cnVlCmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvcGdzdGF0c3RhdGVt ZW50cy5zZ21sIGIvZG9jL3NyYy9zZ21sL3Bnc3RhdHN0YXRlbWVudHMuc2dtbAppbmRleCBjZjJk MjViN2IyLi42MDU3OTVmZTgwIDEwMDY0NAotLS0gYS9kb2Mvc3JjL3NnbWwvcGdzdGF0c3RhdGVt ZW50cy5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC9wZ3N0YXRzdGF0ZW1lbnRzLnNnbWwKQEAgLTIz LDEwICsyMywxMSBAQAogIDxwYXJhPgogICAgV2hlbiA8ZmlsZW5hbWU+cGdfc3RhdF9zdGF0ZW1l bnRzPC9maWxlbmFtZT4gaXMgbG9hZGVkLCBpdCB0cmFja3MKICAgIHN0YXRpc3RpY3MgYWNyb3Nz IGFsbCBkYXRhYmFzZXMgb2YgdGhlIHNlcnZlci4gIFRvIGFjY2VzcyBhbmQgbWFuaXB1bGF0ZQot ICAgdGhlc2Ugc3RhdGlzdGljcywgdGhlIG1vZHVsZSBwcm92aWRlcyBhIHZpZXcsIDxzdHJ1Y3Ru YW1lPnBnX3N0YXRfc3RhdGVtZW50czwvc3RydWN0bmFtZT4sCi0gICBhbmQgdGhlIHV0aWxpdHkg ZnVuY3Rpb25zIDxmdW5jdGlvbj5wZ19zdGF0X3N0YXRlbWVudHNfcmVzZXQ8L2Z1bmN0aW9uPiBh bmQKLSAgIDxmdW5jdGlvbj5wZ19zdGF0X3N0YXRlbWVudHM8L2Z1bmN0aW9uPi4gIFRoZXNlIGFy ZSBub3QgYXZhaWxhYmxlIGdsb2JhbGx5IGJ1dAotICAgY2FuIGJlIGVuYWJsZWQgZm9yIGEgc3Bl Y2lmaWMgZGF0YWJhc2Ugd2l0aAorICAgdGhlc2Ugc3RhdGlzdGljcywgdGhlIG1vZHVsZSBwcm92 aWRlcyB2aWV3cywgPHN0cnVjdG5hbWU+cGdfc3RhdF9zdGF0ZW1lbnRzPC9zdHJ1Y3RuYW1lPgor ICAgYW5kIDxzdHJ1Y3RuYW1lPnBnX3N0YXRfc3RhdGVtZW50c19jdGw8L3N0cnVjdG5hbWU+LAor ICAgYW5kIHRoZSB1dGlsaXR5IGZ1bmN0aW9ucyA8ZnVuY3Rpb24+cGdfc3RhdF9zdGF0ZW1lbnRz X3Jlc2V0PC9mdW5jdGlvbj4sCisgICA8ZnVuY3Rpb24+cGdfc3RhdF9zdGF0ZW1lbnRzPC9mdW5j dGlvbj4sIGFuZCA8ZnVuY3Rpb24+cGdfc3RhdF9zdGF0ZW1lbnRzX2N0bDwvZnVuY3Rpb24+Lgor ICAgVGhlc2UgYXJlIG5vdCBhdmFpbGFibGUgZ2xvYmFsbHkgYnV0IGNhbiBiZSBlbmFibGVkIGZv ciBhIHNwZWNpZmljIGRhdGFiYXNlIHdpdGgKICAgIDxjb21tYW5kPkNSRUFURSBFWFRFTlNJT04g cGdfc3RhdF9zdGF0ZW1lbnRzPC9jb21tYW5kPi4KICA8L3BhcmE+CiAKQEAgLTQ4MCw2ICs0ODEs NTcgQEAKICAgPC9wYXJhPgogIDwvc2VjdDI+CiAKKyA8c2VjdDI+CisgIDx0aXRsZT5UaGUgPHN0 cnVjdG5hbWU+cGdfc3RhdF9zdGF0ZW1lbnRzX2N0bDwvc3RydWN0bmFtZT4gVmlldzwvdGl0bGU+ CisKKyAgPHBhcmE+CisgICBUaGlzIG1vZHVsZSB0cmFja3Mgc3RhdGlzdGljcyBvZiA8ZmlsZW5h bWU+cGdfc3RhdF9zdGF0ZW1lbnRzPC9maWxlbmFtZT4KKyAgIGl0c2VsZiBmb3IgZGV0YWlsZWQg cGVyZm9ybWFuY2UgYW5hbHlzaXMuCisgICBUaGUgc3RhdGlzdGljcyBvZiBwZ19zdGF0X3N0YXRl bWVudHMgaXRzZWxmIGFyZSBtYWRlIGF2YWlsYWJsZSB2aWEgYQorICAgdmlldyBuYW1lZCA8c3Ry dWN0bmFtZT5wZ19zdGF0X3N0YXRlbWVudHNfY3RsPC9zdHJ1Y3RuYW1lPi4KKyAgIFRoaXMgdmll dyBjb250YWlucyBvbmx5IGEgc2luZ2xlIHJvdy4KKyAgIFRoZSByb3cgaXMgcmVzZXQgb25seSB3 aGVuIDxmdW5jdGlvbj5wZ19zdGF0X3N0YXRlbWVudHNfcmVzZXQoMCwwLDApPC9mdW5jdGlvbj4K KyAgIGlzIGNhbGxlZC4gVGhlIGNvbHVtbnMgb2YgdGhlIHZpZXcgYXJlCisgICBzaG93biBpbiA8 eHJlZiBsaW5rZW5kPSJwZ3N0YXRzdGF0ZW1lbnRzY3RsLWNvbHVtbnMiLz4uCisgIDwvcGFyYT4K KworICA8dGFibGUgaWQ9InBnc3RhdHN0YXRlbWVudHNjdGwtY29sdW1ucyI+CisgICA8dGl0bGU+ PHN0cnVjdG5hbWU+cGdfc3RhdF9zdGF0ZW1lbnRzX2N0bDwvc3RydWN0bmFtZT4gQ29sdW1uczwv dGl0bGU+CisgICA8dGdyb3VwIGNvbHM9IjEiPgorICAgIDx0aGVhZD4KKyAgICAgPHJvdz4KKyAg ICAgIDxlbnRyeSByb2xlPSJjYXRhbG9nX3RhYmxlX2VudHJ5Ij48cGFyYSByb2xlPSJjb2x1bW5f ZGVmaW5pdGlvbiI+CisgICAgICAgQ29sdW1uIFR5cGUKKyAgICAgIDwvcGFyYT4KKyAgICAgIDxw YXJhPgorICAgICAgIERlc2NyaXB0aW9uCisgICAgICA8L3BhcmE+PC9lbnRyeT4KKyAgICAgPC9y b3c+CisgICAgPC90aGVhZD4KKworICAgIDx0Ym9keT4KKyAgICAgPHJvdz4KKyAgICAgIDxlbnRy eSByb2xlPSJjYXRhbG9nX3RhYmxlX2VudHJ5Ij48cGFyYSByb2xlPSJjb2x1bW5fZGVmaW5pdGlv biI+CisgICAgICAgPHN0cnVjdGZpZWxkPmRlYWxsb2M8L3N0cnVjdGZpZWxkPiA8dHlwZT5iaWdp bnQ8L3R5cGU+CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICBUb3RhbCBudW1i ZXIgb2YgZGVhbGxvY2F0aW9ucyBvZiBwZ19zdGF0X3N0YXRlbWVudHMgdmlldyBlbnRyeQorICAg ICAgPC9wYXJhPjwvZW50cnk+CisgICAgIDwvcm93PgorCisgICAgIDxyb3c+CisgICAgICA8ZW50 cnkgcm9sZT0iY2F0YWxvZ190YWJsZV9lbnRyeSI+PHBhcmEgcm9sZT0iY29sdW1uX2RlZmluaXRp b24iPgorICAgICAgIDxzdHJ1Y3RmaWVsZD5sYXN0X2RlYWxsb2M8L3N0cnVjdGZpZWxkPiA8dHlw ZT50aW1lc3RhbXAgd2l0aCB0aW1lIHpvbmU8L3R5cGU+CisgICAgICA8L3BhcmE+CisgICAgICA8 cGFyYT4KKyAgICAgICBUaGUgdGltZXN0YW1wIG9mIGxhc3QgZGVhbGxvY2F0aW9uCisgICAgICA8 L3BhcmE+PC9lbnRyeT4KKyAgICAgPC9yb3c+CisgICAgPC90Ym9keT4KKyAgIDwvdGdyb3VwPgor ICA8L3RhYmxlPgorIDwvc2VjdDI+CisKICA8c2VjdDI+CiAgIDx0aXRsZT5GdW5jdGlvbnM8L3Rp dGxlPgogCkBAIC01MzcsNiArNTg5LDI0IEBACiAgICAgIDwvcGFyYT4KICAgICA8L2xpc3RpdGVt PgogICAgPC92YXJsaXN0ZW50cnk+CisKKyAgIDx2YXJsaXN0ZW50cnk+CisgICAgPHRlcm0+Cisg ICAgIDxmdW5jdGlvbj5wZ19zdGF0X3N0YXRlbWVudHNfY3RsKCkgcmV0dXJucyByZWNvcmQ8L2Z1 bmN0aW9uPgorICAgICA8aW5kZXh0ZXJtPgorICAgICAgPHByaW1hcnk+cGdfc3RhdF9zdGF0ZW1l bnRzX2N0bDwvcHJpbWFyeT4KKyAgICAgPC9pbmRleHRlcm0+CisgICAgPC90ZXJtPgorCisgICAg PGxpc3RpdGVtPgorICAgICA8cGFyYT4KKyAgICAgIFRoZSA8c3RydWN0bmFtZT5wZ19zdGF0X3N0 YXRlbWVudHNfY3RsPC9zdHJ1Y3RuYW1lPiB2aWV3IGlzIGRlZmluZWQKKyAgICAgIGluIHRlcm1z IG9mIGEgZnVuY3Rpb24gYWxzbyBuYW1lZCA8ZnVuY3Rpb24+cGdfc3RhdF9zdGF0ZW1lbnRzX2N0 bDwvZnVuY3Rpb24+LgorICAgICAgSXQgaXMgcG9zc2libGUgZm9yIGNsaWVudHMgdG8gY2FsbCB0 aGUgCisgICAgICA8ZnVuY3Rpb24+cGdfc3RhdF9zdGF0ZW1lbnRzX2N0bDwvZnVuY3Rpb24+IGRp cmVjdGx5LgorICAgICA8L3BhcmE+CisgICAgPC9saXN0aXRlbT4KKyAgIDwvdmFybGlzdGVudHJ5 PgogICA8L3ZhcmlhYmxlbGlzdD4KICA8L3NlY3QyPgogCg== --=_c9853884815d3d0e5b0c45d3835a4dc8--