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 1pYc8D-0002jp-35 for pgsql-hackers@arkaria.postgresql.org; Sun, 05 Mar 2023 00:21:41 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1pYc8B-0001oX-VP for pgsql-hackers@arkaria.postgresql.org; Sun, 05 Mar 2023 00:21:39 +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 1pYc8B-0001oO-CC for pgsql-hackers@lists.postgresql.org; Sun, 05 Mar 2023 00:21:39 +0000 Received: from mail-lj1-x235.google.com ([2a00:1450:4864:20::235]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1pYc88-0006WK-Un for pgsql-hackers@lists.postgresql.org; Sun, 05 Mar 2023 00:21:38 +0000 Received: by mail-lj1-x235.google.com with SMTP id by8so6056487ljb.7 for ; Sat, 04 Mar 2023 16:21:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fittl.com; s=google; h=cc:to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=OGsqsMf1gxttA4argAgsjFajrKEPiQ0SA8udOfgLDlE=; b=C3FI5KUZH+tgtC35o1o+wTZwt6v5iExPAEvRjdrQGhVvlOTPFFwdtAEWUVJlxSG6hi 74T3GylThff9IXjzYSa2M9FFe+I3TH7AgUA7+YYx65t0tkAWhCpVK73zx5ccHlQHPRVf X5sqGRaZeEOtEfmyC9QGm7tYc2jBTP8RnsDRs= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=OGsqsMf1gxttA4argAgsjFajrKEPiQ0SA8udOfgLDlE=; b=dsTUcpe9HV57WbhZXeBdYeywgwPSgcoQh9ogGavewgk9d0fddbdJDsm/3p23Mb0hOM 5KTyjuqdMmVe/+XD6eI75A874XE5eW51bsmPmpUEaeV3OIP+kwLk6fJ52qzGwKzs9J0Z JXT29lgkmSdZVHIVtzUTjaOl80zKyrfQiA5XNtNT+ISbf7hA1xAhUnxHO+bc1KSoeF8H NIIGFvxXjnwTXJ/TjMtsiVYcZv9+W1FHo4m/zYNmF4Md0oNrd6qTjO5WjXSCvjbSuRqg J6US0WjS30HCJsTh4duO/rifS5fpik6EEVHjydbEO08fZeaoXEgwh2ZTidIrdF2KPryV JG2g== X-Gm-Message-State: AO0yUKWnxojdIgjJmqsI15Qgkq6qwp2hvU0xEkmo6qp/Lv55Wmr3ytjt W2h0NVP3fULkREYS8+/iXSoG0tJonmr57kPQryNz73f87QJXJcoTFZ4= X-Google-Smtp-Source: AK7set9H+9yx7czXqhQd3APB/nSjJo3GBFahAXLL5iaWcOiONM2HMPYyBbqMAabxxiTHR/sjROdOPV6r/ufuv+mWJxk= X-Received: by 2002:a2e:b548:0:b0:295:a82e:ec06 with SMTP id a8-20020a2eb548000000b00295a82eec06mr1884976ljn.3.1677975695076; Sat, 04 Mar 2023 16:21:35 -0800 (PST) MIME-Version: 1.0 From: Lukas Fittl Date: Sat, 4 Mar 2023 16:20:59 -0800 Message-ID: Subject: Add estimated hit ratio to Memoize in EXPLAIN to explain cost adjustment To: PostgreSQL Hackers Cc: David Rowley Content-Type: multipart/mixed; boundary="0000000000003f9d6505f61c2980" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000003f9d6505f61c2980 Content-Type: multipart/alternative; boundary="0000000000003f9d6305f61c297e" --0000000000003f9d6305f61c297e Content-Type: text/plain; charset="UTF-8" Hi, I was debugging a planner problem on Postgres 14.4 the other day - and the involved "bad" plan was including Memoize - though I don't necessarily think that Memoize is to blame (and this isn't any of the problems recently fixed in Memoize costing). However, what I noticed whilst trying different ways to fix the plan, is that the Memoize output was a bit hard to reason about - especially since the plan involving Memoize was expensive to run, and so I was mostly running EXPLAIN without ANALYZE to look at the costing. Here is an example of the output I was looking at: -> Nested Loop (cost=1.00..971672.56 rows=119623 width=0) -> Index Only Scan using table1_idx on table1 (cost=0.43..372676.50 rows=23553966 width=8) -> Memoize (cost=0.57..0.61 rows=1 width=8) Cache Key: table1.table2_id Cache Mode: logical -> Index Scan using table2_idx on table2 (cost=0.56..0.60 rows=1 width=8) Index Cond: (id = table1.table2_id) The other plan I was comparing with (that I wanted the planner to choose instead), had a total cost of 1,451,807.35 -- and so I was trying to figure out why the Nested Loop was costed as 971,672.56. Simple math makes me expect the Nested Loop should roughly have a total cost of14,740,595.76 here (372,676.50 + 23,553,966 * 0.61), ignoring a lot of the smaller costs. Thus, in this example, it appears Memoize made the plan cost significantly cheaper (roughly 6% of the regular cost). Essentially this comes down to the "cost reduction" performed by Memoize only being implicitly visible in the Nested Loop's total cost - and with nothing useful on the Memoize node itself - since the rescan costs are not shown. I think explicitly adding the estimated cache hit ratio for Memoize nodes might make this easier to reason about, like this: -> Memoize (cost=0.57..0.61 rows=1 width=8) Cache Key: table1.table2_id Cache Mode: logical Cache Hit Ratio Estimated: 0.94 Alternatively (or in addition) we could consider showing the "ndistinct" value that is calculated in cost_memoize_rescan - since that's the most significant contributor to the cache hit ratio (and you can influence that directly by improving the ndistinct statistics). See attached a patch that implements showing the cache hit ratio as a discussion starter. I'll park this in the July commitfest for now. Thanks, Lukas -- Lukas Fittl --0000000000003f9d6305f61c297e Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi,

