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 1wbadZ-002glg-0h for pgsql-hackers@arkaria.postgresql.org; Mon, 22 Jun 2026 09:08:13 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wbadX-005iun-1v for pgsql-hackers@arkaria.postgresql.org; Mon, 22 Jun 2026 09:08:11 +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.96) (envelope-from ) id 1wbadX-005iuf-06 for pgsql-hackers@lists.postgresql.org; Mon, 22 Jun 2026 09:08:11 +0000 Received: from mail-pg1-x52a.google.com ([2607:f8b0:4864:20::52a]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wbadU-00000001Z5p-3pai for pgsql-hackers@lists.postgresql.org; Mon, 22 Jun 2026 09:08:10 +0000 Received: by mail-pg1-x52a.google.com with SMTP id 41be03b00d2f7-c86214eead7so1592063a12.0 for ; Mon, 22 Jun 2026 02:08:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1782119287; cv=none; d=google.com; s=arc-20240605; b=bRYR7hcbdw8exVw1mrBtdZgOkdQ+z59PQpdWXD2D4RT468ijuKn4k+2LCqbMjSG33W JAlPXwcs+nzDyq3LHxN+dY9GQ3uz5a/y4YEhxnyo8OFBwHUnPWTSiOwUmvBsG63UvTRE LF8ntAduWnDh4deADSVLGytizLLix3jwNaTWMv5VB9HMVnBp+AZhg258unwOjyJ6m+9L +xFQhTb7AMSNejhE+RqzVyinytLcD1lh51w+7lqB3AUQk6ySEJQhVsQzD95EBIBF3D78 azSJRZpe/DZ1uwhO+j0vjToly9buOB2+r7hHDK9YDAt/TR60WickFznO4pLkUQFTpKZ6 8X5g== 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=69g4mRPZrgZz+kYRD/PBh1VaO68LQapHHjhL/ZpXP3s=; fh=x53TEpNDgir+K0FRrn8DAkBk4SaOW1zhB0i5qTww8vc=; b=BFEMbCbOALgjXI/0pGoVjEfA2M5nQ/W7pmuasLL5jWnhN+tZOko7G+Ad+1kdDa00Rz LCvK1UGASZcnyD2VXaY3NFAEjlkO86IxN78TPl5QaNIwO550xsBw1PB/sQXGMHPMcW8X 7kY83WgAJIOlwZ/+ZMJqmldAjdOHdrJrAgBuUmwhezIP2ujHBShDQpjtWA37A9PIuUwO YViIv7FO12PKX17SakqiQR8uy0BW7ZIIknjy2kxuiZnkZ8uJvuOGgUwy0roxZoVk9fzk 38dTR3tPQoLOQ3wm0oPexqfO8W0Hf7uXSOOwU3BOiDfatSiCmcoWXzhYm9JbxEGItIyu SS9A==; 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=20251104; t=1782119287; x=1782724087; 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=69g4mRPZrgZz+kYRD/PBh1VaO68LQapHHjhL/ZpXP3s=; b=gpnPSwGs0ATnueg8w76Wtsg77cwR5EDndv4I6xOQVMsGvAq1oCqFC5XAcNnxpoOqyF rkuHsqotnq1/IPsmExyQdV3w9yx7Bm9mohbZBjoxBVq17Xtv/GRpo4qbUXooN+5g0mZh 0ZVVwqCBpYQaVeJT+AFr1vRIKYcW3pcIGwhM23knQwemFJ9qbuf0RRB+tE5u7lDV73Ra /U2RZLVu4UgtavyHyJgn19v/SEjT3UyHlPC6dymAZfGb++uMPS5Gb/LrNR/KC2J19iyX 6UYrzCkxc4QkeEVexB63suLuFV5pb6FjpVpLDldagneb8emX0lBrmHelQJzDQRT4rHoB YBpw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782119287; x=1782724087; 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=69g4mRPZrgZz+kYRD/PBh1VaO68LQapHHjhL/ZpXP3s=; b=cHNHgoOMfuaV05WCx5L5BAQbtu1jDLoxy0LWYL6LLlcxImcW8Lo19GdUZQZpEIrgtX tqvzpnp9ENPR7MdJPXQJnQc05zeHdAJZ+xkY9BVEOF51pG/3oSAy9iFfgjArOA0m9W7S rZNIaiqQEYHBGuMWmQ+tPjTAk8Vg77gg34Pk1vZJcagsg+IC/NUgKgL8tH822Pcw8xuB KohiGI6io+0uW4SkNPNy824mWxry/ZdPxN4V50Dkp0Phvi7X0aZGzyi4Im11H3ekBnw1 h/y2t0owDizYO3ZtZy9YXC4E6RkjB1WTHeiKKyPkme2+58WWwkSh4uxUBqZONWp1Z/a/ isXg== X-Forwarded-Encrypted: i=1; AFNElJ9gZMVkAQoQmcFjRDeCr/ZRUBlsFd7B6MvaiMGa91j5Yfj4iMQahyS/7QJpyZSQxg2fVMe471zkPxbrlft3@lists.postgresql.org X-Gm-Message-State: AOJu0YwePrHeCrOgbNEeY/2llMssRJaQMjG8mCTTeDmvx/09jB6+0ILX thxroTcwN5OQsnXqMKvxwHlP/YVkgd7gmVoumGXOROaGL3y8YkK3vv58O6XDIZwLYNFeqMH0K4b HmzUkWwqteOgWgC9UKtH50vBAEZw7YtM= X-Gm-Gg: AfdE7cmUqTyyjRJQBdr7a7fay5+8boUU82Cnt0u7sq2M2TJn1EudTdftO7F0at/vf0D YC526RKXS1teKCXyUILkFuOX94LVWM2NxVm8j4nvBxA1LqJoUKMHRi60CzZ+ggpKxSPuy0+t1TF /fIbbdCPG8mLu9MTvOxGQ1nBXWmEiMUaFYkjl+FnOJO6HNBoS0yax07rWe/cGSJnSONarukf3m3 JO+CI1aNvaKoKjMu5VFqQkg4CMeduufjHzwbLGzbA+mUszfdtLSJNX3r/f/KUbkOpZF3P1MfR8L 7TGspjOfNkfhrYlsGtAZ/wXZcGs+KO6dkC9tu+IMNMlBFIRdVf9Fy6qKhMjYTM1nPQpPSP7dpw= = X-Received: by 2002:a05:6a21:398b:b0:39b:bc11:9ec5 with SMTP id adf61e73a8af0-3bb33c518c4mr10690396637.13.1782119286717; Mon, 22 Jun 2026 02:08:06 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Amit Kapila Date: Mon, 22 Jun 2026 14:37:53 +0530 X-Gm-Features: AVVi8Cc3J_sNKyRTvhzsR1X7lCf-MlVTq0HBNn-S9ncvidhONolwM1fIr7vnXAo Message-ID: Subject: Re: Proposal: Conflict log history table for Logical Replication To: shveta malik Cc: vignesh C , Dilip Kumar , Shlok Kyal , Peter Smith , Nisha Moond , Masahiko Sawada , Bharath Rupireddy , PostgreSQL Hackers Content-Type: multipart/mixed; boundary="000000000000085c570654d3fbe8" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000085c570654d3fbe8 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Mon, Jun 22, 2026 at 1:56=E2=80=AFPM shveta malik wrote: > > On Mon, Jun 22, 2026 at 9:33=E2=80=AFAM vignesh C w= rote: > > > > On Mon, 22 Jun 2026 at 08:41, Amit Kapila wro= te: > > > > > > On Sun, Jun 21, 2026 at 7:53=E2=80=AFPM vignesh C wrote: > > > > > > > > While attempting to log a conflict, a concurrent ALTER SUBSCRIPTION > > > > can change the conflict logging destination from all to log. In thi= s > > > > scenario, the apply worker may already have cached the conflictlogd= est > > > > information, including the OID of the current conflict log table. > > > > However, the concurrent ALTER SUBSCRIPTION drops the conflict log > > > > table as part of the destination change: > > > > +Relation > > > > +GetConflictLogDestAndTable(ConflictLogDest *log_dest) > > > > +{ > > > > + Oid conflictlogrelid; > > > > + > > > > + /* > > > > + * Convert the text log destination to the internal enum. > > > > MySubscription > > > > + * already contains the data from pg_subscription. > > > > + */ > > > > + *log_dest =3D GetConflictLogDest(MySubscription->conflictlo= gdest); > > > > + > > > > + /* Quick exit if a conflict log table was not requested. */ > > > > + if (!CONFLICTS_LOGGED_TO_TABLE(*log_dest)) > > > > + return NULL; > > > > + > > > > + conflictlogrelid =3D MySubscription->conflictlogrelid; > > > > + > > > > + Assert(OidIsValid(conflictlogrelid)); > > > > + > > > > + return table_open(conflictlogrelid, RowExclusiveLock); > > > > +} > > > > > > > > As a result, when the apply worker later attempts to open the cache= d > > > > conflict log table, table_open() fails because the relation has > > > > already been dropped. This causes the error handling path itself to > > > > fail before the conflict record can be written to either the confli= ct > > > > log table or the server log. > > > > > > > > In such cases, the conflict record is effectively lost and is not > > > > logged anywhere. For example: > > > > 2026-06-21 19:31:13.592 IST [263598] LOG: logical replication appl= y > > > > worker for subscription "sub1" has started > > > > 2026-06-21 19:32:26.731 IST [263598] ERROR: could not open relatio= n > > > > with OID 16405 > > > > 2026-06-21 19:32:26.731 IST [263598] CONTEXT: processing remote da= ta > > > > for replication origin "pg_16404" during message type "INSERT" for > > > > replication target relation "public.t1" in transaction 698, finishe= d > > > > at 0/017D39A0 > > > > 2026-06-21 19:32:26.735 IST [263471] LOG: background worker "logic= al > > > > replication apply worker" (PID 263598) exited with exit code 1 > > > > > > > > Ideally, failure to access the conflict log table should not preven= t > > > > the conflict from being reported in the server log. This issue is > > > > present with the v52 version. I have not yet checked if Amit's rece= nt > > > > patch posted a few minutes ago at [1] handles this issue. > > > > > > > > > > There are two places in the patch from where we LOG/Insert the > > > conflict data. First is ReportApplyConflict() where we LOG if the > > > conflict arises from a non-ERROR path (aka conflicts other > > > INSERT/UPDATE_EXISTS). In that case, the conflict data will be logge= d > > > even when we fail to insert into CLT. Second is the place for > > > conflicts that arose as ERRORs (aka INSERT/UPDATE_EXISTS), where the > > > conflict information will be logged along with insert failure as > > > CONTEXT. Can you please verify your test based on this input and shar= e > > > your findings and thoughts? > > > > The scenario I am testing is an insert_exists conflict. > > On the publisher: > > CREATE TABLE t1 (c1 int); > > > > On the subscriber: > > CREATE TABLE t1 (c1 int PRIMARY KEY); > > > > Then execute the following on the publisher: > > INSERT INTO t1 VALUES (10); > > INSERT INTO t1 VALUES (10); > > > > The second insert generates an insert_exists conflict on the > > subscriber. The conflict is reported and logged through the following > > call chain: > > apply_handle_insert > > -> apply_handle_insert_internal > > -> ExecSimpleRelationInsert > > -> CheckAndReportConflict > > -> ReportApplyConflict > > > > Pause execution in ReportApplyConflict() at > > GetConflictLogDestAndTable(), immediately before opening the conflict > > log table: > > ... > > return table_open(conflictlogrelid, RowExclusiveLock); > > ... > > > > While the apply worker is paused, execute the following command concurr= ently: > > ALTER SUBSCRIPTION sub1 > > SET (conflict_log_destination =3D 'log'); > > > > This succeeds and drops the conflict log table: > > NOTICE: dropped conflict log table "pg_conflict.pg_conflict_log_16404" > > for subscription "sub1" > > ALTER SUBSCRIPTION > > > > At this point, GetConflictLogDestAndTable() has already determined > > that the conflict should be logged to a table and has cached the > > corresponding relation OID. However, the concurrent ALTER SUBSCRIPTION > > has removed that table. > > > > When execution resumes, the subsequent table_open() call fails with: > > 2026-06-22 09:24:53.072 IST [304864] ERROR: could not open relation > > with OID 16405 > > > > As a result, conflict processing itself fails before the conflict > > details can be recorded. The conflict is therefore not logged to the > > conflict log table and is also not emitted to the server log. > > > > > I understand this case, but I feel it isn't critical because the table > is going to be dropped in parallel, so ultimately, all data is lost. > At-max, we can provide a LOG when table-open fails, indicating that > the CLT table is dropped concurrently and thus conflict-data cannott > be logged to table. > Instead of adding additional LOG, a simpler fix would be to use try_table_open() and if the table is dropped, silently just LOG the conflict and proceed (see attached top-up patch). In general, I agree that it is not a very critical issue but as the fix is simpler, I thought it is better to address so that apply worker can continue instead of erroring out. Having said that, I think we can't handle each and every corner case where there are some other errors before we can LOG the conflict, say some OOM or some other error happens during CheckAndReportConflict. --=20 With Regards, Amit Kapila. --000000000000085c570654d3fbe8 Content-Type: text/plain; charset="US-ASCII"; name="v52-3-0001-Don-t-lose-a-conflict-when-the-conflict-log-table.txt" Content-Disposition: attachment; filename="v52-3-0001-Don-t-lose-a-conflict-when-the-conflict-log-table.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mqozr27d0 RnJvbSBlNTk1NGViMWVmMzZhOThiN2RjYzMxNjk3ZGQyNDI3MDcwODkyZGUzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbWl0IEthcGlsYSA8YWthcGlsYUBwb3N0Z3Jlc3FsLm9yZz4K RGF0ZTogTW9uLCAyMiBKdW4gMjAyNiAxMjoxODoxNyArMDUzMApTdWJqZWN0OiBbUEFUQ0ggdjNd IERvbid0IGxvc2UgYSBjb25mbGljdCB3aGVuIHRoZSBjb25mbGljdCBsb2cgdGFibGUgaXMKIGRy b3BwZWQgbWlkLWxvZ2dpbmcKCkEgY29uY3VycmVudCBBTFRFUiBTVUJTQ1JJUFRJT04gY2hhbmdp bmcgY29uZmxpY3RfbG9nX2Rlc3RpbmF0aW9uIGNhbiBkcm9wIHRoZQpjb25mbGljdCBsb2cgdGFi bGUgd2hpbGUgYSBjb25mbGljdCBpcyBiZWluZyBsb2dnZWQsIG1ha2luZyB0YWJsZV9vcGVuKCkg ZmFpbAphbmQgdGhlIGNvbmZsaWN0IGxvc3QgZnJvbSBib3RoIHRoZSB0YWJsZSBhbmQgdGhlIHNl cnZlciBsb2cuICBPcGVuIGl0IHdpdGgKdHJ5X3RhYmxlX29wZW4oKSBpbnN0ZWFkIGFuZCwgb24g TlVMTCwgZmFsbCBiYWNrIHRvIGZ1bGwgc2VydmVyLWxvZyByZXBvcnRpbmcuCi0tLQogc3JjL2Jh Y2tlbmQvcmVwbGljYXRpb24vbG9naWNhbC9jb25mbGljdC5jIHwgMTA4ICsrKysrKysrKysrKysr Ky0tLS0tLQogc3JjL2luY2x1ZGUvcmVwbGljYXRpb24vY29uZmxpY3QuaCAgICAgICAgIHwgICAz ICstCiAyIGZpbGVzIGNoYW5nZWQsIDgyIGluc2VydGlvbnMoKyksIDI5IGRlbGV0aW9ucygtKQoK ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL2xvZ2ljYWwvY29uZmxpY3QuYyBi L3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL2xvZ2ljYWwvY29uZmxpY3QuYwppbmRleCBjMmMxNWYw NTVlNi4uOTgzY2RmOTRjZjAgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL2xv Z2ljYWwvY29uZmxpY3QuYworKysgYi9zcmMvYmFja2VuZC9yZXBsaWNhdGlvbi9sb2dpY2FsL2Nv bmZsaWN0LmMKQEAgLTMxOSw3ICszMTksNiBAQCBSZXBvcnRBcHBseUNvbmZsaWN0KEVTdGF0ZSAq ZXN0YXRlLCBSZXN1bHRSZWxJbmZvICpyZWxpbmZvLCBpbnQgZWxldmVsLAogCQkJCQlUdXBsZVRh YmxlU2xvdCAqcmVtb3Rlc2xvdCwgTGlzdCAqY29uZmxpY3R0dXBsZXMpCiB7CiAJUmVsYXRpb24J CWxvY2FscmVsID0gcmVsaW5mby0+cmlfUmVsYXRpb25EZXNjOwotCUNvbmZsaWN0TG9nRGVzdAlk ZXN0OwogCVJlbGF0aW9uCQljb25mbGljdGxvZ3JlbDsKIAlib29sCQkJbG9nX2Rlc3RfdGFibGU7 CiAJYm9vbCAJCQlsb2dfZGVzdF9sb2dmaWxlOwpAQCAtMzI3LDEzICszMjYsMTQgQEAgUmVwb3J0 QXBwbHlDb25mbGljdChFU3RhdGUgKmVzdGF0ZSwgUmVzdWx0UmVsSW5mbyAqcmVsaW5mbywgaW50 IGVsZXZlbCwKIAlwZ3N0YXRfcmVwb3J0X3N1YnNjcmlwdGlvbl9jb25mbGljdChNeVN1YnNjcmlw dGlvbi0+b2lkLCB0eXBlKTsKIAogCS8qCi0JICogR2V0IHRoZSBjb25mbGljdCBsb2cgZGVzdGlu YXRpb24uIEFsc28sIChpZiB0aGVyZSBpcyBvbmUpIHJldHVybiB0aGUKLQkgKiBDTFQgcmVsYXRp b24gYWxyZWFkeSBvcGVuZWQgYW5kIHJlYWR5IGZvciBpbnNlcnRpb24uCisJICogR2V0IHRoZSBj b25mbGljdCBsb2cgZGVzdGluYXRpb25zLiAgQWxzbywgaWYgYSB0YWJsZSBpcyBvbmUgb2YgdGhl CisJICogZGVzdGluYXRpb25zLCByZXR1cm4gdGhlIENMVCByZWxhdGlvbiBhbHJlYWR5IG9wZW5l ZCBhbmQgcmVhZHkgZm9yCisJICogaW5zZXJ0aW9uLiAgSWYgdGhlIHRhYmxlIHdhcyByZXF1ZXN0 ZWQgYnV0IGhhcyBiZWVuIGRyb3BwZWQgY29uY3VycmVudGx5LAorCSAqIEdldENvbmZsaWN0TG9n RGVzdEFuZFRhYmxlKCkgcmV0dXJucyBOVUxMIGFuZCByZXBvcnRzIHNlcnZlci1sb2cgYXMgdGhl CisJICogZGVzdGluYXRpb24gaW5zdGVhZCwgc28gdGhlIGNvbmZsaWN0IGlzIHN0aWxsIHJlY29y ZGVkLgogCSAqLwotCWNvbmZsaWN0bG9ncmVsID0gR2V0Q29uZmxpY3RMb2dEZXN0QW5kVGFibGUo JmRlc3QpOwotCi0JbG9nX2Rlc3RfdGFibGUgPSBDT05GTElDVFNfTE9HR0VEX1RPX1RBQkxFKGRl c3QpOwotCWxvZ19kZXN0X2xvZ2ZpbGUgPSBDT05GTElDVFNfTE9HR0VEX1RPX0xPRyhkZXN0KTsK Kwljb25mbGljdGxvZ3JlbCA9IEdldENvbmZsaWN0TG9nRGVzdEFuZFRhYmxlKCZsb2dfZGVzdF90 YWJsZSwKKwkJCQkJCQkJCQkJCSZsb2dfZGVzdF9sb2dmaWxlKTsKIAogCS8qCiAJICogUHJlcGFy ZSB0aGUgY29uZmxpY3QgbG9nIHR1cGxlIGZpcnN0IHdoZW4gdGhlIGRlc3RpbmF0aW9uIGluY2x1 ZGVzIHRoZQpAQCAtNDY2LDcgKzQ2Niw2IEBAIHZvaWQKIFByb2Nlc3NQZW5kaW5nQ29uZmxpY3RM b2dUdXBsZSh2b2lkKQogewogCVJlbGF0aW9uCWNvbmZsaWN0bG9ncmVsOwotCUNvbmZsaWN0TG9n RGVzdCBkZXN0OwogCiAJLyogTm90aGluZyB0byBkbyAqLwogCWlmIChNeUxvZ2ljYWxSZXBXb3Jr ZXItPmNvbmZsaWN0X2xvZ190dXBsZSA9PSBOVUxMKQpAQCAtNDc0LDIzICs0NzMsNDAgQEAgUHJv Y2Vzc1BlbmRpbmdDb25mbGljdExvZ1R1cGxlKHZvaWQpCiAKIAkvKgogCSAqIEluc2VydCB0aGUg ZGVmZXJyZWQgY29uZmxpY3QgbG9nIHR1cGxlIGluIGl0cyBvd24gdHJhbnNhY3Rpb24uICBBCi0J ICogZmFpbHVyZSBoZXJlIChlLmcuIHRoZSBjb25mbGljdCBsb2cgdGFibGUgd2FzIGRyb3BwZWQs IG9yIGFuCi0JICogb3V0LW9mLWRpc2stc3BhY2UgZXJyb3IpIGlzIHRyZWF0ZWQgbGlrZSBhbnkg b3RoZXIgYXBwbHkgZXJyb3IgYW5kCi0JICogcmFpc2VzIGFuIEVSUk9SOyBzdWNoIGZhaWx1cmVz IGFyZSBleHBlY3RlZCB0byBiZSByYXJlIGFuZCBwZXJzaXN0ZW50LgotCSAqIENhbGxlcnMgbXVz dCB0aGVyZWZvcmUgaGF2ZSBhbHJlYWR5IHJlcG9ydGVkIChhbmQgY2xlYXJlZCkgYW55Ci0JICog aW4tcHJvZ3Jlc3MgYXBwbHkgZXJyb3IgYmVmb3JlIGNhbGxpbmcgdGhpcywgc28gdGhhdCB0aGlz IGVycm9yIGRvZXMgbm90Ci0JICogbWFzayB0aGUgb3JpZ2luYWwgb25lLgorCSAqIGZhaWx1cmUg aGVyZSAoZS5nLiBhbiBvdXQtb2YtZGlzay1zcGFjZSBlcnJvcikgaXMgdHJlYXRlZCBsaWtlIGFu eSBvdGhlcgorCSAqIGFwcGx5IGVycm9yIGFuZCByYWlzZXMgYW4gRVJST1I7IHN1Y2ggZmFpbHVy ZXMgYXJlIGV4cGVjdGVkIHRvIGJlIHJhcmUKKwkgKiBhbmQgcGVyc2lzdGVudC4gIENhbGxlcnMg bXVzdCB0aGVyZWZvcmUgaGF2ZSBhbHJlYWR5IHJlcG9ydGVkIChhbmQKKwkgKiBjbGVhcmVkKSBh bnkgaW4tcHJvZ3Jlc3MgYXBwbHkgZXJyb3IgYmVmb3JlIGNhbGxpbmcgdGhpcywgc28gdGhhdCB0 aGlzCisJICogZXJyb3IgZG9lcyBub3QgbWFzayB0aGUgb3JpZ2luYWwgb25lLgogCSAqLwogCVN0 YXJ0VHJhbnNhY3Rpb25Db21tYW5kKCk7CiAJUHVzaEFjdGl2ZVNuYXBzaG90KEdldFRyYW5zYWN0 aW9uU25hcHNob3QoKSk7CiAKLQkvKiBPcGVuIGNvbmZsaWN0IGxvZyB0YWJsZSBhbmQgaW5zZXJ0 IHRoZSB0dXBsZSAqLwotCWNvbmZsaWN0bG9ncmVsID0gR2V0Q29uZmxpY3RMb2dEZXN0QW5kVGFi bGUoJmRlc3QpOwotCUFzc2VydChjb25mbGljdGxvZ3JlbCk7CisJLyogT3BlbiB0aGUgY29uZmxp Y3QgbG9nIHRhYmxlIGFuZCBpbnNlcnQgdGhlIHR1cGxlLiAqLworCWNvbmZsaWN0bG9ncmVsID0g R2V0Q29uZmxpY3RMb2dEZXN0QW5kVGFibGUoTlVMTCwgTlVMTCk7CiAKLQlJbnNlcnRDb25mbGlj dExvZ1R1cGxlKGNvbmZsaWN0bG9ncmVsKTsKLQotCXRhYmxlX2Nsb3NlKGNvbmZsaWN0bG9ncmVs LCBSb3dFeGNsdXNpdmVMb2NrKTsKKwlpZiAoY29uZmxpY3Rsb2dyZWwgIT0gTlVMTCkKKwl7CisJ CUluc2VydENvbmZsaWN0TG9nVHVwbGUoY29uZmxpY3Rsb2dyZWwpOworCQl0YWJsZV9jbG9zZShj b25mbGljdGxvZ3JlbCwgUm93RXhjbHVzaXZlTG9jayk7CisJfQorCWVsc2UKKwl7CisJCS8qCisJ CSAqIFRoZSBjb25mbGljdCBsb2cgdGFibGUgd2FzIGRyb3BwZWQgY29uY3VycmVudGx5IChlLmcu IGJ5IGFuIEFMVEVSCisJCSAqIFNVQlNDUklQVElPTiB0aGF0IGNoYW5nZWQgY29uZmxpY3RfbG9n X2Rlc3RpbmF0aW9uKSBhZnRlciB0aGUKKwkJICogY29uZmxpY3Qgd2FzIGFscmVhZHkgcmVwb3J0 ZWQgdG8gdGhlIHNlcnZlciBsb2cgYnkKKwkJICogUmVwb3J0QXBwbHlDb25mbGljdCgpLiAgTm90 aGluZyBtb3JlIHRvIGRvOyBqdXN0IGRpc2NhcmQgdGhlIHByZXBhcmVkCisJCSAqIHR1cGxlIGFu ZCBpdHMgY29udGV4dCBzdHJpbmcuCisJCSAqLworCQloZWFwX2ZyZWV0dXBsZShNeUxvZ2ljYWxS ZXBXb3JrZXItPmNvbmZsaWN0X2xvZ190dXBsZSk7CisJCU15TG9naWNhbFJlcFdvcmtlci0+Y29u ZmxpY3RfbG9nX3R1cGxlID0gTlVMTDsKKwkJaWYgKE15TG9naWNhbFJlcFdvcmtlci0+Y29uZmxp Y3RfbG9nX2VycmNvbnRleHQpCisJCXsKKwkJCXBmcmVlKE15TG9naWNhbFJlcFdvcmtlci0+Y29u ZmxpY3RfbG9nX2VycmNvbnRleHQpOworCQkJTXlMb2dpY2FsUmVwV29ya2VyLT5jb25mbGljdF9s b2dfZXJyY29udGV4dCA9IE5VTEw7CisJCX0KKwl9CiAKIAlQb3BBY3RpdmVTbmFwc2hvdCgpOwog CUNvbW1pdFRyYW5zYWN0aW9uQ29tbWFuZCgpOwpAQCAtNTMxLDI5ICs1NDcsNjUgQEAgSW5pdENv bmZsaWN0SW5kZXhlcyhSZXN1bHRSZWxJbmZvICpyZWxJbmZvKQogICogR2V0Q29uZmxpY3RMb2dE ZXN0QW5kVGFibGUKICAqCiAgKiBGZXRjaGVzIGNvbmZsaWN0IGxvZ2dpbmcgbWV0YWRhdGEgZnJv bSB0aGUgY2FjaGVkIE15U3Vic2NyaXB0aW9uIHBvaW50ZXIuCi0gKiBTZXRzIHRoZSBkZXN0aW5h dGlvbiBlbnVtIGluICpsb2dfZGVzdCBhbmQsIGlmIGFwcGxpY2FibGUsIG9wZW5zIGFuZAotICog cmV0dXJucyB0aGUgcmVsYXRpb24gaGFuZGxlIGZvciB0aGUgY29uZmxpY3QgbG9nIHRhYmxlLgor ICogUmVwb3J0cyB3aGV0aGVyIGNvbmZsaWN0cyBzaG91bGQgYmUgbG9nZ2VkIHRvIHRoZSB0YWJs ZSBhbmQvb3IgdGhlIHNlcnZlcgorICogbG9nIHZpYSAqbG9nX2Rlc3RfdGFibGUgYW5kICpsb2df ZGVzdF9sb2dmaWxlIChlaXRoZXIgbWF5IGJlIE5VTEwgaWYgdGhlCisgKiBjYWxsZXIgaXMgbm90 IGludGVyZXN0ZWQpLCBhbmQsIGlmIGEgdGFibGUgaXMgb25lIG9mIHRoZSBkZXN0aW5hdGlvbnMs IG9wZW5zCisgKiBhbmQgcmV0dXJucyB0aGUgcmVsYXRpb24gaGFuZGxlIGZvciB0aGUgY29uZmxp Y3QgbG9nIHRhYmxlLgorICoKKyAqIFRoZSB0YWJsZSBpcyBvcGVuZWQgd2l0aCB0cnlfdGFibGVf b3BlbigpLiAgSWYgdGhlIGNvbmZsaWN0IGxvZyB0YWJsZSBoYXMKKyAqIGJlZW4gZHJvcHBlZCBj b25jdXJyZW50bHkgKGUuZy4gYnkgYW4gQUxURVIgU1VCU0NSSVBUSU9OIHRoYXQgY2hhbmdlZAor ICogY29uZmxpY3RfbG9nX2Rlc3RpbmF0aW9uKSwgTlVMTCBpcyByZXR1cm5lZCBhbmQgdGhlIHJl cG9ydGVkIGRlc3RpbmF0aW9ucworICogYXJlIGFkanVzdGVkIHRvIGZhbGwgYmFjayB0byB0aGUg c2VydmVyIGxvZyAoKmxvZ19kZXN0X3RhYmxlID0gZmFsc2UsCisgKiAqbG9nX2Rlc3RfbG9nZmls ZSA9IHRydWUpLCBzbyB0aGUgY2FsbGVyIHN0aWxsIHJlY29yZHMgdGhlIGNvbmZsaWN0IGluc3Rl YWQKKyAqIG9mIGZhaWxpbmcuCiAgKi8KIFJlbGF0aW9uCi1HZXRDb25mbGljdExvZ0Rlc3RBbmRU YWJsZShDb25mbGljdExvZ0Rlc3QgKmxvZ19kZXN0KQorR2V0Q29uZmxpY3RMb2dEZXN0QW5kVGFi bGUoYm9vbCAqbG9nX2Rlc3RfdGFibGUsIGJvb2wgKmxvZ19kZXN0X2xvZ2ZpbGUpCiB7CisJQ29u ZmxpY3RMb2dEZXN0IGRlc3Q7CiAJT2lkCQkJY29uZmxpY3Rsb2dyZWxpZDsKKwlSZWxhdGlvbglj b25mbGljdGxvZ3JlbDsKIAogCS8qCi0JICogQ29udmVydCB0aGUgdGV4dCBsb2cgZGVzdGluYXRp b24gdG8gdGhlIGludGVybmFsIGVudW0uICBNeVN1YnNjcmlwdGlvbgotCSAqIGFscmVhZHkgY29u dGFpbnMgdGhlIGRhdGEgZnJvbSBwZ19zdWJzY3JpcHRpb24uCisJICogQ29udmVydCB0aGUgdGV4 dCBsb2cgZGVzdGluYXRpb24gdG8gdGhlIGludGVybmFsIGVudW0gYW5kIHJlcG9ydCB0aGUKKwkg KiBpbmRpdmlkdWFsIGRlc3RpbmF0aW9ucyB0byB0aGUgY2FsbGVyLiAgTXlTdWJzY3JpcHRpb24g YWxyZWFkeSBjb250YWlucworCSAqIHRoZSBkYXRhIGZyb20gcGdfc3Vic2NyaXB0aW9uLgogCSAq LwotCSpsb2dfZGVzdCA9IEdldENvbmZsaWN0TG9nRGVzdChNeVN1YnNjcmlwdGlvbi0+Y29uZmxp Y3Rsb2dkZXN0KTsKKwlkZXN0ID0gR2V0Q29uZmxpY3RMb2dEZXN0KE15U3Vic2NyaXB0aW9uLT5j b25mbGljdGxvZ2Rlc3QpOworCisJaWYgKGxvZ19kZXN0X3RhYmxlKQorCQkqbG9nX2Rlc3RfdGFi bGUgPSBDT05GTElDVFNfTE9HR0VEX1RPX1RBQkxFKGRlc3QpOworCWlmIChsb2dfZGVzdF9sb2dm aWxlKQorCQkqbG9nX2Rlc3RfbG9nZmlsZSA9IENPTkZMSUNUU19MT0dHRURfVE9fTE9HKGRlc3Qp OwogCiAJLyogUXVpY2sgZXhpdCBpZiBhIGNvbmZsaWN0IGxvZyB0YWJsZSB3YXMgbm90IHJlcXVl c3RlZC4gKi8KLQlpZiAoIUNPTkZMSUNUU19MT0dHRURfVE9fVEFCTEUoKmxvZ19kZXN0KSkKKwlp ZiAoIUNPTkZMSUNUU19MT0dHRURfVE9fVEFCTEUoZGVzdCkpCiAJCXJldHVybiBOVUxMOwogCiAJ Y29uZmxpY3Rsb2dyZWxpZCA9IE15U3Vic2NyaXB0aW9uLT5jb25mbGljdGxvZ3JlbGlkOwogCiAJ QXNzZXJ0KE9pZElzVmFsaWQoY29uZmxpY3Rsb2dyZWxpZCkpOwogCi0JcmV0dXJuIHRhYmxlX29w ZW4oY29uZmxpY3Rsb2dyZWxpZCwgUm93RXhjbHVzaXZlTG9jayk7CisJLyoKKwkgKiBVc2UgdHJ5 X3RhYmxlX29wZW4oKTogdGhlIHRhYmxlIG1heSBoYXZlIGJlZW4gZHJvcHBlZCBjb25jdXJyZW50 bHkgYnkgYW4KKwkgKiBBTFRFUiBTVUJTQ1JJUFRJT04gdGhhdCBjaGFuZ2VkIGNvbmZsaWN0X2xv Z19kZXN0aW5hdGlvbi4KKwkgKi8KKwljb25mbGljdGxvZ3JlbCA9IHRyeV90YWJsZV9vcGVuKGNv bmZsaWN0bG9ncmVsaWQsIFJvd0V4Y2x1c2l2ZUxvY2spOworCisJLyoKKwkgKiBJZiB0aGUgdGFi bGUgaXMgZ29uZSwgZmFsbCBiYWNrIHRvIGxvZ2dpbmcgdGhlIGNvbmZsaWN0IHRvIHRoZSBzZXJ2 ZXIKKwkgKiBsb2cgc28gaXQgaXMgbm90IGxvc3Q6IHJlcG9ydCB0aGUgdGFibGUgYXMgbm8gbG9u Z2VyIGEgZGVzdGluYXRpb24gYW5kCisJICogZm9yY2Ugc2VydmVyLWxvZyByZXBvcnRpbmcuCisJ ICovCisJaWYgKGNvbmZsaWN0bG9ncmVsID09IE5VTEwpCisJeworCQlpZiAobG9nX2Rlc3RfdGFi bGUpCisJCQkqbG9nX2Rlc3RfdGFibGUgPSBmYWxzZTsKKwkJaWYgKGxvZ19kZXN0X2xvZ2ZpbGUp CisJCQkqbG9nX2Rlc3RfbG9nZmlsZSA9IHRydWU7CisJfQorCisJcmV0dXJuIGNvbmZsaWN0bG9n cmVsOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvcmVwbGljYXRpb24vY29uZmxp Y3QuaCBiL3NyYy9pbmNsdWRlL3JlcGxpY2F0aW9uL2NvbmZsaWN0LmgKaW5kZXggYjcyN2NjMjg1 ZTkuLjc2MGYzNzVkMDg4IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9yZXBsaWNhdGlvbi9jb25m bGljdC5oCisrKyBiL3NyYy9pbmNsdWRlL3JlcGxpY2F0aW9uL2NvbmZsaWN0LmgKQEAgLTExNyw2 ICsxMTcsNyBAQCBleHRlcm4gdm9pZCBSZXBvcnRBcHBseUNvbmZsaWN0KEVTdGF0ZSAqZXN0YXRl LCBSZXN1bHRSZWxJbmZvICpyZWxpbmZvLAogCQkJCQkJCQlMaXN0ICpjb25mbGljdHR1cGxlcyk7 CiBleHRlcm4gdm9pZCBQcm9jZXNzUGVuZGluZ0NvbmZsaWN0TG9nVHVwbGUodm9pZCk7CiBleHRl cm4gdm9pZCBJbml0Q29uZmxpY3RJbmRleGVzKFJlc3VsdFJlbEluZm8gKnJlbEluZm8pOwotZXh0 ZXJuIFJlbGF0aW9uIEdldENvbmZsaWN0TG9nRGVzdEFuZFRhYmxlKENvbmZsaWN0TG9nRGVzdCAq bG9nX2Rlc3QpOworZXh0ZXJuIFJlbGF0aW9uIEdldENvbmZsaWN0TG9nRGVzdEFuZFRhYmxlKGJv b2wgKmxvZ19kZXN0X3RhYmxlLAorCQkJCQkJCQkJCSAgIGJvb2wgKmxvZ19kZXN0X2xvZ2ZpbGUp OwogZXh0ZXJuIHZvaWQgSW5zZXJ0Q29uZmxpY3RMb2dUdXBsZShSZWxhdGlvbiBjb25mbGljdGxv Z3JlbCk7CiAjZW5kaWYKLS0gCjIuNTQuMAoK --000000000000085c570654d3fbe8--