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 1nCDYl-0000gd-4E for pgsql-hackers@arkaria.postgresql.org; Tue, 25 Jan 2022 04:35:59 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1nCDYj-00026y-3E for pgsql-hackers@arkaria.postgresql.org; Tue, 25 Jan 2022 04:35:57 +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 1nCDYi-00026p-FI for pgsql-hackers@lists.postgresql.org; Tue, 25 Jan 2022 04:35:56 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by makus.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1nCDYa-00057i-3b for pgsql-hackers@lists.postgresql.org; Tue, 25 Jan 2022 04:35:55 +0000 Received: from falcon-note (cyclops.postgrespro.ru [93.174.131.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mail.postgrespro.ru (Postfix) with ESMTPSA id 7642F21C677E for ; Tue, 25 Jan 2022 07:35:45 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mail; t=1643085345; bh=CVucHRg3UcGm76qm11IBe3j7oo+ino0s01Ji05kBTqg=; h=Subject:From:To:Date:In-Reply-To:References; b=IPC0GzgfvP33N7zqPUf8YWz3lUyGmyPnD9ep3NOIc8L8iQnpZPXmzk9E4rrnm4/Ui KoXZr8wCVMhKh/9QgMaO3Nq3bwVZpa8WgSUP2+Zdj+FfO0/Z6gaW9plt7fWM22t00c 09SVip5TOwLCCbisInWHRSchrAntyrRl4NvYd490= Message-ID: Subject: Re: Fix BUG #17335: Duplicate result rows in Gather node From: Yura Sokolov To: pgsql-hackers@lists.postgresql.org Date: Tue, 25 Jan 2022 07:35:45 +0300 In-Reply-To: References: <382c3b52071a087fd4357e22959b3ddb05e524b7.camel@postgrespro.ru> Organization: PostgresPro Content-Type: multipart/mixed; boundary="=-piVF61KB0VGaQEGlAyML" User-Agent: Evolution 3.36.5-0ubuntu1 MIME-Version: 1.0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=-piVF61KB0VGaQEGlAyML Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit В Пн, 24/01/2022 в 16:24 +0300, Yura Sokolov пишет: > В Вс, 23/01/2022 в 14:56 +0300, Yura Sokolov пишет: > > В Чт, 20/01/2022 в 09:32 +1300, David Rowley пишет: > > > On Fri, 31 Dec 2021 at 00:14, Yura Sokolov wrote: > > > > Suggested quick (and valid) fix in the patch attached: > > > > - If Append has single child, then copy its parallel awareness. > > > > > > I've been looking at this and I've gone through changing my mind about > > > what's the right fix quite a number of times. > > > > > > My current thoughts are that I don't really like the fact that we can > > > have plans in the following shape: > > > > > > Finalize Aggregate > > > -> Gather > > > Workers Planned: 1 > > > -> Partial Aggregate > > > -> Parallel Hash Left Join > > > Hash Cond: (gather_append_1.fk = gather_append_2.fk) > > > -> Index Scan using gather_append_1_ix on gather_append_1 > > > Index Cond: (f = true) > > > -> Parallel Hash > > > -> Parallel Seq Scan on gather_append_2 > > > > > > It's only made safe by the fact that Gather will only use 1 worker. > > > To me, it just seems too fragile to assume that's always going to be > > > the case. I feel like this fix just relies on the fact that > > > create_gather_path() and create_gather_merge_path() do > > > "pathnode->num_workers = subpath->parallel_workers;". If someone > > > decided that was to work a different way, then we risk this breaking > > > again. Additionally, today we have Gather and GatherMerge, but we may > > > one day end up with more node types that gather results from parallel > > > workers, or even a completely different way of executing plans. > > > > It seems strange parallel_aware and parallel_safe flags neither affect > > execution nor are properly checked. > > > > Except parallel_safe is checked in ExecSerializePlan which is called from > > ExecInitParallelPlan, which is called from ExecGather and ExecGatherMerge. > > But looks like this check doesn't affect execution as well. > > > > > I think a safer way to fix this is to just not remove the > > > Append/MergeAppend node if the parallel_aware flag of the only-child > > > and the Append/MergeAppend don't match. I've done that in the > > > attached. > > > > > > I believe the code at the end of add_paths_to_append_rel() can remain as is. > > > > I found clean_up_removed_plan_level also called from set_subqueryscan_references. > > Is there a need to patch there as well? > > > > And there is strange state: > > - in the loop by subpaths, pathnode->node.parallel_safe is set to AND of > > all its subpath's parallel_safe > > (therefore there were need to copy it in my patch version), > > - that means, our AppendPath is parallel_aware but not parallel_safe. > > It is ridiculous a bit. > > > > And it is strange AppendPath could have more parallel_workers than sum of > > its children parallel_workers. > > > > So it looks like whole machinery around parallel_aware/parallel_safe has > > no enough consistency. > > > > Either way, I attach you version of fix with my tests as new patch version. > > Looks like volatile "Memory Usage:" in EXPLAIN brokes 'make check' > sporadically. > > Applied replacement in style of memoize.sql test. > > Why there is no way to disable "Buckets: %d Buffers: %d Memory Usage: %dkB" > output in show_hash_info? And another attempt to fix tests volatility. --=-piVF61KB0VGaQEGlAyML Content-Disposition: attachment; filename*0=v4-0001-Fix-duplicate-result-rows-after-Append-path-remov.pat; filename*1=ch Content-Transfer-Encoding: base64 Content-Type: text/x-patch; name="v4-0001-Fix-duplicate-result-rows-after-Append-path-remov.patch"; charset="UTF-8" RnJvbSBmYjA5NDkxYTQwMWYwZGY4MjhmYWY2MDg4MTU4ZjQzMWIyYTY5MzgxIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBZdXJhIFNva29sb3YgPHkuc29rb2xvdkBwb3N0Z3Jlc3Byby5y dT4KRGF0ZTogU3VuLCAyMyBKYW4gMjAyMiAxNDo1MzoyMSArMDMwMApTdWJqZWN0OiBbUEFUQ0gg djRdIEZpeCBkdXBsaWNhdGUgcmVzdWx0IHJvd3MgYWZ0ZXIgQXBwZW5kIHBhdGggcmVtb3ZhbC4K Ckl0IGNvdWxkIGhhcHBlbiBBcHBlbmQgcGF0aCBpcyBjcmVhdGVkIHdpdGggInBhcmFsbGVsX2F3 YXJlIiBmbGFnLApidXQgaXRzIHNpbmdsZSBjaGlsZCBpcyBub3QuIEFwcGVuZCBwYXRoIHBhcmVu dCAoR2F0aGVyIG9yIEdhdGhlciBNZXJnZSkKdGhpbmtzIGl0cyBjaGlsZCBpcyBwYXJhbGxlbF9h d2FyZSwgYnV0IGFmdGVyIEFwcGVuZCBwYXRoIHJlbW92YWwgR2F0aGVyJ3MKY2hpbGQgYmVjb21l IG5vdCBwYXJhbGxlbF9hd2FyZS4gVGhlbiB3aGVuIEdhdGhlci9HYXRoZXIgTWVyZ2UgZGVjaWRl cwp0byBydW4gY2hpbGQgaW4gc2V2ZXJhbCB3b3JrZXJzIG9yIHdvcmtlciArIGxlYWRlciBwYXJ0 aWNpcGF0aW9uLCBpdApnYXRoZXJzIGR1cGxpY2F0ZSByZXN1bHQgcm93cyBmcm9tIHNldmVyYWwg Y2hpbGQgcGF0aCBpbnZvY2F0aW9ucy4KClRvIGZpeCBpdCBkb24ndCByZW1vdmUgQXBwZW5kL01l cmdlQXBwZW5kIG5vZGUgaWYgaXQncyBwYXJhbGxlbF9hd2FyZSAhPQpzaW5nbGUgY2hpbGQgcGFy YWxsZWxfYXdhcmUuCgpBdXRob3JzOiBEYXZpZCBSb3dsZXksIFNva29sb3YgWXVyYS4KLS0tCiBz cmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9zZXRyZWZzLmMgICAgICAgICAgfCAgMjQgKysrLQog Li4uL2V4cGVjdGVkL2dhdGhlcl9yZW1vdmVkX2FwcGVuZC5vdXQgICAgICAgIHwgMTI2ICsrKysr KysrKysrKysrKysrKwogc3JjL3Rlc3QvcmVncmVzcy9wYXJhbGxlbF9zY2hlZHVsZSAgICAgICAg ICAgIHwgICAxICsKIC4uLi9yZWdyZXNzL3NxbC9nYXRoZXJfcmVtb3ZlZF9hcHBlbmQuc3FsICAg ICB8ICA5NCArKysrKysrKysrKysrCiA0IGZpbGVzIGNoYW5nZWQsIDI0MSBpbnNlcnRpb25zKCsp LCA0IGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L3JlZ3Jlc3MvZXhw ZWN0ZWQvZ2F0aGVyX3JlbW92ZWRfYXBwZW5kLm91dAogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90 ZXN0L3JlZ3Jlc3Mvc3FsL2dhdGhlcl9yZW1vdmVkX2FwcGVuZC5zcWwKCmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9zZXRyZWZzLmMgYi9zcmMvYmFja2VuZC9vcHRpbWl6 ZXIvcGxhbi9zZXRyZWZzLmMKaW5kZXggZTQ0YWU5NzFiNGIuLmE3YjExYjdmMDNhIDEwMDY0NAot LS0gYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9zZXRyZWZzLmMKKysrIGIvc3JjL2JhY2tl bmQvb3B0aW1pemVyL3BsYW4vc2V0cmVmcy5jCkBAIC0xNTEyLDggKzE1MTIsMTYgQEAgc2V0X2Fw cGVuZF9yZWZlcmVuY2VzKFBsYW5uZXJJbmZvICpyb290LAogCQlsZmlyc3QobCkgPSBzZXRfcGxh bl9yZWZzKHJvb3QsIChQbGFuICopIGxmaXJzdChsKSwgcnRvZmZzZXQpOwogCX0KIAotCS8qIE5v dywgaWYgdGhlcmUncyBqdXN0IG9uZSwgZm9yZ2V0IHRoZSBBcHBlbmQgYW5kIHJldHVybiB0aGF0 IGNoaWxkICovCi0JaWYgKGxpc3RfbGVuZ3RoKGFwbGFuLT5hcHBlbmRwbGFucykgPT0gMSkKKwkv KgorCSAqIFNlZSBpZiBpdCdzIHNhZmUgdG8gZ2V0IHJpZCBvZiB0aGUgQXBwZW5kIGVudGlyZWx5 LiAgRm9yIHRoaXMgdG8gYmUKKwkgKiBzYWZlLCB0aGVyZSBtdXN0IGJlIG9ubHkgb25lIGNoaWxk IHBsYW4gYW5kIHRoYXQgY2hpbGQgcGxhbidzIHBhcmFsbGVsCisJICogYXdhcmVuZXNzIG11c3Qg bWF0Y2ggdGhhdCBvZiB0aGUgQXBwZW5kJ3MuICBUaGUgcmVhc29uIGZvciB0aGUgbGF0dGVyCisJ ICogaXMgdGhhdCB0aGUgaWYgdGhlIEFwcGVuZCBpcyBwYXJhbGxlbCBhd2FyZSBhbmQgdGhlIGNo aWxkIGlzIG5vdCB0aGVuCisJICogdGhlIGNhbGxpbmcgcGxhbiBtYXkgZXhlY3V0ZSB0aGUgbm9u LXBhcmFsbGVsIGF3YXJlIGNoaWxkIG11bHRpcGxlCisJICogdGltZXMuCisJICovCisJaWYgKGxp c3RfbGVuZ3RoKGFwbGFuLT5hcHBlbmRwbGFucykgPT0gMSAmJgorCQkoKFBsYW4gKikgbGluaXRp YWwoYXBsYW4tPmFwcGVuZHBsYW5zKSktPnBhcmFsbGVsX2F3YXJlID09IGFwbGFuLT5wbGFuLnBh cmFsbGVsX2F3YXJlKQogCQlyZXR1cm4gY2xlYW5fdXBfcmVtb3ZlZF9wbGFuX2xldmVsKChQbGFu ICopIGFwbGFuLAogCQkJCQkJCQkJCSAgIChQbGFuICopIGxpbml0aWFsKGFwbGFuLT5hcHBlbmRw bGFucykpOwogCkBAIC0xNTc2LDggKzE1ODQsMTYgQEAgc2V0X21lcmdlYXBwZW5kX3JlZmVyZW5j ZXMoUGxhbm5lckluZm8gKnJvb3QsCiAJCWxmaXJzdChsKSA9IHNldF9wbGFuX3JlZnMocm9vdCwg KFBsYW4gKikgbGZpcnN0KGwpLCBydG9mZnNldCk7CiAJfQogCi0JLyogTm93LCBpZiB0aGVyZSdz IGp1c3Qgb25lLCBmb3JnZXQgdGhlIE1lcmdlQXBwZW5kIGFuZCByZXR1cm4gdGhhdCBjaGlsZCAq LwotCWlmIChsaXN0X2xlbmd0aChtcGxhbi0+bWVyZ2VwbGFucykgPT0gMSkKKwkvKgorCSAqIFNl ZSBpZiBpdCdzIHNhZmUgdG8gZ2V0IHJpZCBvZiB0aGUgTWVyZ2VBcHBlbmQgZW50aXJlbHkuICBG b3IgdGhpcyB0bworCSAqIGJlIHNhZmUsIHRoZXJlIG11c3QgYmUgb25seSBvbmUgY2hpbGQgcGxh biBhbmQgdGhhdCBjaGlsZCBwbGFuJ3MKKwkgKiBwYXJhbGxlbCBhd2FyZW5lc3MgbXVzdCBtYXRj aCB0aGF0IG9mIHRoZSBNZXJnZUFwcGVuZCdzLiAgVGhlIHJlYXNvbgorCSAqIGZvciB0aGUgbGF0 dGVyIGlzIHRoYXQgdGhlIGlmIHRoZSBNZXJnZUFwcGVuZCBpcyBwYXJhbGxlbCBhd2FyZSBhbmQg dGhlCisJICogY2hpbGQgaXMgbm90IHRoZW4gdGhlIGNhbGxpbmcgcGxhbiBtYXkgZXhlY3V0ZSB0 aGUgbm9uLXBhcmFsbGVsIGF3YXJlCisJICogY2hpbGQgbXVsdGlwbGUgdGltZXMuCisJICovCisJ aWYgKGxpc3RfbGVuZ3RoKG1wbGFuLT5tZXJnZXBsYW5zKSA9PSAxICYmCisJCSgoUGxhbiAqKSBs aW5pdGlhbChtcGxhbi0+bWVyZ2VwbGFucykpLT5wYXJhbGxlbF9hd2FyZSA9PSBtcGxhbi0+cGxh bi5wYXJhbGxlbF9hd2FyZSkKIAkJcmV0dXJuIGNsZWFuX3VwX3JlbW92ZWRfcGxhbl9sZXZlbCgo UGxhbiAqKSBtcGxhbiwKIAkJCQkJCQkJCQkgICAoUGxhbiAqKSBsaW5pdGlhbChtcGxhbi0+bWVy Z2VwbGFucykpOwogCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2dhdGhl cl9yZW1vdmVkX2FwcGVuZC5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2dhdGhlcl9y ZW1vdmVkX2FwcGVuZC5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAu Ljg0OWNmMGFlOTdlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3Rl ZC9nYXRoZXJfcmVtb3ZlZF9hcHBlbmQub3V0CkBAIC0wLDAgKzEsMTI2IEBACistLSBUZXN0IGNv cnJlY3RuZXNzIG9mIHBhcmFsbGVsIHF1ZXJ5IGV4ZWN1dGlvbiBhZnRlciByZW1vdmFsCistLSBv ZiBBcHBlbmQgcGF0aCBkdWUgdG8gc2luZ2xlIG5vbi10cml2aWFsIGNoaWxkLgorRFJPUCBUQUJM RSBJRiBFWElTVFMgZ2F0aGVyX2FwcGVuZF8xLCBnYXRoZXJfYXBwZW5kXzI7CitOT1RJQ0U6ICB0 YWJsZSAiZ2F0aGVyX2FwcGVuZF8xIiBkb2VzIG5vdCBleGlzdCwgc2tpcHBpbmcKK05PVElDRTog IHRhYmxlICJnYXRoZXJfYXBwZW5kXzIiIGRvZXMgbm90IGV4aXN0LCBza2lwcGluZworQ1JFQVRF IFRBQkxFIGdhdGhlcl9hcHBlbmRfMSAoCisgICAgZmsgaW50LAorICAgIGYgYm9vbAorKTsKK0lO U0VSVCBJTlRPIGdhdGhlcl9hcHBlbmRfMSAoZmssIGYpIFNFTEVDVCBpLCBpJTUwPTAgZnJvbSBn ZW5lcmF0ZV9zZXJpZXMoMSwgMjAwMCkgYXMgaTsKK0NSRUFURSBJTkRFWCBnYXRoZXJfYXBwZW5k XzFfaXggb24gZ2F0aGVyX2FwcGVuZF8xIChmKTsKK0NSRUFURSBUQUJMRSBnYXRoZXJfYXBwZW5k XzIgKAorICAgIGZrIGludCwKKyAgICB2YWwgc2VyaWFsCispOworSU5TRVJUIElOVE8gZ2F0aGVy X2FwcGVuZF8yIChmaykgU0VMRUNUIGZrIGZyb20gZ2F0aGVyX2FwcGVuZF8xLCBnZW5lcmF0ZV9z ZXJpZXMoMSwgNSkgYXMgaTsKK0FOQUxZWkUgZ2F0aGVyX2FwcGVuZF8xLCBnYXRoZXJfYXBwZW5k XzI7CitTRVQgbWF4X3BhcmFsbGVsX3dvcmtlcnNfcGVyX2dhdGhlciA9IDA7CistLSBGaW5kIGNv cnJlY3Qgcm93cyBjb3VudAorU0VMRUNUIGNvdW50KDEpCitGUk9NICgKKyAgU0VMRUNUIGZrIEZS T00gZ2F0aGVyX2FwcGVuZF8xIFdIRVJFIGYKKyAgVU5JT04gQUxMCisgIFNFTEVDVCBmayBGUk9N IGdhdGhlcl9hcHBlbmRfMSBXSEVSRSBmYWxzZQorKSBhcyB0CitMRUZUIE9VVEVSIEpPSU4gZ2F0 aGVyX2FwcGVuZF8yCitVU0lORyAoZmspOworIGNvdW50IAorLS0tLS0tLQorICAgMjAwCisoMSBy b3cpCisKK1NFVCBwYXJhbGxlbF9zZXR1cF9jb3N0ID0gMDsKK1NFVCBwYXJhbGxlbF90dXBsZV9j b3N0ID0gMC4xOworU0VUIG1pbl9wYXJhbGxlbF90YWJsZV9zY2FuX3NpemUgPSAwOworU0VUIG1h eF9wYXJhbGxlbF93b3JrZXJzX3Blcl9nYXRoZXIgPSAyOworU0VMRUNUIGNvdW50KDEpCitGUk9N ICgKKyAgU0VMRUNUIGZrIEZST00gZ2F0aGVyX2FwcGVuZF8xIFdIRVJFIGYKKyAgVU5JT04gQUxM CisgIFNFTEVDVCBmayBGUk9NIGdhdGhlcl9hcHBlbmRfMSBXSEVSRSBmYWxzZQorKSBhcyB0CitM RUZUIE9VVEVSIEpPSU4gZ2F0aGVyX2FwcGVuZF8yCitVU0lORyAoZmspOworIGNvdW50IAorLS0t LS0tLQorICAgMjAwCisoMSByb3cpCisKKy0tIFRoZSBidWNrZXRzL2JhdGNoZXMvbWVtb3J5IHZh bHVlcyBmcm9tIHRoZSBQYXJhbGxlbCBIYXNoIG5vZGUgY2FuIHZhcnkgYmV0d2VlbgorLS0gbWFj aGluZXMuICBMZXQncyBqdXN0IHJlcGxhY2UgdGhlIG51bWJlciB3aXRoIGFuICdOJy4KK2NyZWF0 ZSBmdW5jdGlvbiBleHBsYWluX2dhdGhlcihxdWVyeSB0ZXh0KSByZXR1cm5zIHNldG9mIHRleHQK K2xhbmd1YWdlIHBscGdzcWwgYXMKKyQkCitkZWNsYXJlCisgICAgbG4gdGV4dDsKK2JlZ2luCisg ICAgZm9yIGxuIGluCisgICAgICAgIGV4ZWN1dGUgZm9ybWF0KCdleHBsYWluIChhbmFseXplLCBj b3N0cyBvZmYsIHN1bW1hcnkgb2ZmLCB0aW1pbmcgb2ZmLCB2ZXJib3NlIG9mZiwgYnVmZmVycyBv ZmYpICVzJywKKyAgICAgICAgICAgIHF1ZXJ5KQorICAgIGxvb3AKKyAgICAgICAgaWYgbm90IGxu IGxpa2UgJyVHYXRoZXIlJyB0aGVuCisgICAgICAgICAgICBsbiA6PSByZWdleHBfcmVwbGFjZShs biwgJ2FjdHVhbCByb3dzPVxkKyBsb29wcz1cZCsnLCAnYWN0dWFsIHJvd3M9UiBsb29wcz1MJyk7 CisgICAgICAgIGVuZCBpZjsKKyAgICAgICAgbG4gOj0gcmVnZXhwX3JlcGxhY2UobG4sICdCdWNr ZXRzOiBcZCsnLCAnQnVja2V0czogTicpOworICAgICAgICBsbiA6PSByZWdleHBfcmVwbGFjZShs biwgJ0JhdGNoZXM6IFxkKycsICdCYXRjaGVzOiBOJyk7CisgICAgICAgIGxuIDo9IHJlZ2V4cF9y ZXBsYWNlKGxuLCAnTWVtb3J5IFVzYWdlOiBcZCsnLCAnTWVtb3J5IFVzYWdlOiBOJyk7CisgICAg ICAgIHJldHVybiBuZXh0IGxuOworICAgIGVuZCBsb29wOworZW5kOworJCQ7CistLSBSZXN1bHQg cm93cyBpbiByb290IG5vZGUgc2hvdWxkIGJlIGVxdWFsIHRvIG5vbi1wYXJhbGxlbCBjb3VudAor U0VMRUNUIGV4cGxhaW5fZ2F0aGVyKCcKK1NFTEVDVCB2YWwKK0ZST00gKAorICBTRUxFQ1QgZmsg RlJPTSBnYXRoZXJfYXBwZW5kXzEgV0hFUkUgZgorICBVTklPTiBBTEwKKyAgU0VMRUNUIGZrIEZS T00gZ2F0aGVyX2FwcGVuZF8xIFdIRVJFIGZhbHNlCispIGFzIHQKK0xFRlQgT1VURVIgSk9JTiBn YXRoZXJfYXBwZW5kXzIKK1VTSU5HIChmayk7Jyk7CisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBleHBsYWluX2dhdGhlciAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyBHYXRoZXIgKGFjdHVhbCByb3dzPTIwMCBsb29wcz0xKQorICAgV29ya2VycyBQbGFubmVk OiAxCisgICBXb3JrZXJzIExhdW5jaGVkOiAxCisgICAtPiAgUGFyYWxsZWwgSGFzaCBMZWZ0IEpv aW4gKGFjdHVhbCByb3dzPVIgbG9vcHM9TCkKKyAgICAgICAgIEhhc2ggQ29uZDogKGdhdGhlcl9h cHBlbmRfMS5mayA9IGdhdGhlcl9hcHBlbmRfMi5maykKKyAgICAgICAgIC0+ICBQYXJhbGxlbCBB cHBlbmQgKGFjdHVhbCByb3dzPVIgbG9vcHM9TCkKKyAgICAgICAgICAgICAgIC0+ICBJbmRleCBT Y2FuIHVzaW5nIGdhdGhlcl9hcHBlbmRfMV9peCBvbiBnYXRoZXJfYXBwZW5kXzEgKGFjdHVhbCBy b3dzPVIgbG9vcHM9TCkKKyAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChmID0gdHJ1 ZSkKKyAgICAgICAgIC0+ICBQYXJhbGxlbCBIYXNoIChhY3R1YWwgcm93cz1SIGxvb3BzPUwpCisg ICAgICAgICAgICAgICBCdWNrZXRzOiBOICBCYXRjaGVzOiBOICBNZW1vcnkgVXNhZ2U6IE5rQgor ICAgICAgICAgICAgICAgLT4gIFBhcmFsbGVsIFNlcSBTY2FuIG9uIGdhdGhlcl9hcHBlbmRfMiAo YWN0dWFsIHJvd3M9UiBsb29wcz1MKQorKDExIHJvd3MpCisKKy0tIFJlc3VsdCByb3dzIGluIHJv b3Qgbm9kZSBzaG91bGQgYmUgZXF1YWwgdG8gbm9uLXBhcmFsbGVsIGNvdW50CitTRUxFQ1QgZXhw bGFpbl9nYXRoZXIoJworU0VMRUNUIHZhbAorRlJPTSAoCisgIFNFTEVDVCBmayBGUk9NIGdhdGhl cl9hcHBlbmRfMSBXSEVSRSBmCisgIFVOSU9OIEFMTAorICBTRUxFQ1QgZmsgRlJPTSBnYXRoZXJf YXBwZW5kXzEgV0hFUkUgZmFsc2UKKykgYXMgdAorTEVGVCBPVVRFUiBKT0lOIGdhdGhlcl9hcHBl bmRfMgorVVNJTkcgKGZrKQorT1JERVIgQlkgdmFsOycpOworICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgZXhwbGFpbl9nYXRoZXIgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgR2F0aGVyIE1lcmdlIChhY3R1YWwgcm93cz0yMDAgbG9vcHM9 MSkKKyAgIFdvcmtlcnMgUGxhbm5lZDogMQorICAgV29ya2VycyBMYXVuY2hlZDogMQorICAgLT4g IFNvcnQgKGFjdHVhbCByb3dzPVIgbG9vcHM9TCkKKyAgICAgICAgIFNvcnQgS2V5OiBnYXRoZXJf YXBwZW5kXzIudmFsCisgICAgICAgICBTb3J0IE1ldGhvZDogcXVpY2tzb3J0ICBNZW1vcnk6IDI1 a0IKKyAgICAgICAgIFdvcmtlciAwOiAgU29ydCBNZXRob2Q6IHF1aWNrc29ydCAgTWVtb3J5OiAy NWtCCisgICAgICAgICAtPiAgUGFyYWxsZWwgSGFzaCBMZWZ0IEpvaW4gKGFjdHVhbCByb3dzPVIg bG9vcHM9TCkKKyAgICAgICAgICAgICAgIEhhc2ggQ29uZDogKGdhdGhlcl9hcHBlbmRfMS5mayA9 IGdhdGhlcl9hcHBlbmRfMi5maykKKyAgICAgICAgICAgICAgIC0+ICBQYXJhbGxlbCBBcHBlbmQg KGFjdHVhbCByb3dzPVIgbG9vcHM9TCkKKyAgICAgICAgICAgICAgICAgICAgIC0+ICBJbmRleCBT Y2FuIHVzaW5nIGdhdGhlcl9hcHBlbmRfMV9peCBvbiBnYXRoZXJfYXBwZW5kXzEgKGFjdHVhbCBy b3dzPVIgbG9vcHM9TCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChm ID0gdHJ1ZSkKKyAgICAgICAgICAgICAgIC0+ICBQYXJhbGxlbCBIYXNoIChhY3R1YWwgcm93cz1S IGxvb3BzPUwpCisgICAgICAgICAgICAgICAgICAgICBCdWNrZXRzOiBOICBCYXRjaGVzOiBOICBN ZW1vcnkgVXNhZ2U6IE5rQgorICAgICAgICAgICAgICAgICAgICAgLT4gIFBhcmFsbGVsIFNlcSBT Y2FuIG9uIGdhdGhlcl9hcHBlbmRfMiAoYWN0dWFsIHJvd3M9UiBsb29wcz1MKQorKDE1IHJvd3Mp CisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvcGFyYWxsZWxfc2NoZWR1bGUgYi9zcmMv dGVzdC9yZWdyZXNzL3BhcmFsbGVsX3NjaGVkdWxlCmluZGV4IDViMGM3M2Q3ZTM3Li44NGYyZjgx MjU1ZCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9wYXJhbGxlbF9zY2hlZHVsZQorKysg Yi9zcmMvdGVzdC9yZWdyZXNzL3BhcmFsbGVsX3NjaGVkdWxlCkBAIC0xMDAsNiArMTAwLDcgQEAg dGVzdDogcnVsZXMgcHNxbCBwc3FsX2Nyb3NzdGFiIGFtdXRpbHMgc3RhdHNfZXh0IGNvbGxhdGUu bGludXgudXRmOAogdGVzdDogc2VsZWN0X3BhcmFsbGVsCiB0ZXN0OiB3cml0ZV9wYXJhbGxlbAog dGVzdDogdmFjdXVtX3BhcmFsbGVsCit0ZXN0OiBnYXRoZXJfcmVtb3ZlZF9hcHBlbmQKIAogIyBu byByZWxhdGlvbiByZWxhdGVkIHRlc3RzIGNhbiBiZSBwdXQgaW4gdGhpcyBncm91cAogdGVzdDog cHVibGljYXRpb24gc3Vic2NyaXB0aW9uCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3Nx bC9nYXRoZXJfcmVtb3ZlZF9hcHBlbmQuc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvZ2F0aGVy X3JlbW92ZWRfYXBwZW5kLnNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw MC4uM2FmODhiMjlmMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9n YXRoZXJfcmVtb3ZlZF9hcHBlbmQuc3FsCkBAIC0wLDAgKzEsOTQgQEAKKy0tIFRlc3QgY29ycmVj dG5lc3Mgb2YgcGFyYWxsZWwgcXVlcnkgZXhlY3V0aW9uIGFmdGVyIHJlbW92YWwKKy0tIG9mIEFw cGVuZCBwYXRoIGR1ZSB0byBzaW5nbGUgbm9uLXRyaXZpYWwgY2hpbGQuCisKK0RST1AgVEFCTEUg SUYgRVhJU1RTIGdhdGhlcl9hcHBlbmRfMSwgZ2F0aGVyX2FwcGVuZF8yOworCitDUkVBVEUgVEFC TEUgZ2F0aGVyX2FwcGVuZF8xICgKKyAgICBmayBpbnQsCisgICAgZiBib29sCispOworCitJTlNF UlQgSU5UTyBnYXRoZXJfYXBwZW5kXzEgKGZrLCBmKSBTRUxFQ1QgaSwgaSU1MD0wIGZyb20gZ2Vu ZXJhdGVfc2VyaWVzKDEsIDIwMDApIGFzIGk7CisKK0NSRUFURSBJTkRFWCBnYXRoZXJfYXBwZW5k XzFfaXggb24gZ2F0aGVyX2FwcGVuZF8xIChmKTsKKworQ1JFQVRFIFRBQkxFIGdhdGhlcl9hcHBl bmRfMiAoCisgICAgZmsgaW50LAorICAgIHZhbCBzZXJpYWwKKyk7CisKK0lOU0VSVCBJTlRPIGdh dGhlcl9hcHBlbmRfMiAoZmspIFNFTEVDVCBmayBmcm9tIGdhdGhlcl9hcHBlbmRfMSwgZ2VuZXJh dGVfc2VyaWVzKDEsIDUpIGFzIGk7CisKK0FOQUxZWkUgZ2F0aGVyX2FwcGVuZF8xLCBnYXRoZXJf YXBwZW5kXzI7CisKK1NFVCBtYXhfcGFyYWxsZWxfd29ya2Vyc19wZXJfZ2F0aGVyID0gMDsKKwor LS0gRmluZCBjb3JyZWN0IHJvd3MgY291bnQKK1NFTEVDVCBjb3VudCgxKQorRlJPTSAoCisgIFNF TEVDVCBmayBGUk9NIGdhdGhlcl9hcHBlbmRfMSBXSEVSRSBmCisgIFVOSU9OIEFMTAorICBTRUxF Q1QgZmsgRlJPTSBnYXRoZXJfYXBwZW5kXzEgV0hFUkUgZmFsc2UKKykgYXMgdAorTEVGVCBPVVRF UiBKT0lOIGdhdGhlcl9hcHBlbmRfMgorVVNJTkcgKGZrKTsKKworU0VUIHBhcmFsbGVsX3NldHVw X2Nvc3QgPSAwOworU0VUIHBhcmFsbGVsX3R1cGxlX2Nvc3QgPSAwLjE7CitTRVQgbWluX3BhcmFs bGVsX3RhYmxlX3NjYW5fc2l6ZSA9IDA7CitTRVQgbWF4X3BhcmFsbGVsX3dvcmtlcnNfcGVyX2dh dGhlciA9IDI7CisKK1NFTEVDVCBjb3VudCgxKQorRlJPTSAoCisgIFNFTEVDVCBmayBGUk9NIGdh dGhlcl9hcHBlbmRfMSBXSEVSRSBmCisgIFVOSU9OIEFMTAorICBTRUxFQ1QgZmsgRlJPTSBnYXRo ZXJfYXBwZW5kXzEgV0hFUkUgZmFsc2UKKykgYXMgdAorTEVGVCBPVVRFUiBKT0lOIGdhdGhlcl9h cHBlbmRfMgorVVNJTkcgKGZrKTsKKworLS0gVGhlIGJ1Y2tldHMvYmF0Y2hlcy9tZW1vcnkgdmFs dWVzIGZyb20gdGhlIFBhcmFsbGVsIEhhc2ggbm9kZSBjYW4gdmFyeSBiZXR3ZWVuCistLSBtYWNo aW5lcy4gIExldCdzIGp1c3QgcmVwbGFjZSB0aGUgbnVtYmVyIHdpdGggYW4gJ04nLgorY3JlYXRl IGZ1bmN0aW9uIGV4cGxhaW5fZ2F0aGVyKHF1ZXJ5IHRleHQpIHJldHVybnMgc2V0b2YgdGV4dAor bGFuZ3VhZ2UgcGxwZ3NxbCBhcworJCQKK2RlY2xhcmUKKyAgICBsbiB0ZXh0OworYmVnaW4KKyAg ICBmb3IgbG4gaW4KKyAgICAgICAgZXhlY3V0ZSBmb3JtYXQoJ2V4cGxhaW4gKGFuYWx5emUsIGNv c3RzIG9mZiwgc3VtbWFyeSBvZmYsIHRpbWluZyBvZmYsIHZlcmJvc2Ugb2ZmLCBidWZmZXJzIG9m ZikgJXMnLAorICAgICAgICAgICAgcXVlcnkpCisgICAgbG9vcAorICAgICAgICBpZiBub3QgbG4g bGlrZSAnJUdhdGhlciUnIHRoZW4KKyAgICAgICAgICAgIGxuIDo9IHJlZ2V4cF9yZXBsYWNlKGxu LCAnYWN0dWFsIHJvd3M9XGQrIGxvb3BzPVxkKycsICdhY3R1YWwgcm93cz1SIGxvb3BzPUwnKTsK KyAgICAgICAgZW5kIGlmOworICAgICAgICBsbiA6PSByZWdleHBfcmVwbGFjZShsbiwgJ0J1Y2tl dHM6IFxkKycsICdCdWNrZXRzOiBOJyk7CisgICAgICAgIGxuIDo9IHJlZ2V4cF9yZXBsYWNlKGxu LCAnQmF0Y2hlczogXGQrJywgJ0JhdGNoZXM6IE4nKTsKKyAgICAgICAgbG4gOj0gcmVnZXhwX3Jl cGxhY2UobG4sICdNZW1vcnkgVXNhZ2U6IFxkKycsICdNZW1vcnkgVXNhZ2U6IE4nKTsKKyAgICAg ICAgcmV0dXJuIG5leHQgbG47CisgICAgZW5kIGxvb3A7CitlbmQ7CiskJDsKKworLS0gUmVzdWx0 IHJvd3MgaW4gcm9vdCBub2RlIHNob3VsZCBiZSBlcXVhbCB0byBub24tcGFyYWxsZWwgY291bnQK K1NFTEVDVCBleHBsYWluX2dhdGhlcignCitTRUxFQ1QgdmFsCitGUk9NICgKKyAgU0VMRUNUIGZr IEZST00gZ2F0aGVyX2FwcGVuZF8xIFdIRVJFIGYKKyAgVU5JT04gQUxMCisgIFNFTEVDVCBmayBG Uk9NIGdhdGhlcl9hcHBlbmRfMSBXSEVSRSBmYWxzZQorKSBhcyB0CitMRUZUIE9VVEVSIEpPSU4g Z2F0aGVyX2FwcGVuZF8yCitVU0lORyAoZmspOycpOworCistLSBSZXN1bHQgcm93cyBpbiByb290 IG5vZGUgc2hvdWxkIGJlIGVxdWFsIHRvIG5vbi1wYXJhbGxlbCBjb3VudAorU0VMRUNUIGV4cGxh aW5fZ2F0aGVyKCcKK1NFTEVDVCB2YWwKK0ZST00gKAorICBTRUxFQ1QgZmsgRlJPTSBnYXRoZXJf YXBwZW5kXzEgV0hFUkUgZgorICBVTklPTiBBTEwKKyAgU0VMRUNUIGZrIEZST00gZ2F0aGVyX2Fw cGVuZF8xIFdIRVJFIGZhbHNlCispIGFzIHQKK0xFRlQgT1VURVIgSk9JTiBnYXRoZXJfYXBwZW5k XzIKK1VTSU5HIChmaykKK09SREVSIEJZIHZhbDsnKTsKLS0gCjIuMzQuMQoK --=-piVF61KB0VGaQEGlAyML--