I was debugging a planne= r problem on Postgres 14.4 the other day - and the involved "bad"= plan was including Memoize - though I don't necessarily think that Mem= oize is to blame (and this isn't any of the problems recently fixed in = Memoize costing).

However, what I noticed whil= st trying different ways to fix the plan, is that the Memoize output was a = bit hard to reason about - especially since the plan involving Memoize was = expensive to run, and so I was mostly running EXPLAIN without ANALYZE to lo= ok at the costing.

Here is an example of the outpu= t I was looking at:

=C2=A0 =C2=A0 =C2=A0-> =C2=A0Nested Lo= op =C2=A0(cost=3D1.00..971672.56 rows=3D119623 width=3D0)
=C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0-> =C2=A0Index Only Scan using table1_idx on = table1=C2=A0 (cost=3D0.43..372676.50 rows=3D23553966 width=3D8)
=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0-> =C2=A0Memoize =C2=A0(cost=3D0.57..0= .61 rows=3D1 width=3D8)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0Cache Key: table1.table2_id
=C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Cache Mode: logical
=C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0 -> =C2=A0Index Scan = using table2_idx on table2=C2=A0 (cost=3D0.56..0.60 rows=3D1 width=3D8)
= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0Index Cond: (id =3D table1.table2_id)

Th= e other plan I was comparing with (that I wanted the planner to choose inst= ead), had a total cost of 1,451,807.35 -- and so I was trying to figure out= why the Nested Loop was costed as 971,672.56.

Sim= ple math makes me expect the Nested Loop should roughly have a total cost o= f14,740,595.76 here (372,676.50 + 23,553,966 * 0.61), ignoring a lot of the= smaller costs. Thus, in this example, it appears Memoize made the plan cos= t significantly cheaper (roughly 6% of the regular cost).
Essentially this comes down to the "cost reduction" p= erformed by Memoize only being implicitly visible in the Nested Loop's = total cost - and with nothing useful on the Memoize node itself - since the= rescan costs are not shown.

I think explicitl= y adding the estimated cache hit ratio for Memoize nodes might make this ea= sier to reason about, like this:

-> =C2=A0Memoi= ze =C2=A0(cost=3D0.57..0.61 rows=3D1 width=3D8)
=C2=A0 =C2=A0=C2=A0 Cach= e Key: table1.table2_id
=C2=A0 =C2=A0=C2=A0 Cache Mode: logical
=C2=A0=C2=A0=C2=A0=C2=A0 Cache Hit Ratio Estimated: 0.94

Alternatively (or in addition) we could consider showing t= he "ndistinct" value that is calculated in cost_memoize_rescan - = since that's the most significant contributor to the cache hit ratio (a= nd you can influence that directly by improving the ndistinct statistics).<= br>

See attached a patch that implements showing t= he cache hit ratio as a discussion starter.

