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 1qdRnr-003QhE-Cw for pgsql-hackers@arkaria.postgresql.org; Tue, 05 Sep 2023 08:52:55 +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 1qdRnp-000McM-Dk for pgsql-hackers@arkaria.postgresql.org; Tue, 05 Sep 2023 08:52:53 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qdRno-000Mbx-RK for pgsql-hackers@lists.postgresql.org; Tue, 05 Sep 2023 08:52:52 +0000 Received: from mail-ej1-x636.google.com ([2a00:1450:4864:20::636]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1qdRnk-002ppx-PS for pgsql-hackers@lists.postgresql.org; Tue, 05 Sep 2023 08:52:51 +0000 Received: by mail-ej1-x636.google.com with SMTP id a640c23a62f3a-9a65f9147ccso188773666b.1 for ; Tue, 05 Sep 2023 01:52:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1693903966; x=1694508766; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=AVtnoc0Vk+bfHuf40pncfMGLuIRySN8fAN/TcxjaXm4=; b=kybwjHvOFlnKogh9uXq8FgI2Db8tlTTyl8aw7Xmub8ZzPp07N1/ZBuHG24nOpRIN/E sjHALiBZNsFdenntcGhiIPqJqo3/d7bk4woSdgbYaKTccLv09+6U/3zLWHAlrIIcuwkE sklZaKBE+n4I4PYzb6O/b4AGLsQ1SQsGcO8p3sSBUMrC6/HH+n9QMG483vfHdNett3Ih mAxvfwhSbiKA5wEIky8ILMXsd5pGtoC+mvU06jxzLb9KDOMxcsPupJGQaQoJaq2rDx/e WP8InVs8T8pigV9rAyRFsCr/krrXzWb5WvnaYhpbkrCrz+eLzkDF+wdIqRiSL47g/Am6 nwmg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693903966; x=1694508766; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=AVtnoc0Vk+bfHuf40pncfMGLuIRySN8fAN/TcxjaXm4=; b=AQOfkZDem8IgptfIW6DrmZwwBxT01PXANp1ZuQJqgvPStj8h0LZgqIIChPyG+Mplh4 w+CkRrNv8Ns6Ou54Kmlt51jfkY8oSTK0oZwuzkEyYCACPB6kHW5CkT4n39fTucwf62DH 0+l60HEGqU2SQrdX68D1nf0QC3Pl18chRcRj/OGIKu0WwXXBIHQbQv6NYjzuiEzYShvR 1tJyyvyAGCw88aSNOHjRSo6bz1RK7AEAE+uFwMcg31MojJGI+R3jZ/ohhc7q2VHShfo7 vSoaFhNe93CNvGsGDkRYJjeWM6rQr5sxEpNPsHuhZj9RmI7mg06JxL1dieTWB+WjMJJY itKA== X-Gm-Message-State: AOJu0Yy19uoOf/X5WTkcbW/EzFrFmS6Ee8TyWgJtVcjFkRVrBJ5Z2Z0K FPptnhXeRxviuBcXR/QKQHKiaapU5ljoD+Nege7OEcAwgWE= X-Google-Smtp-Source: AGHT+IG900i+qCHaTsBeGXRJGTxGT/Hq8BrUGWI5s0w5mtzwYhXw3uMUrfcKoRM684n5K4VuCPZvRYg0ee4VMvjfvLQ= X-Received: by 2002:a17:906:844a:b0:9a1:cdf1:ba7 with SMTP id e10-20020a170906844a00b009a1cdf10ba7mr8048558ejy.15.1693903966136; Tue, 05 Sep 2023 01:52:46 -0700 (PDT) MIME-Version: 1.0 From: tender wang Date: Tue, 5 Sep 2023 16:52:35 +0800 Message-ID: Subject: Should consider materializing the cheapest inner path in consider_parallel_nestloop() To: pgsql-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="0000000000002f7f8b060498c00b" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000002f7f8b060498c00b Content-Type: multipart/alternative; boundary="0000000000002f7f8a060498c009" --0000000000002f7f8a060498c009 Content-Type: text/plain; charset="UTF-8" Hi all, I recently run benchmark[1] on master, but I found performance problem as below: explain analyze select subq_0.c0 as c0, subq_0.c1 as c1, subq_0.c2 as c2 from (select ref_0.l_shipmode as c0, sample_0.l_orderkey as c1, sample_0.l_quantity as c2, ref_0.l_orderkey as c3, sample_0.l_shipmode as c5, ref_0.l_shipinstruct as c6 from public.lineitem as ref_0 left join public.lineitem as sample_0 on ((select p_partkey from public.part order by p_partkey limit 1) is not NULL) where sample_0.l_orderkey is NULL) as subq_0 where subq_0.c5 is NULL limit 1; QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------------------- Limit (cost=78.00..45267050.75 rows=1 width=27) (actual time=299695.097..299695.099 rows=0 loops=1) InitPlan 1 (returns $0) -> Limit (cost=78.00..78.00 rows=1 width=8) (actual time=0.651..0.652 rows=1 loops=1) -> Sort (cost=78.00..83.00 rows=2000 width=8) (actual time=0.650..0.651 rows=1 loops=1) Sort Key: part.p_partkey Sort Method: top-N heapsort Memory: 25kB -> Seq Scan on part (cost=0.00..68.00 rows=2000 width=8) (actual time=0.013..0.428 rows=2000 loops=1) -> Nested Loop Left Join (cost=0.00..45266972.75 rows=1 width=27) (actual time=299695.096..299695.096 rows=0 loops=1) Join Filter: ($0 IS NOT NULL) Filter: ((sample_0.l_orderkey IS NULL) AND (sample_0.l_shipmode IS NULL)) Rows Removed by Filter: 3621030625 -> Seq Scan on lineitem ref_0 (cost=0.00..1969.75 rows=60175 width=11) (actual time=0.026..6.225 rows=60175 loops=1) -> Materialize (cost=0.00..2270.62 rows=60175 width=27) (actual time=0.000..2.554 rows=60175 loops=60175) -> Seq Scan on lineitem sample_0 (cost=0.00..1969.75 rows=60175 width=27) (actual time=0.004..8.169 rows=60175 loops=1) Planning Time: 0.172 ms Execution Time: 299695.501 ms (16 rows) After I set enable_material to off, the same query run faster, as below: set enable_material = off; explain analyze select subq_0.c0 as c0, subq_0.c1 as c1, subq_0.c2 as c2 from (select ref_0.l_shipmode as c0, sample_0.l_orderkey as c1, sample_0.l_quantity as c2, ref_0.l_orderkey as c3, sample_0.l_shipmode as c5, ref_0.l_shipinstruct as c6 from public.lineitem as ref_0 left join public.lineitem as sample_0 on ((select p_partkey from public.part order by p_partkey limit 1) is not NULL) where sample_0.l_orderkey is NULL) as subq_0 where subq_0.c5 is NULL limit 1; QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------------------------- Limit (cost=1078.00..91026185.57 rows=1 width=27) (actual time=192669.605..192670.425 rows=0 loops=1) InitPlan 1 (returns $0) -> Limit (cost=78.00..78.00 rows=1 width=8) (actual time=0.662..0.663 rows=1 loops=1) -> Sort (cost=78.00..83.00 rows=2000 width=8) (actual time=0.661..0.662 rows=1 loops=1) Sort Key: part.p_partkey Sort Method: top-N heapsort Memory: 25kB -> Seq Scan on part (cost=0.00..68.00 rows=2000 width=8) (actual time=0.017..0.430 rows=2000 loops=1) -> Gather (cost=1000.00..91026107.57 rows=1 width=27) (actual time=192669.604..192670.422 rows=0 loops=1) Workers Planned: 1 Params Evaluated: $0 Workers Launched: 1 -> Nested Loop Left Join (cost=0.00..91025107.47 rows=1 width=27) (actual time=192588.143..192588.144 rows=0 loops=2) Join Filter: ($0 IS NOT NULL) Filter: ((sample_0.l_orderkey IS NULL) AND (sample_0.l_shipmode IS NULL)) Rows Removed by Filter: 1810515312 -> Parallel Seq Scan on lineitem ref_0 (cost=0.00..1721.97 rows=35397 width=11) (actual time=0.007..3.797 rows=30088 loops=2) -> Seq Scan on lineitem sample_0 (cost=0.00..1969.75 rows=60175 width=27) (actual time=0.000..2.637 rows=60175 loops=60175) Planning Time: 0.174 ms Execution Time: 192670.458 ms (19 rows) I debug the code and find consider_parallel_nestloop() doesn't consider materialized form of the cheapest inner path. When enable_material = true, we can see Material path won in first plan, but Parallel Seq Scan node doesn't add as outer path, which because in try_partial_nestloop_path() , the cost of nestloop wat computed using seq scan path not material path. [1] include test table schema and data, you can repeat above problem. I try fix this problem in attached patch, and I found pg12.12 also had this issue. Please review my patch, thanks! [1] https://github.com/tenderwg/tpch_test --0000000000002f7f8a060498c009 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi all,

=C2=A0 =C2=A0I recently=C2=A0ru= n benchmark[1] on master, but I found performance=C2=A0problem as below:

explain analyze select
=C2=A0 subq_0.c0 as c0,=C2=A0 subq_0.c1 as c1,
=C2=A0 subq_0.c2 as c2
from
=C2=A0 (selec= t
=C2=A0 =C2=A0 =C2=A0 =C2=A0 ref_0.l_shipmode as c0,
=C2=A0 =C2=A0 = =C2=A0 =C2=A0 sample_0.l_orderkey as c1,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 sam= ple_0.l_quantity as c2,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 ref_0.l_orderkey as = c3,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 sample_0.l_shipmode as c5,
=C2=A0 =C2= =A0 =C2=A0 =C2=A0 ref_0.l_shipinstruct as c6
=C2=A0 =C2=A0 =C2=A0 from=C2=A0 =C2=A0 =C2=A0 =C2=A0 public.lineitem as ref_0
=C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 left join public.lineitem as sample_0
=C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 on ((select p_partkey from public.part order by p_part= key limit 1)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0is not NULL)
=C2=A0 =C2=A0 =C2=A0 where sample_0.l_orderkey is NULL) = as subq_0
where subq_0.c5 is NULL
limit 1;
=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0QUERY PLAN =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0
--= ---------------------------------------------------------------------------= ------------------------------------------------------------
=C2=A0Limit= =C2=A0(cost=3D78.00..45267050.75 rows=3D1 width=3D27) (actual time=3D29969= 5.097..299695.099 rows=3D0 loops=3D1)
=C2=A0 =C2=A0InitPlan 1 (returns $= 0)
=C2=A0 =C2=A0 =C2=A0-> =C2=A0Limit =C2=A0(cost=3D78.00..78.00 rows= =3D1 width=3D8) (actual time=3D0.651..0.652 rows=3D1 loops=3D1)
=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0-> =C2=A0Sort =C2=A0(cost=3D78.00..83.= 00 rows=3D2000 width=3D8) (actual time=3D0.650..0.651 rows=3D1 loops=3D1)=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Sort Key: p= art.p_partkey
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0Sort Method: top-N heapsort =C2=A0Memory: 25kB
=C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0-> =C2=A0Seq Scan on part = =C2=A0(cost=3D0.00..68.00 rows=3D2000 width=3D8) (actual time=3D0.013..0.42= 8 rows=3D2000 loops=3D1)
=C2=A0 =C2=A0-> =C2=A0Nested Loop Left Join = =C2=A0(cost=3D0.00..45266972.75 rows=3D1 width=3D27) (actual time=3D299695.= 096..299695.096 rows=3D0 loops=3D1)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Jo= in Filter: ($0 IS NOT NULL)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Filter: ((= sample_0.l_orderkey IS NULL) AND (sample_0.l_shipmode IS NULL))
=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0Rows Removed by Filter: 3621030625
=C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0-> =C2=A0Seq Scan on lineitem ref_0 =C2=A0(cost= =3D0.00..1969.75 rows=3D60175 width=3D11) (actual time=3D0.026..6.225 rows= =3D60175 loops=3D1)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0-> =C2=A0Materi= alize =C2=A0(cost=3D0.00..2270.62 rows=3D60175 width=3D27) (actual time=3D0= .000..2.554 rows=3D60175 loops=3D60175)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0-> =C2=A0Seq Scan on lineitem sample_0 =C2=A0(co= st=3D0.00..1969.75 rows=3D60175 width=3D27) (actual time=3D0.004..8.169 row= s=3D60175 loops=3D1)
=C2=A0Planning Time: 0.172 ms
=C2=A0Execution Ti= me: 299695.501 ms
(16 rows)

After I set enable_material to off, t= he same query run faster, as below:
set enable_material =3D off;
expl= ain analyze =C2=A0select
=C2=A0 subq_0.c0 as c0,
=C2=A0 subq_0.c1 as = c1,
=C2=A0 subq_0.c2 as c2
from
=C2=A0 (select
=C2=A0 =C2=A0 = =C2=A0 =C2=A0 ref_0.l_shipmode as c0,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 sample= _0.l_orderkey as c1,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 sample_0.l_quantity as = c2,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 ref_0.l_orderkey as c3,
=C2=A0 =C2=A0= =C2=A0 =C2=A0 sample_0.l_shipmode as c5,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 re= f_0.l_shipinstruct as c6
=C2=A0 =C2=A0 =C2=A0 from
=C2=A0 =C2=A0 =C2= =A0 =C2=A0 public.lineitem as ref_0
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 l= eft join public.lineitem as sample_0
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = on ((select p_partkey from public.part order by p_partkey limit 1)
=C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0is not NULL)
= =C2=A0 =C2=A0 =C2=A0 where sample_0.l_orderkey is NULL) as subq_0
where = subq_0.c5 is NULL
limit 1;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 QUERY PLAN =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0
--------= ---------------------------------------------------------------------------= ------------------------------------------------------------
=C2=A0Limit= =C2=A0(cost=3D1078.00..91026185.57 rows=3D1 width=3D27) (actual time=3D192= 669.605..192670.425 rows=3D0 loops=3D1)
=C2=A0 =C2=A0InitPlan 1 (returns= $0)
=C2=A0 =C2=A0 =C2=A0-> =C2=A0Limit =C2=A0(cost=3D78.00..78.00 ro= ws=3D1 width=3D8) (actual time=3D0.662..0.663 rows=3D1 loops=3D1)
=C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0-> =C2=A0Sort =C2=A0(cost=3D78.00..83= .00 rows=3D2000 width=3D8) (actual time=3D0.661..0.662 rows=3D1 loops=3D1)<= br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Sort Key: = part.p_partkey
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0Sort Method: top-N heapsort =C2=A0Memory: 25kB
=C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0-> =C2=A0Seq Scan on part = =C2=A0(cost=3D0.00..68.00 rows=3D2000 width=3D8) (actual time=3D0.017..0.43= 0 rows=3D2000 loops=3D1)
=C2=A0 =C2=A0-> =C2=A0Gather =C2=A0(cost=3D1= 000.00..91026107.57 rows=3D1 width=3D27) (actual time=3D192669.604..192670.= 422 rows=3D0 loops=3D1)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Workers Planne= d: 1
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Params Evaluated: $0
=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0Workers Launched: 1
=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0-> =C2=A0Nested Loop Left Join =C2=A0(cost=3D0.00..91025107.47= rows=3D1 width=3D27) (actual time=3D192588.143..192588.144 rows=3D0 loops= =3D2)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Join Filter= : ($0 IS NOT NULL)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0Filter: ((sample_0.l_orderkey IS NULL) AND (sample_0.l_shipmode IS NULL)= )
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Rows Removed by= Filter: 1810515312
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0-> =C2=A0Parallel Seq Scan on lineitem ref_0 =C2=A0(cost=3D0.00..1721= .97 rows=3D35397 width=3D11) (actual time=3D0.007..3.797 rows=3D30088 loops= =3D2)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0-> =C2= =A0Seq Scan on lineitem sample_0 =C2=A0(cost=3D0.00..1969.75 rows=3D60175 w= idth=3D27) (actual time=3D0.000..2.637 rows=3D60175 loops=3D60175)
=C2= =A0Planning Time: 0.174 ms
=C2=A0Execution Time: 192670.458 ms
(19 ro= ws)

I debug the code and find consider_paralle= l_nestloop() doesn't consider materialized form of the cheapest inner p= ath.
When enable_material =3D true,=C2=A0 we can see Material pat= h won in first plan, but Parallel Seq Scan node doesn't add as outer pa= th, which because
in=C2=A0try_partial_nestloop_path() , the cost = of nestloop wat computed using seq scan path not material path.=C2=A0
=

[1] include test table schema and data, you can repeat = above problem.

I try fix this problem in attached = patch, and I found pg12.12 also had this issue. Please review my patch, tha= nks!=C2=A0

--0000000000002f7f8a060498c009-- --0000000000002f7f8b060498c00b Content-Type: text/plain; charset="US-ASCII"; name="0001-Parallel-seq-scan-should-consider-materila-inner-pat.patch" Content-Disposition: attachment; filename="0001-Parallel-seq-scan-should-consider-materila-inner-pat.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lm62kb5g0 RnJvbSA3YjY1MjM4MjkyOGNjODBhYjZmYmU3ODJmZWFkYTlmMGVhYjRjNWE4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiAidGVuZGVyLndhbmciIDx0ZW5kZXIud2FuZ0BvcGVucGllLmNv bT4KRGF0ZTogVHVlLCA1IFNlcCAyMDIzIDE0OjMzOjI0ICswODAwClN1YmplY3Q6IFtQQVRDSF0g UGFyYWxsZWwgc2VxIHNjYW4gc2hvdWxkIGNvbnNpZGVyIG1hdGVyaWxhIGlubmVyIHBhdGggaW4K IG5lc3Rsb29wIGNhc2UuCgotLS0KIHNyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2pvaW5wYXRo LmMgICAgICAgICB8IDE2ICsrKysrKysrKysrCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3Nl bGVjdF9wYXJhbGxlbC5vdXQgfCAyNyArKysrKysrKysrKysrKysrKysrCiBzcmMvdGVzdC9yZWdy ZXNzL3NxbC9zZWxlY3RfcGFyYWxsZWwuc3FsICAgICAgfCAxMCArKysrKysrCiAzIGZpbGVzIGNo YW5nZWQsIDUzIGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6 ZXIvcGF0aC9qb2lucGF0aC5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvam9pbnBhdGgu YwppbmRleCA4MjFkMjgyNDk3Li41YTEwZmI3ZjRiIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9v cHRpbWl6ZXIvcGF0aC9qb2lucGF0aC5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRo L2pvaW5wYXRoLmMKQEAgLTIwMDQsMTAgKzIwMDQsMjIgQEAgY29uc2lkZXJfcGFyYWxsZWxfbmVz dGxvb3AoUGxhbm5lckluZm8gKnJvb3QsCiB7CiAJSm9pblR5cGUJc2F2ZV9qb2ludHlwZSA9IGpv aW50eXBlOwogCUxpc3RDZWxsICAgKmxjMTsKKwlQYXRoICptYXRwYXRoID0gTlVMTDsKKwlQYXRo ICppbm5lcl9jaGVhcGVzdF90b3RhbCA9IGlubmVycmVsLT5jaGVhcGVzdF90b3RhbF9wYXRoOwog CiAJaWYgKGpvaW50eXBlID09IEpPSU5fVU5JUVVFX0lOTkVSKQogCQlqb2ludHlwZSA9IEpPSU5f SU5ORVI7CiAKKwkvKgorCSAqIENvbnNpZGVyIG1hdGVyaWFsaXppbmcgdGhlIGNoZWFwZXN0IGlu bmVyIHBhdGgsIHVubGVzcworCSAqIGVuYWJsZV9tYXRlcmlhbCBpcyBvZmYgb3IgdGhlIHBhdGgg aW4gcXVlc3Rpb24gbWF0ZXJpYWxpemVzIGl0cworCSAqIG91dHB1dCBhbnl3YXkuCisJICovCisJ aWYgKGVuYWJsZV9tYXRlcmlhbCAmJiBpbm5lcl9jaGVhcGVzdF90b3RhbCAhPSBOVUxMICYmCisJ CSFFeGVjTWF0ZXJpYWxpemVzT3V0cHV0KGlubmVyX2NoZWFwZXN0X3RvdGFsLT5wYXRodHlwZSkp CisJCW1hdHBhdGggPSAoUGF0aCAqKQorCQkJY3JlYXRlX21hdGVyaWFsX3BhdGgoaW5uZXJyZWws IGlubmVyX2NoZWFwZXN0X3RvdGFsKTsKKwogCWZvcmVhY2gobGMxLCBvdXRlcnJlbC0+cGFydGlh bF9wYXRobGlzdCkKIAl7CiAJCVBhdGgJICAgKm91dGVycGF0aCA9IChQYXRoICopIGxmaXJzdChs YzEpOwpAQCAtMjA2NCw2ICsyMDc2LDEwIEBAIGNvbnNpZGVyX3BhcmFsbGVsX25lc3Rsb29wKFBs YW5uZXJJbmZvICpyb290LAogCQkJCXRyeV9wYXJ0aWFsX25lc3Rsb29wX3BhdGgocm9vdCwgam9p bnJlbCwgb3V0ZXJwYXRoLCBtcGF0aCwKIAkJCQkJCQkJCQkgIHBhdGhrZXlzLCBqb2ludHlwZSwg ZXh0cmEpOwogCQl9CisJCS8qIEFsc28gY29uc2lkZXIgbWF0ZXJpYWxpemVkIGZvcm0gb2YgdGhl IGNoZWFwZXN0IGlubmVyIHBhdGggKi8KKwkJaWYgKG1hdHBhdGggIT0gTlVMTCAmJiBtYXRwYXRo LT5wYXJhbGxlbF9zYWZlKQorCQkJdHJ5X3BhcnRpYWxfbmVzdGxvb3BfcGF0aChyb290LCBqb2lu cmVsLCBvdXRlcnBhdGgsIG1hdHBhdGgsCisJCQkJCQkJCQkgIHBhdGhrZXlzLCBqb2ludHlwZSwg ZXh0cmEpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9z ZWxlY3RfcGFyYWxsZWwub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zZWxlY3RfcGFy YWxsZWwub3V0CmluZGV4IGQ4ODM1M2Q0OTYuLjQ1MmEzYWVkMDcgMTAwNjQ0Ci0tLSBhL3NyYy90 ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc2VsZWN0X3BhcmFsbGVsLm91dAorKysgYi9zcmMvdGVzdC9y ZWdyZXNzL2V4cGVjdGVkL3NlbGVjdF9wYXJhbGxlbC5vdXQKQEAgLTg0NCw2ICs4NDQsMzMgQEAg c2VsZWN0ICogZnJvbQogKDEyIHJvd3MpCiAKIHJlc2V0IGVuYWJsZV9tYXRlcmlhbDsKKy0tIHRl c3QgbWF0ZXJpYWxpemVkIGZvcm0gb2YgdGhlIGNoZWFwZXN0IGlubmVyIHBhdGgKK3NldCBtaW5f cGFyYWxsZWxfdGFibGVfc2Nhbl9zaXplID0gJzUxMmtCJzsKK2V4cGxhaW4oY29zdHMgb2ZmKSBz ZWxlY3Qgc3VxLnR3bywgc3VxLmZvdXIKK2Zyb20KKyAoc2VsZWN0IHQxLnR3bywgdDIuZm91ciwg dDEudGVuLHQyLnR3ZW50eQorIGZyb20gdGVuazEgdDEgbGVmdCBqb2luIHRlbmsyIHQyCisgb24g KChzZWxlY3QgcTEgZnJvbSBpbnQ4X3RibCBvcmRlciBieSBxMSBsaW1pdCAxKWlzIG5vdCBudWxs KSB3aGVyZSB0Mi50ZW4gaXMgbnVsbCkgYXMgc3VxOworICAgICAgICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wIExlZnQgSm9pbgorICAgSm9pbiBGaWx0 ZXI6ICgkMCBJUyBOT1QgTlVMTCkKKyAgIEZpbHRlcjogKHQyLnRlbiBJUyBOVUxMKQorICAgSW5p dFBsYW4gMSAocmV0dXJucyAkMCkKKyAgICAgLT4gIExpbWl0CisgICAgICAgICAgIC0+ICBTb3J0 CisgICAgICAgICAgICAgICAgIFNvcnQgS2V5OiBpbnQ4X3RibC5xMQorICAgICAgICAgICAgICAg ICAtPiAgU2VxIFNjYW4gb24gaW50OF90YmwKKyAgIC0+ICBHYXRoZXIKKyAgICAgICAgIFdvcmtl cnMgUGxhbm5lZDogNAorICAgICAgICAgLT4gIFBhcmFsbGVsIFNlcSBTY2FuIG9uIHRlbmsxIHQx CisgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgIC0+ICBHYXRoZXIKKyAgICAgICAgICAgICAg IFdvcmtlcnMgUGxhbm5lZDogMgorICAgICAgICAgICAgICAgLT4gIFBhcmFsbGVsIFNlcSBTY2Fu IG9uIHRlbmsyIHQyCisoMTUgcm93cykKKworc2V0IG1pbl9wYXJhbGxlbF90YWJsZV9zY2FuX3Np emUgPSAwOwogcmVzZXQgZW5hYmxlX2hhc2hhZ2c7CiAtLSBjaGVjayBwYXJhbGxlbGl6ZWQgaW50 OCBhZ2dyZWdhdGUgKGJ1ZyAjMTQ4OTcpCiBleHBsYWluIChjb3N0cyBvZmYpCmRpZmYgLS1naXQg YS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9zZWxlY3RfcGFyYWxsZWwuc3FsIGIvc3JjL3Rlc3QvcmVn cmVzcy9zcWwvc2VsZWN0X3BhcmFsbGVsLnNxbAppbmRleCA4MGM5MTRkYzAyLi5kZWQ0NGEwYzA5 IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9zZWxlY3RfcGFyYWxsZWwuc3FsCisr KyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3NlbGVjdF9wYXJhbGxlbC5zcWwKQEAgLTMxMiw2ICsz MTIsMTYgQEAgc2VsZWN0ICogZnJvbQogCiByZXNldCBlbmFibGVfbWF0ZXJpYWw7CiAKKy0tIHRl c3QgbWF0ZXJpYWxpemVkIGZvcm0gb2YgdGhlIGNoZWFwZXN0IGlubmVyIHBhdGgKK3NldCBtaW5f cGFyYWxsZWxfdGFibGVfc2Nhbl9zaXplID0gJzUxMmtCJzsKKworZXhwbGFpbihjb3N0cyBvZmYp IHNlbGVjdCBzdXEudHdvLCBzdXEuZm91cgorZnJvbQorIChzZWxlY3QgdDEudHdvLCB0Mi5mb3Vy LCB0MS50ZW4sdDIudHdlbnR5CisgZnJvbSB0ZW5rMSB0MSBsZWZ0IGpvaW4gdGVuazIgdDIKKyBv biAoKHNlbGVjdCBxMSBmcm9tIGludDhfdGJsIG9yZGVyIGJ5IHExIGxpbWl0IDEpaXMgbm90IG51 bGwpIHdoZXJlIHQyLnRlbiBpcyBudWxsKSBhcyBzdXE7CisKK3NldCBtaW5fcGFyYWxsZWxfdGFi bGVfc2Nhbl9zaXplID0gMDsKIHJlc2V0IGVuYWJsZV9oYXNoYWdnOwogCiAtLSBjaGVjayBwYXJh bGxlbGl6ZWQgaW50OCBhZ2dyZWdhdGUgKGJ1ZyAjMTQ4OTcpCi0tIAoyLjI1LjEKCg== --0000000000002f7f8b060498c00b--