Re: TRAP: FailedAssertion("prev_first_lsn < cur_txn->first_lsn", File: "reorderbuffer.c", Line: 927, PID: 568639)
Amit Kapila <amit.kapila16@gmail.com>
From: Amit Kapila <amit.kapila16@gmail.com>
To: Masahiko Sawada <sawada.mshk@gmail.com>
Cc: Tomas Vondra <tomas.vondra@enterprisedb.com>, pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2022-10-13T07:08:40Z
Lists: pgsql-hackers
On Wed, Oct 12, 2022 at 11:18 AM Masahiko Sawada <sawada.mshk@gmail.com> wrote: > > Summarizing this issue, the assertion check in AssertTXNLsnOrder() > fails as reported because the current logical decoding cannot properly > handle the case where the decoding restarts from NEW_CID. Since we > don't make the association between top-level transaction and its > subtransaction while decoding NEW_CID (ie, in > SnapBuildProcessNewCid()), two transactions are created in > ReorderBuffer as top-txn and have the same LSN. This failure happens > on all supported versions. > > To fix the problem, one idea is that we make the association between > top-txn and sub-txn during that by calling ReorderBufferAssignChild(), > as Tomas proposed. On the other hand, since we don't guarantee to make > the association between the top-level transaction and its > sub-transactions until we try to decode the actual contents of the > transaction, it makes sense to me that instead of trying to solve by > making association, we need to change the code which are assuming that > it is associated. > > I've attached the patch for this idea. With the patch, we skip the > assertion checks in AssertTXNLsnOrder() until we reach the LSN at > which we start decoding the contents of transaction, ie. > start_decoding_at in SnapBuild. The minor concern is other way that > the assertion check could miss some faulty cases where two unrelated > top-transactions could have same LSN. With this patch, it will pass > for such a case. Therefore, for transactions that we skipped checking, > we do the check when we reach the LSN. > > --- a/src/backend/replication/logical/decode.c +++ b/src/backend/replication/logical/decode.c @@ -113,6 +113,15 @@ LogicalDecodingProcessRecord(LogicalDecodingContext *ctx, XLogReaderState *recor buf.origptr); } +#ifdef USE_ASSERT_CHECKING + /* + * Check the order of transaction LSNs when we reached the start decoding + * LSN. See the comments in AssertTXNLsnOrder() for details. + */ + if (SnapBuildGetStartDecodingAt(ctx->snapshot_builder) == buf.origptr) + AssertTXNLsnOrder(ctx->reorder); +#endif + rmgr = GetRmgr(XLogRecGetRmid(record)); > I am not able to think how/when this check will be useful. Because we skipped assert checking only for records that are prior to start_decoding_at point, I think for those records ordering should have been checked before the restart. start_decoding_at point will be either (a) confirmed_flush location, or (b) lsn sent by client, and any record prior to that must have been processed before restart. Now, say we have commit records for multiple transactions which are after start_decoding_at but all their changes are before start_decoding_at, then we won't check their ordering at commit time but OTOH, we would have checked their ordering before restart. Isn't that sufficient? -- With Regards, Amit Kapila.
Commits
-
Fix executing invalidation messages generated by subtransactions during decoding.
- 343afa967106 15.1 landed
- 4fbe6096b954 14.6 landed
- 38dbaaf27387 13.9 landed
- 02600886c8a8 12.13 landed
- 216af69aec0d 11.18 landed
-
Fix assertion failures while processing NEW_CID record in logical decoding.
- 64ff0fe4e8c4 15.1 landed
- a592ed923e67 14.6 landed
- 25f7be1ca236 13.9 landed
- 1bf4d92060ee 12.13 landed
- 5f7076cb609e 11.18 landed
- 10ed7b9e4b19 10.23 landed
- 16b1fe0037dc 16.0 landed
-
Immediately WAL-log subtransaction and top-level XID association.
- 0bead9af484c 14.0 cited
-
Stop demanding that top xact must be seen before subxact in decoding.
- e3ff789acfb2 13.0 cited