I&= #39;ll park this in the July commitfest for now.

Thanks,
Lukas

--
Lukas Fittl
--0000000000003f9d6305f61c297e-- --0000000000003f9d6505f61c2980 Content-Type: application/octet-stream; name="v1-0001-Add-Estimated-Cache-Hit-Ratio-for-Memoize-plan-no.patch" Content-Disposition: attachment; filename="v1-0001-Add-Estimated-Cache-Hit-Ratio-for-Memoize-plan-no.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_leun8su30 RnJvbSA3ZWFlZDhmMWEwNTliZWQwMGRmZDQ2MjU5MzFlY2U0NzViOWMzNDUxIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBMdWthcyBGaXR0bCA8bHVrYXNAZml0dGwuY29tPgpEYXRlOiBT YXQsIDQgTWFyIDIwMjMgMTU6NDQ6MjkgLTA4MDAKU3ViamVjdDogW1BBVENIIHYxXSBBZGQgRXN0 aW1hdGVkIENhY2hlIEhpdCBSYXRpbyBmb3IgTWVtb2l6ZSBwbGFuIG5vZGVzIGluCiBFWFBMQUlO CgpNZW1vaXplIGNhbiBzdWJzdGFudGlhbGx5IHJlZHVjZSB0aGUgY29zdHMgb2YgY2VydGFpbiBO ZXN0ZWQgTG9vcHMsIGJ1dAppdHMgaGFyZCB0byBzZWUgdGhpcyBjbGVhcmx5LCBzaW5jZSB0aGUg b2Z0ZW4gc2lnbmlmaWNhbnRseSBkaXNjb3VudGVkCnJlc2NhbiBjb3N0cyBhcmUgbm90IHNob3du IGluIEVYUExBSU4uCgpUbyBoZWxwIHVuZGVyc3RhbmQgTWVtb2l6ZSdzIGltcGFjdCBiZXR0ZXIs IHJlbWVtYmVyIHRoZSBjYWxjdWxhdGVkCmVzdGltYXRlZCBjYWNoZSBoaXQgcmF0aW8sIGFuZCBz aG93IGl0IGluIEVYUExBSU4gb3V0cHV0LgotLS0KIHNyYy9iYWNrZW5kL2NvbW1hbmRzL2V4cGxh aW4uYyAgICAgICAgICB8ICA3ICsrKysrKysKIHNyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2Nv c3RzaXplLmMgICB8ICAzICsrKwogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vY3JlYXRlcGxh bi5jIHwgMTAgKysrKysrKy0tLQogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcGF0aG5vZGUu YyAgIHwgIDUgKysrKysKIHNyYy9pbmNsdWRlL25vZGVzL3BhdGhub2Rlcy5oICAgICAgICAgICB8 ICAxICsKIHNyYy9pbmNsdWRlL25vZGVzL3BsYW5ub2Rlcy5oICAgICAgICAgICB8ICAzICsrKwog NiBmaWxlcyBjaGFuZ2VkLCAyNiBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQoKZGlmZiAt LWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2V4cGxhaW4uYyBiL3NyYy9iYWNrZW5kL2NvbW1h bmRzL2V4cGxhaW4uYwppbmRleCBlNTdiZGE3YjYyLi41OGZkYTk5YTY5IDEwMDY0NAotLS0gYS9z cmMvYmFja2VuZC9jb21tYW5kcy9leHBsYWluLmMKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMv ZXhwbGFpbi5jCkBAIC0zMTY3LDYgKzMxNjcsOCBAQCBzaG93X21lbW9pemVfaW5mbyhNZW1vaXpl U3RhdGUgKm1zdGF0ZSwgTGlzdCAqYW5jZXN0b3JzLCBFeHBsYWluU3RhdGUgKmVzKQogCXsKIAkJ RXhwbGFpblByb3BlcnR5VGV4dCgiQ2FjaGUgS2V5Iiwga2V5c3RyLmRhdGEsIGVzKTsKIAkJRXhw bGFpblByb3BlcnR5VGV4dCgiQ2FjaGUgTW9kZSIsIG1zdGF0ZS0+YmluYXJ5X21vZGUgPyAiYmlu YXJ5IiA6ICJsb2dpY2FsIiwgZXMpOworCQlpZiAoZXMtPmNvc3RzKQorCQkJRXhwbGFpblByb3Bl cnR5RmxvYXQoIkNhY2hlIEhpdCBSYXRpbyBFc3RpbWF0ZWQiLCAiIiwgKChNZW1vaXplICopIHBs YW4pLT5oaXRfcmF0aW8sIDIsIGVzKTsKIAl9CiAJZWxzZQogCXsKQEAgLTMxNzQsNiArMzE3Niwx MSBAQCBzaG93X21lbW9pemVfaW5mbyhNZW1vaXplU3RhdGUgKm1zdGF0ZSwgTGlzdCAqYW5jZXN0 b3JzLCBFeHBsYWluU3RhdGUgKmVzKQogCQlhcHBlbmRTdHJpbmdJbmZvKGVzLT5zdHIsICJDYWNo ZSBLZXk6ICVzXG4iLCBrZXlzdHIuZGF0YSk7CiAJCUV4cGxhaW5JbmRlbnRUZXh0KGVzKTsKIAkJ YXBwZW5kU3RyaW5nSW5mbyhlcy0+c3RyLCAiQ2FjaGUgTW9kZTogJXNcbiIsIG1zdGF0ZS0+Ymlu YXJ5X21vZGUgPyAiYmluYXJ5IiA6ICJsb2dpY2FsIik7CisJCWlmIChlcy0+Y29zdHMpCisJCXsK KwkJCUV4cGxhaW5JbmRlbnRUZXh0KGVzKTsKKwkJCWFwcGVuZFN0cmluZ0luZm8oZXMtPnN0ciwg IkNhY2hlIEhpdCBSYXRpbyBFc3RpbWF0ZWQ6ICUwLjJmXG4iLCAoKE1lbW9pemUgKikgcGxhbikt PmhpdF9yYXRpbyk7CisJCX0KIAl9CiAKIAlwZnJlZShrZXlzdHIuZGF0YSk7CmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9jb3N0c2l6ZS5jIGIvc3JjL2JhY2tlbmQvb3B0 aW1pemVyL3BhdGgvY29zdHNpemUuYwppbmRleCA3OTE4YmI2ZjBkLi5hMGZkM2Y4OTY1IDEwMDY0 NAotLS0gYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9jb3N0c2l6ZS5jCisrKyBiL3NyYy9i YWNrZW5kL29wdGltaXplci9wYXRoL2Nvc3RzaXplLmMKQEAgLTI2MDAsNiArMjYwMCw5IEBAIGNv c3RfbWVtb2l6ZV9yZXNjYW4oUGxhbm5lckluZm8gKnJvb3QsIE1lbW9pemVQYXRoICptcGF0aCwK IAkgKi8KIAlzdGFydHVwX2Nvc3QgKz0gY3B1X3R1cGxlX2Nvc3Q7CiAKKwkvKiBSZW1lbWJlciBj YWNoZSBoaXQgcmF0aW8gZm9yIGEgcG90ZW50aWFsIEVYUExBSU4gbGF0ZXIgKi8KKwltcGF0aC0+ aGl0X3JhdGlvID0gaGl0X3JhdGlvOworCiAJKnJlc2Nhbl9zdGFydHVwX2Nvc3QgPSBzdGFydHVw X2Nvc3Q7CiAJKnJlc2Nhbl90b3RhbF9jb3N0ID0gdG90YWxfY29zdDsKIH0KZGlmZiAtLWdpdCBh L3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2NyZWF0ZXBsYW4uYyBiL3NyYy9iYWNrZW5kL29w dGltaXplci9wbGFuL2NyZWF0ZXBsYW4uYwppbmRleCBmYTA5YTYxMDNiLi40YzQwM2NiMDgxIDEw MDY0NAotLS0gYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9jcmVhdGVwbGFuLmMKKysrIGIv c3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vY3JlYXRlcGxhbi5jCkBAIC0yODAsNyArMjgwLDgg QEAgc3RhdGljIE1hdGVyaWFsICptYWtlX21hdGVyaWFsKFBsYW4gKmxlZnR0cmVlKTsKIHN0YXRp YyBNZW1vaXplICptYWtlX21lbW9pemUoUGxhbiAqbGVmdHRyZWUsIE9pZCAqaGFzaG9wZXJhdG9y cywKIAkJCQkJCQkgT2lkICpjb2xsYXRpb25zLCBMaXN0ICpwYXJhbV9leHBycywKIAkJCQkJCQkg Ym9vbCBzaW5nbGVyb3csIGJvb2wgYmluYXJ5X21vZGUsCi0JCQkJCQkJIHVpbnQzMiBlc3RfZW50 cmllcywgQml0bWFwc2V0ICprZXlwYXJhbWlkcyk7CisJCQkJCQkJIHVpbnQzMiBlc3RfZW50cmll cywgQml0bWFwc2V0ICprZXlwYXJhbWlkcywKKwkJCQkJCQkgZG91YmxlIGhpdF9yYXRpbyk7CiBz dGF0aWMgV2luZG93QWdnICptYWtlX3dpbmRvd2FnZyhMaXN0ICp0bGlzdCwgSW5kZXggd2lucmVm LAogCQkJCQkJCQkgaW50IHBhcnROdW1Db2xzLCBBdHRyTnVtYmVyICpwYXJ0Q29sSWR4LCBPaWQg KnBhcnRPcGVyYXRvcnMsIE9pZCAqcGFydENvbGxhdGlvbnMsCiAJCQkJCQkJCSBpbnQgb3JkTnVt Q29scywgQXR0ck51bWJlciAqb3JkQ29sSWR4LCBPaWQgKm9yZE9wZXJhdG9ycywgT2lkICpvcmRD b2xsYXRpb25zLApAQCAtMTY5MSw3ICsxNjkyLDggQEAgY3JlYXRlX21lbW9pemVfcGxhbihQbGFu bmVySW5mbyAqcm9vdCwgTWVtb2l6ZVBhdGggKmJlc3RfcGF0aCwgaW50IGZsYWdzKQogCiAJcGxh biA9IG1ha2VfbWVtb2l6ZShzdWJwbGFuLCBvcGVyYXRvcnMsIGNvbGxhdGlvbnMsIHBhcmFtX2V4 cHJzLAogCQkJCQkJYmVzdF9wYXRoLT5zaW5nbGVyb3csIGJlc3RfcGF0aC0+YmluYXJ5X21vZGUs Ci0JCQkJCQliZXN0X3BhdGgtPmVzdF9lbnRyaWVzLCBrZXlwYXJhbWlkcyk7CisJCQkJCQliZXN0 X3BhdGgtPmVzdF9lbnRyaWVzLCBrZXlwYXJhbWlkcywKKwkJCQkJCWJlc3RfcGF0aC0+aGl0X3Jh dGlvKTsKIAogCWNvcHlfZ2VuZXJpY19wYXRoX2luZm8oJnBsYW4tPnBsYW4sIChQYXRoICopIGJl c3RfcGF0aCk7CiAKQEAgLTY1MjgsNyArNjUzMCw4IEBAIG1hdGVyaWFsaXplX2ZpbmlzaGVkX3Bs YW4oUGxhbiAqc3VicGxhbikKIHN0YXRpYyBNZW1vaXplICoKIG1ha2VfbWVtb2l6ZShQbGFuICps ZWZ0dHJlZSwgT2lkICpoYXNob3BlcmF0b3JzLCBPaWQgKmNvbGxhdGlvbnMsCiAJCQkgTGlzdCAq cGFyYW1fZXhwcnMsIGJvb2wgc2luZ2xlcm93LCBib29sIGJpbmFyeV9tb2RlLAotCQkJIHVpbnQz MiBlc3RfZW50cmllcywgQml0bWFwc2V0ICprZXlwYXJhbWlkcykKKwkJCSB1aW50MzIgZXN0X2Vu dHJpZXMsIEJpdG1hcHNldCAqa2V5cGFyYW1pZHMsCisJCQkgZG91YmxlIGhpdF9yYXRpbykKIHsK IAlNZW1vaXplICAgICpub2RlID0gbWFrZU5vZGUoTWVtb2l6ZSk7CiAJUGxhbgkgICAqcGxhbiA9 ICZub2RlLT5wbGFuOwpAQCAtNjU0Niw2ICs2NTQ5LDcgQEAgbWFrZV9tZW1vaXplKFBsYW4gKmxl ZnR0cmVlLCBPaWQgKmhhc2hvcGVyYXRvcnMsIE9pZCAqY29sbGF0aW9ucywKIAlub2RlLT5iaW5h cnlfbW9kZSA9IGJpbmFyeV9tb2RlOwogCW5vZGUtPmVzdF9lbnRyaWVzID0gZXN0X2VudHJpZXM7 CiAJbm9kZS0+a2V5cGFyYW1pZHMgPSBrZXlwYXJhbWlkczsKKwlub2RlLT5oaXRfcmF0aW8gPSBo aXRfcmF0aW87CiAKIAlyZXR1cm4gbm9kZTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29w dGltaXplci91dGlsL3BhdGhub2RlLmMgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9wYXRo bm9kZS5jCmluZGV4IGQ3NDliNTA1NzguLmQ0MTg2Nzg0YzUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNr ZW5kL29wdGltaXplci91dGlsL3BhdGhub2RlLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVy L3V0aWwvcGF0aG5vZGUuYwpAQCAtMTYyNCw2ICsxNjI0LDExIEBAIGNyZWF0ZV9tZW1vaXplX3Bh dGgoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwgUGF0aCAqc3VicGF0aCwKIAkg Ki8KIAlwYXRobm9kZS0+ZXN0X2VudHJpZXMgPSAwOwogCisJLyoKKwkgKiBUaGUgZXN0aW1hdGVk IGNhY2hlIGhpdCByYXRpbyB3aWxsIGNhbGN1bGF0ZWQgbGF0ZXIgYnkgY29zdF9tZW1vaXplX3Jl c2NhbigpCisJICovCisJcGF0aG5vZGUtPmhpdF9yYXRpbyA9IDA7CisKIAkvKgogCSAqIEFkZCBh IHNtYWxsIGFkZGl0aW9uYWwgY2hhcmdlIGZvciBjYWNoaW5nIHRoZSBmaXJzdCBlbnRyeS4gIEFs bCB0aGUKIAkgKiBoYXJkZXIgY2FsY3VsYXRpb25zIGZvciByZXNjYW5zIGFyZSBwZXJmb3JtZWQg aW4gY29zdF9tZW1vaXplX3Jlc2NhbigpLgpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvbm9kZXMv cGF0aG5vZGVzLmggYi9zcmMvaW5jbHVkZS9ub2Rlcy9wYXRobm9kZXMuaAppbmRleCBkNjFhNjJk YTE5Li4xYjdjYWIzYmM1IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9ub2Rlcy9wYXRobm9kZXMu aAorKysgYi9zcmMvaW5jbHVkZS9ub2Rlcy9wYXRobm9kZXMuaApAQCAtMTk2Miw2ICsxOTYyLDcg QEAgdHlwZWRlZiBzdHJ1Y3QgTWVtb2l6ZVBhdGgKIAl1aW50MzIJCWVzdF9lbnRyaWVzOwkvKiBU aGUgbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyB0aGF0IHRoZQogCQkJCQkJCQkgKiBwbGFubmVy IGV4cGVjdHMgd2lsbCBmaXQgaW4gdGhlIGNhY2hlLCBvciAwCiAJCQkJCQkJCSAqIGlmIHVua25v d24gKi8KKwlkb3VibGUJCWhpdF9yYXRpbzsJCS8qIEVzdGltYXRlZCBjYWNoZSBoaXQgcmF0aW8s IGtlcHQgZm9yIEVYUExBSU4gKi8KIH0gTWVtb2l6ZVBhdGg7CiAKIC8qCmRpZmYgLS1naXQgYS9z cmMvaW5jbHVkZS9ub2Rlcy9wbGFubm9kZXMuaCBiL3NyYy9pbmNsdWRlL25vZGVzL3BsYW5ub2Rl cy5oCmluZGV4IDY1OWJkMDVjMGMuLjc5NjYwNjJhMzIgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRl L25vZGVzL3BsYW5ub2Rlcy5oCisrKyBiL3NyYy9pbmNsdWRlL25vZGVzL3BsYW5ub2Rlcy5oCkBA IC05MjMsNiArOTIzLDkgQEAgdHlwZWRlZiBzdHJ1Y3QgTWVtb2l6ZQogCiAJLyogcGFyYW1pZHMg ZnJvbSBwYXJhbV9leHBycyAqLwogCUJpdG1hcHNldCAgKmtleXBhcmFtaWRzOworCisJLyogRXN0 aW1hdGVkIGNhY2hlIGhpdCByYXRpbywga2VwdCBmb3IgRVhQTEFJTiAqLworCWRvdWJsZQkJaGl0 X3JhdGlvOwogfSBNZW1vaXplOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tCi0tIAoyLjM0LjAKCg== --0000000000003f9d6505f61c2980--