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.96) (envelope-from ) id 1vvKAr-00DocU-02 for pgsql-hackers@arkaria.postgresql.org; Wed, 25 Feb 2026 19:03:53 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vvKAp-008LUb-06 for pgsql-hackers@arkaria.postgresql.org; Wed, 25 Feb 2026 19:03:51 +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.96) (envelope-from ) id 1vvKAo-008LUT-29 for pgsql-hackers@lists.postgresql.org; Wed, 25 Feb 2026 19:03:50 +0000 Received: from mail-lf1-x133.google.com ([2a00:1450:4864:20::133]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vvKAk-00000001GVc-3ihV for pgsql-hackers@lists.postgresql.org; Wed, 25 Feb 2026 19:03:50 +0000 Received: by mail-lf1-x133.google.com with SMTP id 2adb3069b0e04-59e4993e00aso17102e87.3 for ; Wed, 25 Feb 2026 11:03:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1772046225; cv=none; d=google.com; s=arc-20240605; b=I/j6GW7BfbNEIMyxKmkruUu3luphvoul6j+GgioSL/7pKMqW1HpQQ1sU5/KoMK0ReR XXgnbnkx1gviN2Aa1YjfSlM3KPzRP/7vFj95iddBMHNhQ7AfV8UDYS0aCbbAdd+5CCfL GGO1Mir6zrdzAV+ejwgTNyufGFb28toTvJvNZ7sgErHXYYcUM/ck2ClCxouh3+IZ9jeV UYo9HXuUhvZVawAymxhnFzwD/jy6U/jdODhheWcmz/5DPJenLY4PnUT0UijFsOo5wGYV yRb3KIuJGoKl9fprF3jxUbB/zQTglEfIazi9lvFgi5/5aqvY4YDbKbu8s7V6ClFEEt3h XOFA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=yjZ9GYH8wqWzzpv/U3K2CJuYQc9IXYsESLyelKj0uD0=; fh=cwkwuxD2dvvlUMVELZog5sj2eIqdEPq1zCWDpGHoZSQ=; b=IYLyoyHptkmAtVw2PZMnQXwDbNupsiwdPZ8IxIZ8AfxFqhOaCLK05MgRt5SVIUrWWF SppWng9S2twXzs4KenTLt+2Ea1wXshSu3E4t0zxnRurBq7pxO6r0vDzTDbFCRdu/4+2i YJompRXFz9Y3kuEOY3kWjvhqJIv3H1B9TNsKyRvZ7Q66z6rpySsjv9I78EbODlrV44O9 no4U2vKHg3tE1cM0TFiJbBCKyx68AxzmYKl1kSX6qqWN9rVTekvjd7rYYWvRTaF7tP5t gPzHBGEYqKAwU8nIuffwmUgIrWj1WkgRJ57AbAn9NuTYu7ohW2DmYwH93WPQ0aTsbXC5 frsg==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772046225; x=1772651025; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=yjZ9GYH8wqWzzpv/U3K2CJuYQc9IXYsESLyelKj0uD0=; b=dC806HD67JoOHCWvDqQ9miAqAd8XjV+9mUd+gHsiTIjDydaOKqxdBM1TdMAvTSXLpL 4vmwMYW+XUUy8Y1RLmPp/n/CE4k/PoIakiNYJHe4lISAEzzwor3zLzQMZmdBWWFq3+8C xoMYQf+swLrgaJdGbIQFtMnf2Z72fiEF+9IYiQhqAziPA082qdGDhFfNjhgrQAaG9bir z4POHKm99mdXr7gd2oZ0BieIVccRtvis5BlMVjFYug6pVp1S8OGEBs7sTui3bq6E/Dsm 8FNJ4Tf/A0skttV78mC/fNgW0ZbtDW3WjcJaHehNh1wLbu/kZy9yzCpNDFpn95G8H+f8 mE+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772046225; x=1772651025; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=yjZ9GYH8wqWzzpv/U3K2CJuYQc9IXYsESLyelKj0uD0=; b=DegmL/07PXxaa7u11NY9FXRHzApe4AiNhKVA0guwQ/DkPpKLnkmdAR9F/E6OPDMFXJ GItsI3+jIiLHX6OJpLRbxT+ZQI1NSfeOMO4UxrE+5YIguVSDANWPqoANLgaj4LZ6fuYC wo2VJJAC1CO1sHfPVeTnJqyEpQoD4xB3u5Dg33Y+0QoUUeJd1ucNGASFWiET0YBcL5Ni 2fSqvw4gItZ/NFcGUZZiHlN3/YiVv5xBH9muSZb7T9y47lBOWYJSB9g6PhpCX0vqvYGN sAEp/mjW8MefTB26ng0leiyZlEjqF050Wc3DfhYO7tA/RKpq4pf4TY5tyonLWm7QkBB7 dHFQ== X-Gm-Message-State: AOJu0YxUVdcJbPLGK1t/x4QJTR8yXvEoywYMkXMX49nDxC3iyLSnsm69 1d74JvFuHmQof9t9DL/jWE3Y4yJ/+XpLNkShWlN0tGP4yMLeEEW/vygO2gA32s9qVwZ9WrnZr/d Diqv2CZtRkLM59/jjZoa+DXFo5UDE+U0yKw== X-Gm-Gg: ATEYQzyz7DyaY/yBUREXbp5A3U/YvYynAvQDhRzmWBFGr5J70kOqCjka7kRnKorIdEC QyGjAGIs+K5sadBD2rSuKuHdZVVacKL87bD9AePkl7FxtvqBNmM50Xge4GcfC/AGEKOnDI+tYyz dILsjVHLARo7qXuf+Iz9oxULZ0UBwGkjQktYnK0RWDgfDkEQ19YwqoBhlrAjT8/VqQRTAevkcKB ZThu66pnhRqY6d8PrLJiJ9z/NGtmABYI+yhTc9X4C8ykC1fRnmXnZlNcgjET18BNIFTBcQ9dTxL rfPRRHwP X-Received: by 2002:a05:6512:1055:b0:5a0:fd42:fbca with SMTP id 2adb3069b0e04-5a0fd42fc5emr2273849e87.38.1772046224881; Wed, 25 Feb 2026 11:03:44 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Masahiko Sawada Date: Wed, 25 Feb 2026 11:03:08 -0800 X-Gm-Features: AaiRm51FEDAMJN-9hY4RVAHE0vlPaa6Ii9Di7VoYBMpRY-UBk8308wfOdFKEyho Message-ID: Subject: Re: Initial COPY of Logical Replication is too slow To: Marcos Pegoraro Cc: PostgreSQL Hackers Content-Type: multipart/mixed; boundary="000000000000c29589064baaa9dd" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000c29589064baaa9dd Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Mon, Jan 26, 2026 at 12:30=E2=80=AFPM Masahiko Sawada wrote: > > On Mon, Jan 19, 2026 at 9:44=E2=80=AFAM Marcos Pegoraro wrote: > > > > Em sex., 19 de dez. de 2025 =C3=A0s 22:59, Masahiko Sawada escreveu: > >> > >> Yeah, if we pass a publication that a lot of tables belong to to > >> pg_get_publication_tables(), it could take a long time to return as it > >> needs to construct many entries. > > > > > > Well, I don't know how to help but I'm sure it's working badly. > > Today I added some fields on my server, then seeing logs I could see ho= w slow this process is. > > > > duration: 2213.872 ms statement: SELECT DISTINCT (CASE WHEN (array_le= ngth(gpt.attrs, 1) =3D c.relnatts) THEN NULL ELSE gpt.attrs END) FROM pg= _publication p, LATERAL pg_get_publication_tables(p.pubname) gpt, pg_clas= s c WHERE gpt.relid =3D 274376788 AND c.oid =3D gpt.relid AND p.pubname I= N ( 'mypub' ) > > > > 2 seconds to get the list of fields of a table is really too slow. > > How can we solve this ? > > After more investigation of slowness, it seems that the > list_concat_unique_oid() called below is quite slow when the database > has a lot of tables to publish: > > relids =3D GetPublicationRelations(pub_elem->oid, > pub_elem->pubviaroot ? > PUBLICATION_PART_ROOT : > PUBLICATION_PART_LEAF); > schemarelids =3D GetAllSchemaPublicationRelations(pub_elem->oid, > pub_elem->pubviaroot= ? > PUBLICATION_PART_ROO= T : > PUBLICATION_PART_LEA= F); > pub_elem_tables =3D list_concat_unique_oid(relids, schemarelids); > > This is simply because it's O(n^2), where n is the number of oids in > schemarelids in the test case. A simple change would be to do sort & > dedup instead. With the attached experimental patch, the > pg_get_publication_tables() execution time gets halved in my > environment (796ms -> 430ms with 50k tables). If the number of tables > is not large, this method might be slower than today but it's not a > huge regression. > > In the initial tablesync cases, it could be optimized further in a way > that we introduce a new SQL function that gets the column list and > expr of the specific table. This way, we can filter the result by > relid at an early stage instead of getting all information and > filtering by relid as the tablesync worker does today, avoiding > overheads of gathering system catalog scan results. I've drafted this idea and I find it looks like a better approach. The patch introduces the pg_get_publication_table_info() SQL function that returns the column list and row filter expression like pg_get_publication_tables() returns but it checks only the specific table unlike pg_get_publication_tables(). On my env, the tablesync worker's query in question becomes 0.6ms from 288 ms with 50k tables in one publication. Feedback is very welcome. Regards, --=20 Masahiko Sawada Amazon Web Services: https://aws.amazon.com --000000000000c29589064baaa9dd Content-Type: text/x-patch; charset="US-ASCII"; name="0001-Add-pg_get_publication_table_info-to-optimize-logica.patch" Content-Disposition: attachment; filename="0001-Add-pg_get_publication_table_info-to-optimize-logica.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mm2ei9pb0 RnJvbSA1NGFmMmI3OTRkNzQxODY1ZmQwNmU5NzczOGI3ZmRiMzRlMjliMTdlIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXNhaGlrbyBTYXdhZGEgPHNhd2FkYS5tc2hrQGdtYWlsLmNv bT4KRGF0ZTogV2VkLCAyNSBGZWIgMjAyNiAxMDo1Njo0NSAtMDgwMApTdWJqZWN0OiBbUEFUQ0hd IEFkZCBwZ19nZXRfcHVibGljYXRpb25fdGFibGVfaW5mbygpIHRvIG9wdGltaXplIGxvZ2ljYWwK IHJlcGxpY2F0aW9uIHRhYmxlc3luYy4KCi0tLQogc3JjL2JhY2tlbmQvY2F0YWxvZy9wZ19wdWJs aWNhdGlvbi5jICAgICAgICB8IDIyMiArKysrKysrKysrKysrKysrKysrLQogc3JjL2JhY2tlbmQv cmVwbGljYXRpb24vbG9naWNhbC90YWJsZXN5bmMuYyB8ICAgOSArLQogc3JjL2luY2x1ZGUvY2F0 YWxvZy9wZ19wcm9jLmRhdCAgICAgICAgICAgICB8ICAgOSArCiAzIGZpbGVzIGNoYW5nZWQsIDIz NCBpbnNlcnRpb25zKCspLCA2IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5k L2NhdGFsb2cvcGdfcHVibGljYXRpb24uYyBiL3NyYy9iYWNrZW5kL2NhdGFsb2cvcGdfcHVibGlj YXRpb24uYwppbmRleCA5YTQ3OTFjNTczZS4uMGEzMDE1ZmZjOTEgMTAwNjQ0Ci0tLSBhL3NyYy9i YWNrZW5kL2NhdGFsb2cvcGdfcHVibGljYXRpb24uYworKysgYi9zcmMvYmFja2VuZC9jYXRhbG9n L3BnX3B1YmxpY2F0aW9uLmMKQEAgLTExMTYsNiArMTExNiwxMTEgQEAgR2V0UHVibGljYXRpb25C eU5hbWUoY29uc3QgY2hhciAqcHVibmFtZSwgYm9vbCBtaXNzaW5nX29rKQogCXJldHVybiBPaWRJ c1ZhbGlkKG9pZCkgPyBHZXRQdWJsaWNhdGlvbihvaWQpIDogTlVMTDsKIH0KIAorLyoKKyAqIHBn X2dldF9wdWJsaWNhdGlvbl90YWJsZXMoKSBhbmQgcGdfZ2V0X3B1YmxpY2F0aW9uX3RhYmxlX2lu Zm8oKSB1c2UKKyAqIHRoZSBzYW1lIHJlY29yZCB0eXBlLgorICovCisjZGVmaW5lIE5VTV9QVUJM SUNBVElPTl9UQUJMRVNfRUxFTSA0CisKKy8qCisgKiBDb21tb24gcm91dGluZSBmb3IgcGdfZ2V0 X3B1YmxpY2F0aW9uX3RhYmxlcygpIGFuZAorICogcGdfZ2V0X3B1YmxpY2F0aW9uX3RhYmxlX2lu Zm8oKSB0byBjb25zdHJ1Y3QgdGhlIHJlc3VsdCB0dXBsZS4KKyAqLworc3RhdGljIEhlYXBUdXBs ZQorY29uc3RydWN0X3B1Ymxpc2hlZF9yZWxfdHVwbGUocHVibGlzaGVkX3JlbCAqdGFibGVfaW5m bywgVHVwbGVEZXNjIHR1cGxlX2Rlc2MpCit7CisJUHVibGljYXRpb24gKnB1YjsKKwlPaWQJCSAg IHJlbGlkID0gdGFibGVfaW5mby0+cmVsaWQ7CisJT2lkCQkgICBzY2hlbWFpZCA9IGdldF9yZWxf bmFtZXNwYWNlKHJlbGlkKTsKKwlIZWFwVHVwbGUgICBwdWJ0dXBsZSA9IE5VTEw7CisJRGF0dW0J ICAgdmFsdWVzW05VTV9QVUJMSUNBVElPTl9UQUJMRVNfRUxFTV0gPSB7MH07CisJYm9vbAkJICAg bnVsbHNbTlVNX1BVQkxJQ0FUSU9OX1RBQkxFU19FTEVNXSA9IHswfTsKKworCXB1YiA9IEdldFB1 YmxpY2F0aW9uKHRhYmxlX2luZm8tPnB1YmlkKTsKKworCXZhbHVlc1swXSA9IE9iamVjdElkR2V0 RGF0dW0ocHViLT5vaWQpOworCXZhbHVlc1sxXSA9IE9iamVjdElkR2V0RGF0dW0ocmVsaWQpOwor CisJdmFsdWVzWzBdID0gT2JqZWN0SWRHZXREYXR1bShwdWItPm9pZCk7CisJdmFsdWVzWzFdID0g T2JqZWN0SWRHZXREYXR1bShyZWxpZCk7CisKKwkvKgorCSAqIFdlIGRvbid0IGNvbnNpZGVyIHJv dyBmaWx0ZXJzIG9yIGNvbHVtbiBsaXN0cyBmb3IgRk9SIEFMTCBUQUJMRVMgb3IKKwkgKiBGT1Ig VEFCTEVTIElOIFNDSEVNQSBwdWJsaWNhdGlvbnMuCisJICovCisJaWYgKCFwdWItPmFsbHRhYmxl cyAmJgorCQkhU2VhcmNoU3lzQ2FjaGVFeGlzdHMyKFBVQkxJQ0FUSU9OTkFNRVNQQUNFTUFQLAor CQkJCQkJCSAgIE9iamVjdElkR2V0RGF0dW0oc2NoZW1haWQpLAorCQkJCQkJCSAgIE9iamVjdElk R2V0RGF0dW0ocHViLT5vaWQpKSkKKwkJcHVidHVwbGUgPSBTZWFyY2hTeXNDYWNoZUNvcHkyKFBV QkxJQ0FUSU9OUkVMTUFQLAorCQkJCQkJCQkJICAgT2JqZWN0SWRHZXREYXR1bShyZWxpZCksCisJ CQkJCQkJCQkgICBPYmplY3RJZEdldERhdHVtKHB1Yi0+b2lkKSk7CisKKwlpZiAoSGVhcFR1cGxl SXNWYWxpZChwdWJ0dXBsZSkpCisJeworCQkvKiBMb29rdXAgdGhlIGNvbHVtbiBsaXN0IGF0dHJp YnV0ZS4gKi8KKwkJdmFsdWVzWzJdID0gU3lzQ2FjaGVHZXRBdHRyKFBVQkxJQ0FUSU9OUkVMTUFQ LCBwdWJ0dXBsZSwKKwkJCQkJCQkJCUFudW1fcGdfcHVibGljYXRpb25fcmVsX3ByYXR0cnMsCisJ CQkJCQkJCQkmKG51bGxzWzJdKSk7CisKKwkJLyogTnVsbCBpbmRpY2F0ZXMgbm8gZmlsdGVyLiAq LworCQl2YWx1ZXNbM10gPSBTeXNDYWNoZUdldEF0dHIoUFVCTElDQVRJT05SRUxNQVAsIHB1YnR1 cGxlLAorCQkJCQkJCQkJQW51bV9wZ19wdWJsaWNhdGlvbl9yZWxfcHJxdWFsLAorCQkJCQkJCQkJ JihudWxsc1szXSkpOworCX0KKwllbHNlCisJeworCQludWxsc1syXSA9IHRydWU7CisJCW51bGxz WzNdID0gdHJ1ZTsKKwl9CisKKwkvKiBTaG93IGFsbCBjb2x1bW5zIHdoZW4gdGhlIGNvbHVtbiBs aXN0IGlzIG5vdCBzcGVjaWZpZWQuICovCisJaWYgKG51bGxzWzJdKQorCXsKKwkJUmVsYXRpb24J ICAgcmVsID0gdGFibGVfb3BlbihyZWxpZCwgQWNjZXNzU2hhcmVMb2NrKTsKKwkJaW50CQkgICBu YXR0bnVtcyA9IDA7CisJCWludDE2CSAgKmF0dG51bXM7CisJCVR1cGxlRGVzYyAgIGRlc2MgPSBS ZWxhdGlvbkdldERlc2NyKHJlbCk7CisJCWludAkJICAgaTsKKworCQlhdHRudW1zID0gcGFsbG9j X2FycmF5KGludDE2LCBkZXNjLT5uYXR0cyk7CisKKwkJZm9yIChpID0gMDsgaSA8IGRlc2MtPm5h dHRzOyBpKyspCisJCXsKKwkJCUZvcm1fcGdfYXR0cmlidXRlIGF0dCA9IFR1cGxlRGVzY0F0dHIo ZGVzYywgaSk7CisKKwkJCWlmIChhdHQtPmF0dGlzZHJvcHBlZCkKKwkJCQljb250aW51ZTsKKwor CQkJaWYgKGF0dC0+YXR0Z2VuZXJhdGVkKQorCQkJeworCQkJCS8qIFdlIG9ubHkgc3VwcG9ydCBy ZXBsaWNhdGlvbiBvZiBTVE9SRUQgZ2VuZXJhdGVkIGNvbHMuICovCisJCQkJaWYgKGF0dC0+YXR0 Z2VuZXJhdGVkICE9IEFUVFJJQlVURV9HRU5FUkFURURfU1RPUkVEKQorCQkJCQljb250aW51ZTsK KworCQkJCS8qCisJCQkJICogVXNlciBoYXNuJ3QgcmVxdWVzdGVkIHRvIHJlcGxpY2F0ZSBTVE9S RUQgZ2VuZXJhdGVkCisJCQkJICogY29scy4KKwkJCQkgKi8KKwkJCQlpZiAocHViLT5wdWJnZW5j b2xzX3R5cGUgIT0gUFVCTElTSF9HRU5DT0xTX1NUT1JFRCkKKwkJCQkJY29udGludWU7CisJCQl9 CisKKwkJCWF0dG51bXNbbmF0dG51bXMrK10gPSBhdHQtPmF0dG51bTsKKwkJfQorCisJCWlmIChu YXR0bnVtcyA+IDApCisJCXsKKwkJCXZhbHVlc1syXSA9IFBvaW50ZXJHZXREYXR1bShidWlsZGlu dDJ2ZWN0b3IoYXR0bnVtcywgbmF0dG51bXMpKTsKKwkJCW51bGxzWzJdID0gZmFsc2U7CisJCX0K KworCQl0YWJsZV9jbG9zZShyZWwsIEFjY2Vzc1NoYXJlTG9jayk7CisJfQorCisJcmV0dXJuIGhl YXBfZm9ybV90dXBsZSh0dXBsZV9kZXNjLCB2YWx1ZXMsIG51bGxzKTsKK30KKwogLyoKICAqIEdl dCBpbmZvcm1hdGlvbiBvZiB0aGUgdGFibGVzIGluIHRoZSBnaXZlbiBwdWJsaWNhdGlvbiBhcnJh eS4KICAqCkBAIC0xMTI0LDcgKzEyMjksNiBAQCBHZXRQdWJsaWNhdGlvbkJ5TmFtZShjb25zdCBj aGFyICpwdWJuYW1lLCBib29sIG1pc3Npbmdfb2spCiBEYXR1bQogcGdfZ2V0X3B1YmxpY2F0aW9u X3RhYmxlcyhQR19GVU5DVElPTl9BUkdTKQogewotI2RlZmluZSBOVU1fUFVCTElDQVRJT05fVEFC TEVTX0VMRU0JNAogCUZ1bmNDYWxsQ29udGV4dCAqZnVuY2N0eDsKIAlMaXN0CSAgICp0YWJsZV9p bmZvcyA9IE5JTDsKIApAQCAtMTM0Miw2ICsxNDQ2LDEyMiBAQCBwZ19nZXRfcHVibGljYXRpb25f dGFibGVzKFBHX0ZVTkNUSU9OX0FSR1MpCiAJU1JGX1JFVFVSTl9ET05FKGZ1bmNjdHgpOwogfQog CisvKgorICogU2ltaWxhciB0byBwZ19nZXRfcHVibGljYXRpb25fdGFibGVzKCksIGJ1dCByZXRy aWV2ZXMgcHVibGljYXRpb24KKyAqIGluZm9ybWF0aW9uIG9ubHkgZm9yIHRoZSBzcGVjaWZpZWQg dGFibGUuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGZvcgorICogb2J0YWluaW5nIHRoZSBjb2x1 bW4gZmlsdGVyIGxpc3QgYW5kIHJvdyBmaWx0ZXIgZXhwcmVzc2lvbiBmb3IgYSBzcGVjaWZpYwor ICogdGFibGUgd2l0aG91dCBwcm9jZXNzaW5nIGFsbCB0YWJsZXMgaW4gYSBwdWJsaWNhdGlvbi4g SXQgaXMgc2lnbmlmaWNhbnRseQorICogZmFzdGVyIHRoYW4gcGdfZ2V0X3B1YmxpY2F0aW9uX3Rh YmxlcygpIGJlY2F1c2UgaXQgYXZvaWRzIGNvbnN0cnVjdGluZworICogYSBsaXN0IG9mIGFsbCB0 YWJsZSBPSURzLgorICovCitEYXR1bQorcGdfZ2V0X3B1YmxpY2F0aW9uX3RhYmxlX2luZm8oUEdf RlVOQ1RJT05fQVJHUykKK3sKKyAgRnVuY0NhbGxDb250ZXh0ICpmdW5jY3R4OworICBwdWJsaXNo ZWRfcmVsICp0YWJsZV9pbmZvID0gTlVMTDsKKworICBpZiAoU1JGX0lTX0ZJUlNUQ0FMTCgpKQor ICB7CisJICBUdXBsZURlc2MgICB0dXBkZXNjOworCSAgTWVtb3J5Q29udGV4dCBvbGRjb250ZXh0 OworCSAgT2lkICAgICAgICAgcmVsaWQ7CisJICBOYW1lICAgICAgICBwdWJuYW1lOworCSAgUmVs YXRpb24gICAgcmVsOworCSAgUHVibGljYXRpb24gKnB1YjsKKwkgIGJvb2wgICAgICAgIHB1Ymxp c2ggPSBmYWxzZTsKKwkgIHB1Ymxpc2hlZF9yZWwgKnB1YnJlbCA9IE5VTEw7CisKKwkgIC8qIGNy ZWF0ZSBhIGZ1bmN0aW9uIGNvbnRleHQgZm9yIGNyb3NzLWNhbGwgcGVyc2lzdGVuY2UgKi8KKwkg IGZ1bmNjdHggPSBTUkZfRklSU1RDQUxMX0lOSVQoKTsKKworCSAgLyogc3dpdGNoIHRvIG1lbW9y eSBjb250ZXh0IGFwcHJvcHJpYXRlIGZvciBtdWx0aXBsZSBmdW5jdGlvbiBjYWxscyAqLworCSAg b2xkY29udGV4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhmdW5jY3R4LT5tdWx0aV9jYWxsX21l bW9yeV9jdHgpOworCisJICByZWxpZCA9IFBHX0dFVEFSR19PSUQoMCk7CisJICBwdWJuYW1lID0g UEdfR0VUQVJHX05BTUUoMSk7CisKKwkgIHJlbCA9IHRhYmxlX29wZW4ocmVsaWQsIEFjY2Vzc1No YXJlTG9jayk7CisJICBwdWIgPSBHZXRQdWJsaWNhdGlvbkJ5TmFtZShOYW1lU3RyKCpwdWJuYW1l KSwgZmFsc2UpOworCisJICAvKgorCSAgICogVmVyaWZ5IHRoYXQgdGhlIHNwZWNpZmllZCB0YWJs ZSBpcyBwdWJsaXNoZWQgYnkgdGhlIGdpdmVuCisJICAgKiBwdWJsaWNhdGlvbi4KKwkgICAqLwor CSAgaWYgKHB1Yi0+YWxsdGFibGVzKQorCSAgeworCQkgIC8qIEFMTCBUQUxCRVMgcHVibGljYXRp b24gKi8KKwkJICBwdWJsaXNoID0gdHJ1ZTsKKwkgIH0KKwkgIGVsc2UgaWYgKCFwdWItPnB1YnZp YXJvb3QgJiYgcmVsLT5yZF9yZWwtPnJlbGlzcGFydGl0aW9uKQorCSAgeworCQkgIExpc3QgKmFu Y2VzdG9ycyA9IGdldF9wYXJ0aXRpb25fYW5jZXN0b3JzKFJlbGF0aW9uR2V0UmVsaWQocmVsKSk7 CisKKwkJICAvKgorCQkgICAqIENoZWNrIGlmIGl0cyBhbmNlc3RvciBpcyBpbiB0aGUgc3BlY2lm aWVkIHB1YmxpY2F0aW9uCisJCSAgICogYXMgcHVibGljYXRpb25zIHdpdGggcHVibGlzaF92aWFf cGFydGl0aW9uX3Jvb3QgYmVpbmcgZmFsc2UKKwkJICAgKiBjcmVhdGUgcGdfcHVibGljYXRpb25f cmVsIGVudHJpZXMgb25seSBmb3IgdGhlIHRvcCBtb3N0CisJCSAgICogcGFydGl0aW9uZWQgdGFi bGUuCisJCSAgICovCisJCSAgaWYgKE9pZElzVmFsaWQoR2V0VG9wTW9zdEFuY2VzdG9ySW5QdWJs aWNhdGlvbihwdWItPm9pZCwgYW5jZXN0b3JzLAorCQkJCQkJCQkJCQkJCQkgTlVMTCkpKQorCQkJ ICBwdWJsaXNoID0gdHJ1ZTsKKwkgIH0KKwkgIGVsc2UgaWYgKFNlYXJjaFN5c0NhY2hlRXhpc3Rz MihQVUJMSUNBVElPTlJFTE1BUCwKKwkJCQkJCQkJCSBPYmplY3RJZEdldERhdHVtKFJlbGF0aW9u R2V0UmVsaWQocmVsKSksCisJCQkJCQkJCQkgT2JqZWN0SWRHZXREYXR1bShwdWItPm9pZCkpIHx8 CisJCQkgICBTZWFyY2hTeXNDYWNoZUV4aXN0czIoUFVCTElDQVRJT05OQU1FU1BBQ0VNQVAsCisJ CQkJCQkJCQkgT2JqZWN0SWRHZXREYXR1bShSZWxhdGlvbkdldE5hbWVzcGFjZShyZWwpKSwKKwkJ CQkJCQkJCSBPYmplY3RJZEdldERhdHVtKHB1Yi0+b2lkKSkpCisJICB7CisJCSAgLyoKKwkJICAg KiBMb29rcyBmb3IgdGhlIGVudHJ5IGluIHBnX3B1YmxpY2F0aW9uX3JlbCBvcgorCQkgICAqIHBn X3B1YmxpY2F0aW9uX25hbWVzcGFjZQorCQkgICAqLworCQkgIHB1Ymxpc2ggPSB0cnVlOworCSAg fQorCisJICB0YWJsZV9jbG9zZShyZWwsIEFjY2Vzc1NoYXJlTG9jayk7CisKKwkgIC8qIENvbnN0 cnVjdCBhIHR1cGxlIGRlc2NyaXB0b3IgZm9yIHRoZSByZXN1bHQgcm93cy4gKi8KKwkgIHR1cGRl c2MgPSBDcmVhdGVUZW1wbGF0ZVR1cGxlRGVzYyhOVU1fUFVCTElDQVRJT05fVEFCTEVTX0VMRU0p OworCSAgVHVwbGVEZXNjSW5pdEVudHJ5KHR1cGRlc2MsIChBdHRyTnVtYmVyKSAxLCAicHViaWQi LAorCQkJCQkJIE9JRE9JRCwgLTEsIDApOworCSAgVHVwbGVEZXNjSW5pdEVudHJ5KHR1cGRlc2Ms IChBdHRyTnVtYmVyKSAyLCAicmVsaWQiLAorCQkJCQkJIE9JRE9JRCwgLTEsIDApOworCSAgVHVw bGVEZXNjSW5pdEVudHJ5KHR1cGRlc2MsIChBdHRyTnVtYmVyKSAzLCAiYXR0cnMiLAorCQkJCQkJ IElOVDJWRUNUT1JPSUQsIC0xLCAwKTsKKwkgIFR1cGxlRGVzY0luaXRFbnRyeSh0dXBkZXNjLCAo QXR0ck51bWJlcikgNCwgInF1YWwiLAorCQkJCQkJIFBHX05PREVfVFJFRU9JRCwgLTEsIDApOwor CisJICBpZiAocHVibGlzaCkKKwkgIHsKKwkJICBwdWJyZWwgPSBwYWxsb2Nfb2JqZWN0KHB1Ymxp c2hlZF9yZWwpOworCQkgIHB1YnJlbC0+cmVsaWQgPSByZWxpZDsKKwkJICBwdWJyZWwtPnB1Ymlk ID0gcHViLT5vaWQ7CisJICB9CisKKwkgIGZ1bmNjdHgtPnR1cGxlX2Rlc2MgPSBCbGVzc1R1cGxl RGVzYyh0dXBkZXNjKTsKKwkgIGZ1bmNjdHgtPnVzZXJfZmN0eCA9IHB1YnJlbDsKKworCSAgTWVt b3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOworICB9CisKKyAgLyogc3R1ZmYgZG9uZSBv biBldmVyeSBjYWxsIG9mIHRoZSBmdW5jdGlvbiAqLworICBmdW5jY3R4ID0gU1JGX1BFUkNBTExf U0VUVVAoKTsKKyAgdGFibGVfaW5mbyA9IChwdWJsaXNoZWRfcmVsICopIGZ1bmNjdHgtPnVzZXJf ZmN0eDsKKworICBpZiAodGFibGVfaW5mbyAmJiBmdW5jY3R4LT5jYWxsX2NudHIgPT0gMCkKKyAg eworCSAgSGVhcFR1cGxlICAgcmV0dHVwbGU7CisKKwkgIHJldHR1cGxlID0gY29uc3RydWN0X3B1 Ymxpc2hlZF9yZWxfdHVwbGUodGFibGVfaW5mbywgZnVuY2N0eC0+dHVwbGVfZGVzYyk7CisKKwkg IFNSRl9SRVRVUk5fTkVYVChmdW5jY3R4LCBIZWFwVHVwbGVHZXREYXR1bShyZXR0dXBsZSkpOwor ICB9CisKKyAgU1JGX1JFVFVSTl9ET05FKGZ1bmNjdHgpOworfQorCiAvKgogICogUmV0dXJucyBP aWRzIG9mIHNlcXVlbmNlcyBpbiBhIHB1YmxpY2F0aW9uLgogICovCmRpZmYgLS1naXQgYS9zcmMv YmFja2VuZC9yZXBsaWNhdGlvbi9sb2dpY2FsL3RhYmxlc3luYy5jIGIvc3JjL2JhY2tlbmQvcmVw bGljYXRpb24vbG9naWNhbC90YWJsZXN5bmMuYwppbmRleCAyZjJmMDEyMWVjZi4uNTMzMWViMDM0 YjAgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL2xvZ2ljYWwvdGFibGVzeW5j LmMKKysrIGIvc3JjL2JhY2tlbmQvcmVwbGljYXRpb24vbG9naWNhbC90YWJsZXN5bmMuYwpAQCAt ODAxLDkgKzgwMSw5IEBAIGZldGNoX3JlbW90ZV90YWJsZV9pbmZvKGNoYXIgKm5zcG5hbWUsIGNo YXIgKnJlbG5hbWUsIExvZ2ljYWxSZXBSZWxhdGlvbiAqbHJlbCwKIAkJCQkJCSAiICAoQ0FTRSBX SEVOIChhcnJheV9sZW5ndGgoZ3B0LmF0dHJzLCAxKSA9IGMucmVsbmF0dHMpIgogCQkJCQkJICIg ICBUSEVOIE5VTEwgRUxTRSBncHQuYXR0cnMgRU5EKSIKIAkJCQkJCSAiICBGUk9NIHBnX3B1Ymxp Y2F0aW9uIHAsIgotCQkJCQkJICIgIExBVEVSQUwgcGdfZ2V0X3B1YmxpY2F0aW9uX3RhYmxlcyhw LnB1Ym5hbWUpIGdwdCwiCisJCQkJCQkgIiAgTEFURVJBTCBwZ19nZXRfcHVibGljYXRpb25fdGFi bGVfaW5mbygldSwgcC5wdWJuYW1lKSBncHQsIgogCQkJCQkJICIgIHBnX2NsYXNzIGMiCi0JCQkJ CQkgIiBXSEVSRSBncHQucmVsaWQgPSAldSBBTkQgYy5vaWQgPSBncHQucmVsaWQiCisJCQkJCQkg IiBXSEVSRSBjLm9pZCA9IGdwdC5yZWxpZCIKIAkJCQkJCSAiICAgQU5EIHAucHVibmFtZSBJTiAo ICVzICkiLAogCQkJCQkJIGxyZWwtPnJlbW90ZWlkLAogCQkJCQkJIHB1Yl9uYW1lcy0+ZGF0YSk7 CkBAIC05ODMsOSArOTgzLDggQEAgZmV0Y2hfcmVtb3RlX3RhYmxlX2luZm8oY2hhciAqbnNwbmFt ZSwgY2hhciAqcmVsbmFtZSwgTG9naWNhbFJlcFJlbGF0aW9uICpscmVsLAogCQlhcHBlbmRTdHJp bmdJbmZvKCZjbWQsCiAJCQkJCQkgIlNFTEVDVCBESVNUSU5DVCBwZ19nZXRfZXhwcihncHQucXVh bCwgZ3B0LnJlbGlkKSIKIAkJCQkJCSAiICBGUk9NIHBnX3B1YmxpY2F0aW9uIHAsIgotCQkJCQkJ ICIgIExBVEVSQUwgcGdfZ2V0X3B1YmxpY2F0aW9uX3RhYmxlcyhwLnB1Ym5hbWUpIGdwdCIKLQkJ CQkJCSAiIFdIRVJFIGdwdC5yZWxpZCA9ICV1IgotCQkJCQkJICIgICBBTkQgcC5wdWJuYW1lIElO ICggJXMgKSIsCisJCQkJCQkgIiAgTEFURVJBTCBwZ19nZXRfcHVibGljYXRpb25fdGFibGVfaW5m bygldSwgcC5wdWJuYW1lKSBncHQiCisJCQkJCQkgIiBXSEVSRSBwLnB1Ym5hbWUgSU4gKCAlcyAp IiwKIAkJCQkJCSBscmVsLT5yZW1vdGVpZCwKIAkJCQkJCSBwdWJfbmFtZXMtPmRhdGEpOwogCmRp ZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0IGIvc3JjL2luY2x1ZGUv Y2F0YWxvZy9wZ19wcm9jLmRhdAppbmRleCBkYWM0MDk5MmNiYy4uM2NkNjAwNGQ3ZGMgMTAwNjQ0 Ci0tLSBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKKysrIGIvc3JjL2luY2x1ZGUv Y2F0YWxvZy9wZ19wcm9jLmRhdApAQCAtMTIzODgsNiArMTIzODgsMTUgQEAKICAgcHJvYXJnbW9k ZXMgPT4gJ3t2LG8sbyxvLG99JywKICAgcHJvYXJnbmFtZXMgPT4gJ3twdWJuYW1lLHB1YmlkLHJl bGlkLGF0dHJzLHF1YWx9JywKICAgcHJvc3JjID0+ICdwZ19nZXRfcHVibGljYXRpb25fdGFibGVz JyB9LAoreyBvaWQgPT4gJzk3NjEnLAorICBkZXNjciA9PiAnZ2V0IGluZm9ybWF0aW9uIG9mIHRo ZSB0YWJsZSB0aGF0IGlzIHBhcnQgb2YgdGhlIHNwZWNpZmllZCBwdWJsaWNhdGlvbicsCisgIHBy b25hbWUgPT4gJ3BnX2dldF9wdWJsaWNhdGlvbl90YWJsZV9pbmZvJywgcHJvcm93cyA9PiAnMScs CisgIHByb3JldHNldCA9PiAndCcsIHByb3ZvbGF0aWxlID0+ICdzJywKKyAgcHJvcmV0dHlwZSA9 PiAncmVjb3JkJywgcHJvYXJndHlwZXMgPT4gJ29pZCBuYW1lJywKKyAgcHJvYWxsYXJndHlwZXMg PT4gJ3tvaWQsbmFtZSxvaWQsb2lkLGludDJ2ZWN0b3IscGdfbm9kZV90cmVlfScsCisgIHByb2Fy Z21vZGVzID0+ICd7aSxpLG8sbyxvLG99JywKKyAgcHJvYXJnbmFtZXMgPT4gJ3tyZWxpZCxwdWJu YW1lLHB1YmlkLHJlbGlkLGF0dHJzLHF1YWx9JywKKyAgcHJvc3JjID0+ICdwZ19nZXRfcHVibGlj YXRpb25fdGFibGVfaW5mbycgfSwKIHsgb2lkID0+ICc4MDUyJywgZGVzY3IgPT4gJ2dldCBPSURz IG9mIHNlcXVlbmNlcyBpbiBhIHB1YmxpY2F0aW9uJywKICAgcHJvbmFtZSA9PiAncGdfZ2V0X3B1 YmxpY2F0aW9uX3NlcXVlbmNlcycsIHByb3Jvd3MgPT4gJzEwMDAnLCBwcm9yZXRzZXQgPT4gJ3Qn LAogICBwcm92b2xhdGlsZSA9PiAncycsIHByb3JldHR5cGUgPT4gJ29pZCcsIHByb2FyZ3R5cGVz ID0+ICd0ZXh0JywKLS0gCjIuNTMuMAoK --000000000000c29589064baaa9dd--