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 1rUo7Y-00D8Un-UQ for pgsql-hackers@arkaria.postgresql.org; Tue, 30 Jan 2024 13:25:50 +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 1rUo7X-005f5A-QO for pgsql-hackers@arkaria.postgresql.org; Tue, 30 Jan 2024 13:25:47 +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 1rUo7W-005f51-Vg for pgsql-hackers@lists.postgresql.org; Tue, 30 Jan 2024 13:25:47 +0000 Received: from mail-177132.yeah.net ([123.58.177.132]) by magus.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1rUo7R-004WvT-Kd for pgsql-hackers@lists.postgresql.org; Tue, 30 Jan 2024 13:25:46 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yeah.net; s=s110527; h=Content-Type:Message-ID:Date:MIME-Version:Subject: From; bh=EkvDntQGBxf31anvBwj3GUn5DohsouClQBFGO3BiiCE=; b=JmDdnEZ KGaZ6AqjUYx7qgYkhd1LycGYcWt7ta9JhhcoRVKySA9FvgDpjxNwO3dfTeP8WKyr 9veerFsPwfMyjyGsk+YDjDDMsTypPnsrXyHm1YWJLsDYpkzq07Cu+9mpDTSKmHeo Cn3cdZC9UMzTydqxzHzCejMXUoZTiNWSMXu4= Received: from [192.168.1.50] (unknown [117.14.138.23]) by smtp2 (Coremail) with SMTP id C1UQrADnLyvP+LhlXj96Ag--.37777S2; Tue, 30 Jan 2024 21:25:36 +0800 (CST) Content-Type: multipart/mixed; boundary="------------QjEeMMJzFkB0Si1E9GJBeB9f" Message-ID: Date: Tue, 30 Jan 2024 21:25:35 +0800 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Improvement discussion of custom and generic plans To: pgsql-hackers@lists.postgresql.org References: <9365b39d-a748-4e61-9396-466689ea0aa5@yeah.net> Content-Language: en-US From: Quan Zongliang In-Reply-To: <9365b39d-a748-4e61-9396-466689ea0aa5@yeah.net> X-CM-TRANSID: C1UQrADnLyvP+LhlXj96Ag--.37777S2 X-Coremail-Antispam: 1Uf129KBjvJXoWxXr17WFyUZFyUXr1fur4Uurg_yoWrtF1kpr Z5Kr17GF97JFs5AryUJF4ktry5Gr4rJa1fJF1kJFy0yF45Gr1YvF48XrZI9rW7K3yxXryU Xr4Utrn09r1YyrJanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x07UEPfdUUUUU= X-Originating-IP: [117.14.138.23] X-CM-SenderInfo: htxd06xrqjzxxdqjq5hhdkh0dhw/1tbiDRB1JFszXMPLbQAAsd 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. --------------QjEeMMJzFkB0Si1E9GJBeB9f Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 2023/11/3 15:27, Quan Zongliang wrote: > Hi > > We have one such problem. A table field has skewed data. Statistics: > n_distinct             | -0.4481973 > most_common_vals       | {5f006ca25b52ed78e457b150ee95a30c} > most_common_freqs      | {0.5518474} > > > Data generation: > > CREATE TABLE s_user ( >      user_id varchar(32) NOT NULL, >      corp_id varchar(32), >      status int NOT NULL >  ); > > insert into s_user > select md5('user_id ' || a), md5('corp_id ' || a), >      case random()<0.877675 when true then 1 else -1 end >   FROM generate_series(1,10031) a; > > insert into s_user > select md5('user_id ' || a), md5('corp_id 10032'), >      case random()<0.877675 when true then 1 else -1 end >   FROM generate_series(10031,22383) a; > > CREATE INDEX s_user_corp_id_idx ON s_user USING btree (corp_id); > > analyze s_user; > > > 1. First, define a PREPARE statement > prepare stmt as select count(*) from s_user where status=1 and corp_id = > $1; > > 2. Run it five times. Choose the custom plan. > explain (analyze,buffers) execute stmt('5f006ca25b52ed78e457b150ee95a30c'); > > Here's the plan: >  Aggregate  (cost=639.84..639.85 rows=1 width=8) (actual > time=4.653..4.654 rows=1 loops=1) >    Buffers: shared hit=277 >    ->  Seq Scan on s_user  (cost=0.00..612.76 rows=10830 width=0) > (actual time=1.402..3.747 rows=10836 loops=1) >          Filter: ((status = 1) AND ((corp_id)::text = > '5f006ca25b52ed78e457b150ee95a30c'::text)) >          Rows Removed by Filter: 11548 >          Buffers: shared hit=277 >  Planning Time: 0.100 ms >  Execution Time: 4.674 ms > (8 rows) > > 3.From the sixth time. Choose generic plan. > We can see that there is a huge deviation between the estimate and the > actual value: >  Aggregate  (cost=11.83..11.84 rows=1 width=8) (actual > time=4.424..4.425 rows=1 loops=1) >    Buffers: shared hit=154 read=13 >    ->  Bitmap Heap Scan on s_user  (cost=4.30..11.82 rows=2 width=0) > (actual time=0.664..3.371 rows=10836 loops=1) >          Recheck Cond: ((corp_id)::text = $1) >          Filter: (status = 1) >          Rows Removed by Filter: 1517 >          Heap Blocks: exact=154 >          Buffers: shared hit=154 read=13 >          ->  Bitmap Index Scan on s_user_corp_id_idx  (cost=0.00..4.30 > rows=2 width=0) (actual time=0.635..0.635 rows=12353 loops=1) >                Index Cond: ((corp_id)::text = $1) >                Buffers: shared read=13 >  Planning Time: 0.246 ms >  Execution Time: 4.490 ms > (13 rows) > > This is because in the choose_custom_plan function, the generic plan is > attempted after executing the custom plan five times. > >     if (plansource->num_custom_plans < 5) >         return true; > > The generic plan uses var_eq_non_const to estimate the average selectivity. > > These are facts that many people already know. So a brief introduction. > > > Our users actually use such parameter conditions in very complex PREPARE > statements. Once they use the generic plan for the sixth time. The > execution time will change from 5 milliseconds to 5 minutes. > > > To improve this problem. The following approaches can be considered: > > 1. Determine whether data skew exists in the PREPARE statement parameter > conditions based on the statistics. > However, there is no way to know if the user will use the skewed parameter. > > 2.When comparing the cost of the generic plan with the average cost of > the custom plan(function choose_custom_plan). Consider whether the > maximum cost of a custom plan executed is an order of magnitude > different from the cost of a generic plan. > If the first five use a small selectivity condition. And after the sixth > use a high selectivity condition. Problems will still arise. > > 3.Trace the execution time of the PREPARE statement. When an execution > time is found to be much longer than the average execution time, the > custom plan is forced to run. > > > Is there any better idea? > I tried to do a demo. Add a member paramid to Const. When Const is generated by Param, the Const is identified as coming from Param. Then check in var_eq_const to see if the field in the condition using this parameter is skewed. If so, choose_custom_plan returns true every time, forcing custom_plan to be used. Only conditional expressions such as var eq param or param eq var can be supported. If it makes sense. Continue to improve this patch. > -- > Quan Zongliang > > --------------QjEeMMJzFkB0Si1E9GJBeB9f Content-Type: text/plain; charset=UTF-8; name="skewedparam.patch" Content-Disposition: attachment; filename="skewedparam.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL2NsYXVzZXMuYyBiL3Ny Yy9iYWNrZW5kL29wdGltaXplci91dGlsL2NsYXVzZXMuYwppbmRleCA5NGViNTZhMWU3Li4z Mzg0NTIwZGMxIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9jbGF1 c2VzLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvY2xhdXNlcy5jCkBAIC0y NDg5LDYgKzI0ODksOCBAQCBldmFsX2NvbnN0X2V4cHJlc3Npb25zX211dGF0b3IoTm9kZSAq bm9kZSwKIAkJCQkJCQkJCQkJcHZhbCwKIAkJCQkJCQkJCQkJcHJtLT5pc251bGwsCiAJCQkJ CQkJCQkJCXR5cEJ5VmFsKTsKKwkJCQkJCQlpZiAocGFyYW1MSS0+cGFyYW1GZXRjaCA9PSBO VUxMKQorCQkJCQkJCQljb24tPnBhcmFtaWQgPSBwYXJhbS0+cGFyYW1pZDsKIAkJCQkJCQlj b24tPmxvY2F0aW9uID0gcGFyYW0tPmxvY2F0aW9uOwogCQkJCQkJCXJldHVybiAoTm9kZSAq KSBjb247CiAJCQkJCQl9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvc2Vs ZnVuY3MuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9zZWxmdW5jcy5jCmluZGV4IGNlYTc3 N2U5ZDQuLjYyZGUxMjQ2NDMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9z ZWxmdW5jcy5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9zZWxmdW5jcy5jCkBAIC0y NzMsMTAgKzI3MywzMiBAQCBlcXNlbF9pbnRlcm5hbChQR19GVU5DVElPTl9BUkdTLCBib29s IG5lZ2F0ZSkKIAkgKiBpbiB0aGUgcXVlcnkuKQogCSAqLwogCWlmIChJc0Eob3RoZXIsIENv bnN0KSkKLQkJc2VsZWMgPSB2YXJfZXFfY29uc3QoJnZhcmRhdGEsIG9wZXJhdG9yLCBjb2xs YXRpb24sCi0JCQkJCQkJICgoQ29uc3QgKikgb3RoZXIpLT5jb25zdHZhbHVlLAotCQkJCQkJ CSAoKENvbnN0ICopIG90aGVyKS0+Y29uc3Rpc251bGwsCi0JCQkJCQkJIHZhcm9ubGVmdCwg bmVnYXRlKTsKKwl7CisJCUNvbnN0ICogY29uID0gKENvbnN0ICopIG90aGVyOworCisJCWlm IChjb24tPnBhcmFtaWQgPiAwKQorCQl7CisJCQlib29sCXNrZXdlZF9zdGF0ID0gZmFsc2U7 CisKKwkJCXNlbGVjID0gdmFyX2VxX2NvbnN0X2V4dCgmdmFyZGF0YSwgb3BlcmF0b3IsIGNv bGxhdGlvbiwKKwkJCQkJCQkJKChDb25zdCAqKSBvdGhlciktPmNvbnN0dmFsdWUsCisJCQkJ CQkJCSgoQ29uc3QgKikgb3RoZXIpLT5jb25zdGlzbnVsbCwKKwkJCQkJCQkJdmFyb25sZWZ0 LCBuZWdhdGUsICZza2V3ZWRfc3RhdCk7CisKKwkJCWlmIChza2V3ZWRfc3RhdCkKKwkJCXsK KwkJCQlQYXJhbUV4dGVybkRhdGEgKnBybTsKKworCQkJCXBybSA9ICZyb290LT5nbG9iLT5i b3VuZFBhcmFtcy0+cGFyYW1zW2Nvbi0+cGFyYW1pZCAtIDFdOworCQkJCXBybS0+cGZsYWdz IHw9IFBBUkFNX0ZMQUdfU0tFV0VEU1RBVDsKKwkJCX0KKwkJfQorCQllbHNlCisJCQlzZWxl YyA9IHZhcl9lcV9jb25zdCgmdmFyZGF0YSwgb3BlcmF0b3IsIGNvbGxhdGlvbiwKKwkJCQkJ CQkJKChDb25zdCAqKSBvdGhlciktPmNvbnN0dmFsdWUsCisJCQkJCQkJCSgoQ29uc3QgKikg b3RoZXIpLT5jb25zdGlzbnVsbCwKKwkJCQkJCQkJdmFyb25sZWZ0LCBuZWdhdGUpOworCX0K IAllbHNlCiAJCXNlbGVjID0gdmFyX2VxX25vbl9jb25zdCgmdmFyZGF0YSwgb3BlcmF0b3Is IGNvbGxhdGlvbiwgb3RoZXIsCiAJCQkJCQkJCSB2YXJvbmxlZnQsIG5lZ2F0ZSk7CkBAIC0y OTUsNiArMzE3LDE2IEBAIGRvdWJsZQogdmFyX2VxX2NvbnN0KFZhcmlhYmxlU3RhdERhdGEg KnZhcmRhdGEsIE9pZCBvcHJvaWQsIE9pZCBjb2xsYXRpb24sCiAJCQkgRGF0dW0gY29uc3R2 YWwsIGJvb2wgY29uc3Rpc251bGwsCiAJCQkgYm9vbCB2YXJvbmxlZnQsIGJvb2wgbmVnYXRl KQoreworCXJldHVybiB2YXJfZXFfY29uc3RfZXh0KHZhcmRhdGEsIG9wcm9pZCwgY29sbGF0 aW9uLAorCQkJIGNvbnN0dmFsLCBjb25zdGlzbnVsbCwKKwkJCSB2YXJvbmxlZnQsIG5lZ2F0 ZSwgTlVMTCk7Cit9CisKK2RvdWJsZQordmFyX2VxX2NvbnN0X2V4dChWYXJpYWJsZVN0YXRE YXRhICp2YXJkYXRhLCBPaWQgb3Byb2lkLCBPaWQgY29sbGF0aW9uLAorCQkJIERhdHVtIGNv bnN0dmFsLCBib29sIGNvbnN0aXNudWxsLAorCQkJIGJvb2wgdmFyb25sZWZ0LCBib29sIG5l Z2F0ZSwgYm9vbCAqc2tld2VkX3N0YXQpCiB7CiAJZG91YmxlCQlzZWxlYzsKIAlkb3VibGUJ CW51bGxmcmFjID0gMC4wOwpAQCAtMzg3LDYgKzQxOSwzNyBAQCB2YXJfZXFfY29uc3QoVmFy aWFibGVTdGF0RGF0YSAqdmFyZGF0YSwgT2lkIG9wcm9pZCwgT2lkIGNvbGxhdGlvbiwKIAkJ CQkJYnJlYWs7CiAJCQkJfQogCQkJfQorCisJCQlBc3NlcnQoc3Nsb3QubnZhbHVlcyA+IDAp OworCQkJaWYgKHNrZXdlZF9zdGF0KQorCQkJeworCQkJCS8qIENoZWNrIHdoZXRoZXIgdGhl IHZhbHVlcyBvZiB0aGUgZmllbGQgaXMgc2tld2VkIGFjY29yZGluZyB0byB0aGUgTUNWcy4g Ki8KKwkJCQlpZiAoc3Nsb3QubnZhbHVlcyA+IDEgJiYKKwkJCQkJCXNzbG90Lm51bWJlcnNb MF0gPiBzc2xvdC5udW1iZXJzW3NzbG90Lm52YWx1ZXMgLSAxXSAqIDEwKQorCQkJCQkvKiBD b21wYXJlIHRoZSBtYXhpbXVtIGFuZCBtaW5pbXVtIHF1YW50aXRpZXMgaW4gdGhlIE1DVnMu ICovCisJCQkJCSpza2V3ZWRfc3RhdCA9IHRydWU7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJ LyoKKwkJCQkJICogQ29tcGFyZSB0aGUgbWF4aW11bSBudW1iZXIgaW4gdGhlIE1DVnMgd2l0 aCB0aGUgYXZlcmFnZSBudW1iZXIgb2YKKwkJCQkJICogb3RoZXIgdmFsdWVzKG5vdCBpbiB0 aGUgTUNWcykuCisJCQkJCSAqLworCQkJCQlkb3VibGUJCXN1bWNvbW1vbiA9IDAuMDsKKwkJ CQkJZG91YmxlCQlvdGhlcmRpc3RpbmN0OworCisJCQkJCWZvciAoaSA9IDA7IGkgPCBzc2xv dC5ubnVtYmVyczsgaSsrKQorCQkJCQkJc3VtY29tbW9uICs9IHNzbG90Lm51bWJlcnNbaV07 CisKKwkJCQkJb3RoZXJkaXN0aW5jdCA9IGdldF92YXJpYWJsZV9udW1kaXN0aW5jdCh2YXJk YXRhLCAmaXNkZWZhdWx0KSAtCisJCQkJCQlzc2xvdC5ubnVtYmVyczsKKworCQkJCQlpZiAo b3RoZXJkaXN0aW5jdCA+IDApCisJCQkJCXsKKwkJCQkJCWlmIChzc2xvdC5udW1iZXJzWzBd ID4gKCgxLjAgLSBzdW1jb21tb24gLSBudWxsZnJhYykgLyBvdGhlcmRpc3RpbmN0KSAqIDEw KQorCQkJCQkJCSpza2V3ZWRfc3RhdCA9IHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQl9CiAJ CX0KIAkJZWxzZQogCQl7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9jYWNoZS9w bGFuY2FjaGUuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2NhY2hlL3BsYW5jYWNoZS5jCmluZGV4 IDUxOTRjYmYyY2MuLjQwMTQxODMxOWIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxz L2NhY2hlL3BsYW5jYWNoZS5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2NhY2hlL3BsYW5j YWNoZS5jCkBAIC05OTEsNiArOTkxLDIwIEBAIEJ1aWxkQ2FjaGVkUGxhbihDYWNoZWRQbGFu U291cmNlICpwbGFuc291cmNlLCBMaXN0ICpxbGlzdCwKIAllbHNlCiAJCXBsYW5fY29udGV4 dCA9IEN1cnJlbnRNZW1vcnlDb250ZXh0OwogCisJaWYgKGJvdW5kUGFyYW1zKQorCXsKKwkJ aW50IGk7CisKKwkJZm9yIChpID0wOyBpIDwgYm91bmRQYXJhbXMtPm51bVBhcmFtczsgaSsr KQorCQl7CisJCQlpZiAoYm91bmRQYXJhbXMtPnBhcmFtc1tpXS5wZmxhZ3MgJiBQQVJBTV9G TEFHX1NLRVdFRFNUQVQpCisJCQl7CisJCQkJcGxhbnNvdXJjZS0+aGFzU2tld2VkcGFyYW0g PSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCiAJLyoKIAkgKiBDcmVhdGUg YW5kIGZpbGwgdGhlIENhY2hlZFBsYW4gc3RydWN0IHdpdGhpbiB0aGUgbmV3IGNvbnRleHQu CiAJICovCkBAIC0xMDY2LDYgKzEwODAsOSBAQCBjaG9vc2VfY3VzdG9tX3BsYW4oQ2FjaGVk UGxhblNvdXJjZSAqcGxhbnNvdXJjZSwgUGFyYW1MaXN0SW5mbyBib3VuZFBhcmFtcykKIAlp ZiAocGxhbl9jYWNoZV9tb2RlID09IFBMQU5fQ0FDSEVfTU9ERV9GT1JDRV9DVVNUT01fUExB TikKIAkJcmV0dXJuIHRydWU7CiAKKwlpZiAocGxhbnNvdXJjZS0+aGFzU2tld2VkcGFyYW0p CisJCXJldHVybiB0cnVlOworCiAJLyogU2VlIGlmIGNhbGxlciB3YW50cyB0byBmb3JjZSB0 aGUgZGVjaXNpb24gKi8KIAlpZiAocGxhbnNvdXJjZS0+Y3Vyc29yX29wdGlvbnMgJiBDVVJT T1JfT1BUX0dFTkVSSUNfUExBTikKIAkJcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvc3Jj L2luY2x1ZGUvTWFrZWZpbGUgYi9zcmMvaW5jbHVkZS9NYWtlZmlsZQppbmRleCA1ODRkMDMw MGQ5Li4wODBiZjgxODY3IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9NYWtlZmlsZQorKysg Yi9zcmMvaW5jbHVkZS9NYWtlZmlsZQpAQCAtNTEsNiArNTEsNyBAQCBpbnN0YWxsOiBhbGwg aW5zdGFsbGRpcnMKIAkkKElOU1RBTExfREFUQSkgdXRpbHMvZm1ncnByb3Rvcy5oICckKERF U1RESVIpJChpbmNsdWRlZGlyX3NlcnZlcikvdXRpbHMnCiAJJChJTlNUQUxMX0RBVEEpICQo c3JjZGlyKS8qLmggJyQoREVTVERJUikkKGluY2x1ZGVkaXJfc2VydmVyKScKIAlmb3IgZGly IGluICQoU1VCRElSUyk7IGRvIFwKKwkgIHB3ZCBcCiAJICAkKElOU1RBTExfREFUQSkgJChz cmNkaXIpLyQkZGlyLyouaCAnJChERVNURElSKSQoaW5jbHVkZWRpcl9zZXJ2ZXIpJy8kJGRp ciB8fCBleGl0OyBcCiAJZG9uZQogaWZlcSAoJCh2cGF0aF9idWlsZCkseWVzKQpkaWZmIC0t Z2l0IGEvc3JjL2luY2x1ZGUvbm9kZXMvcGFyYW1zLmggYi9zcmMvaW5jbHVkZS9ub2Rlcy9w YXJhbXMuaAppbmRleCAxMGM5ZmM1NDEzLi4wNTFhMTJiYjFkIDEwMDY0NAotLS0gYS9zcmMv aW5jbHVkZS9ub2Rlcy9wYXJhbXMuaAorKysgYi9zcmMvaW5jbHVkZS9ub2Rlcy9wYXJhbXMu aApAQCAtODUsNyArODUsMTMgQEAgc3RydWN0IFBhcnNlU3RhdGU7CiAgKgkgIGFuZCBwYXJh bUNvbXBpbGVBcmcgaXMgcmF0aGVyIGFyYml0cmFyeS4KICAqLwogCi0jZGVmaW5lIFBBUkFN X0ZMQUdfQ09OU1QJMHgwMDAxCS8qIHBhcmFtZXRlciBpcyBjb25zdGFudCAqLworLyogcGFy YW1ldGVyIGlzIGNvbnN0YW50ICovCisjZGVmaW5lIFBBUkFNX0ZMQUdfQ09OU1QJCQkweDAw MDEKKy8qCisgKiBUaGUgdmFyIHNpZGUgb2YgJ3ZhciBlcSBwYXJhbScgb3IgJ3BhcmFtIGVx IHZhcicgZXhwcmVzc2lvbgorICogY29ycmVzcG9uZGluZyB0byB0aGUgcGFyYW1ldGVyIGNv bnRhaW5zIHNrZXdlZCBkYXRhLgorICovCisjZGVmaW5lIFBBUkFNX0ZMQUdfU0tFV0VEU1RB VAkJMHgwMDAyCiAKIHR5cGVkZWYgc3RydWN0IFBhcmFtRXh0ZXJuRGF0YQogewpkaWZmIC0t Z2l0IGEvc3JjL2luY2x1ZGUvbm9kZXMvcHJpbW5vZGVzLmggYi9zcmMvaW5jbHVkZS9ub2Rl cy9wcmltbm9kZXMuaAppbmRleCA0YTE1NDYwNmQyLi43ZTY3NjJkZTQ3IDEwMDY0NAotLS0g YS9zcmMvaW5jbHVkZS9ub2Rlcy9wcmltbm9kZXMuaAorKysgYi9zcmMvaW5jbHVkZS9ub2Rl cy9wcmltbm9kZXMuaApAQCAtMzE0LDYgKzMxNCwxMiBAQCB0eXBlZGVmIHN0cnVjdCBDb25z dAogCSAqLwogCWJvb2wJCWNvbnN0Ynl2YWwgcGdfbm9kZV9hdHRyKHF1ZXJ5X2p1bWJsZV9p Z25vcmUpOwogCisJLyoKKwkgKiA+MCBpbmRpY2F0ZXMgdGhhdCB0aGUgY29uc3RhbnQgaXMg ZXh0cmFjdGVkIGZyb20gUGFyYW0uCisJICogSXRzIHZhbHVlIGlzIHBhcmFtaWQgb2YgdGhl IFBhcmFtIHN0cnVjdC4KKwkgKi8KKwlpbnQJCQlwYXJhbWlkIHBnX25vZGVfYXR0cihxdWVy eV9qdW1ibGVfaWdub3JlKTsKKwogCS8qCiAJICogdG9rZW4gbG9jYXRpb24sIG9yIC0xIGlm IHVua25vd24uICBBbGwgY29uc3RhbnRzIGFyZSB0cmFja2VkIGFzCiAJICogbG9jYXRpb25z IGluIHF1ZXJ5IGp1bWJsaW5nLCB0byBiZSBtYXJrZWQgYXMgcGFyYW1ldGVycy4KZGlmZiAt LWdpdCBhL3NyYy9pbmNsdWRlL3V0aWxzL3BsYW5jYWNoZS5oIGIvc3JjL2luY2x1ZGUvdXRp bHMvcGxhbmNhY2hlLmgKaW5kZXggYTkwZGZkZjkwNi4uNzEyMDllMDI5ZiAxMDA2NDQKLS0t IGEvc3JjL2luY2x1ZGUvdXRpbHMvcGxhbmNhY2hlLmgKKysrIGIvc3JjL2luY2x1ZGUvdXRp bHMvcGxhbmNhY2hlLmgKQEAgLTEyNCw2ICsxMjQsNyBAQCB0eXBlZGVmIHN0cnVjdCBDYWNo ZWRQbGFuU291cmNlCiAJYm9vbAkJaXNfY29tcGxldGU7CS8qIGhhcyBDb21wbGV0ZUNhY2hl ZFBsYW4gYmVlbiBkb25lPyAqLwogCWJvb2wJCWlzX3NhdmVkOwkJLyogaGFzIENhY2hlZFBs YW5Tb3VyY2UgYmVlbiAic2F2ZWQiPyAqLwogCWJvb2wJCWlzX3ZhbGlkOwkJLyogaXMgdGhl IHF1ZXJ5X2xpc3QgY3VycmVudGx5IHZhbGlkPyAqLworCWJvb2wJCWhhc1NrZXdlZHBhcmFt OyAvKiBzZWUgdGhlIGRlZmluaXRpb24gb2YgUEFSQU0gRkxBRyBTS0VXRURTVEFUICovCiAJ aW50CQkJZ2VuZXJhdGlvbjsJCS8qIGluY3JlbWVudHMgZWFjaCB0aW1lIHdlIGNyZWF0ZSBh IHBsYW4gKi8KIAkvKiBJZiBDYWNoZWRQbGFuU291cmNlIGhhcyBiZWVuIHNhdmVkLCBpdCBp cyBhIG1lbWJlciBvZiBhIGdsb2JhbCBsaXN0ICovCiAJZGxpc3Rfbm9kZQlub2RlOwkJCS8q IGxpc3QgbGluaywgaWYgaXNfc2F2ZWQgKi8KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3V0 aWxzL3NlbGZ1bmNzLmggYi9zcmMvaW5jbHVkZS91dGlscy9zZWxmdW5jcy5oCmluZGV4IDJm YTRjNGZjMWIuLmE3NTMyYjhkN2IgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3V0aWxzL3Nl bGZ1bmNzLmgKKysrIGIvc3JjL2luY2x1ZGUvdXRpbHMvc2VsZnVuY3MuaApAQCAtMTg0LDYg KzE4NCwxMCBAQCBleHRlcm4gZG91YmxlIHZhcl9lcV9jb25zdChWYXJpYWJsZVN0YXREYXRh ICp2YXJkYXRhLAogCQkJCQkJICAgT2lkIG9wcm9pZCwgT2lkIGNvbGxhdGlvbiwKIAkJCQkJ CSAgIERhdHVtIGNvbnN0dmFsLCBib29sIGNvbnN0aXNudWxsLAogCQkJCQkJICAgYm9vbCB2 YXJvbmxlZnQsIGJvb2wgbmVnYXRlKTsKK2V4dGVybiBkb3VibGUgdmFyX2VxX2NvbnN0X2V4 dChWYXJpYWJsZVN0YXREYXRhICp2YXJkYXRhLAorCQkJCQkJICAgT2lkIG9wcm9pZCwgT2lk IGNvbGxhdGlvbiwKKwkJCQkJCSAgIERhdHVtIGNvbnN0dmFsLCBib29sIGNvbnN0aXNudWxs LAorCQkJCQkJICAgYm9vbCB2YXJvbmxlZnQsIGJvb2wgbmVnYXRlLCBib29sICpza2V3ZWRf c3RhdCk7CiBleHRlcm4gZG91YmxlIHZhcl9lcV9ub25fY29uc3QoVmFyaWFibGVTdGF0RGF0 YSAqdmFyZGF0YSwKIAkJCQkJCQkgICBPaWQgb3Byb2lkLCBPaWQgY29sbGF0aW9uLAogCQkJ CQkJCSAgIE5vZGUgKm90aGVyLAo= --------------QjEeMMJzFkB0Si1E9GJBeB9f--