Re: TRAP: FailedAssertion("prev_first_lsn < cur_txn->first_lsn", File: "reorderbuffer.c", Line: 927, PID: 568639) - Mailing list pgsql-hackers
From | Masahiko Sawada |
---|---|
Subject | Re: TRAP: FailedAssertion("prev_first_lsn < cur_txn->first_lsn", File: "reorderbuffer.c", Line: 927, PID: 568639) |
Date | |
Msg-id | CAD21AoA1gV9pfu8hoXpTQBWH8uEMRg_F_MKM+U3Sr0HnyH4AUQ@mail.gmail.com Whole thread Raw |
In response to | Re: TRAP: FailedAssertion("prev_first_lsn < cur_txn->first_lsn", File: "reorderbuffer.c", Line: 927, PID: 568639) (Amit Kapila <amit.kapila16@gmail.com>) |
Responses |
Re: TRAP: FailedAssertion("prev_first_lsn < cur_txn->first_lsn", File: "reorderbuffer.c", Line: 927, PID: 568639)
Re: TRAP: FailedAssertion("prev_first_lsn < cur_txn->first_lsn", File: "reorderbuffer.c", Line: 927, PID: 568639) |
List | pgsql-hackers |
Hi, On Tue, Sep 6, 2022 at 3:00 PM Amit Kapila <amit.kapila16@gmail.com> wrote: > > On Mon, Sep 5, 2022 at 5:24 PM Tomas Vondra > <tomas.vondra@enterprisedb.com> wrote: > > > > On 9/5/22 12:12, Amit Kapila wrote: > > > On Mon, Sep 5, 2022 at 12:14 PM Tomas Vondra > > > <tomas.vondra@enterprisedb.com> wrote: > > > > > > It is possible that there is some other problem here that I am > > > missing. But at this stage, I don't see anything wrong other than the > > > assertion you have reported. > > > > > > > I'm not sure I agree with that. I'm not convinced the assert is at > > fault, it might easily be that it hints there's a logic bug somewhere. > > > > It is possible but let's try to prove it. I am also keen to know if > this hints at a logic bug somewhere. > > > >> I think it's mostly clear we won't output this transaction, because the > > >> restart LSN is half-way through. We can either ignore it at commit time, > > >> and then we have to make everything work in case we miss assignments (or > > >> any other part of the transaction). > > >> > > > > > > Note, traditionally, we only form these assignments at commit time > > > after deciding whether to skip such commits. So, ideally, there > > > shouldn't be any fundamental problem with not making these > > > associations before deciding whether we need to replay (send > > > downstream) any particular transaction. Agreed. 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. Please note that to pass the new regression tests, the fix proposed in a related thread[1] is required. Particularly, we need: @@ -1099,6 +1099,9 @@ SnapBuildCommitTxn(SnapBuild *builder, XLogRecPtr lsn, TransactionId xid, else if (sub_needs_timetravel) { /* track toplevel txn as well, subxact alone isn't meaningful */ + elog(DEBUG2, "forced transaction %u to do timetravel due to one of its subtransaction", + xid); + needs_timetravel = true; SnapBuildAddCommittedTxn(builder, xid); } else if (needs_timetravel) A side benefit of this approach is that we can fix another assertion failure too that happens on REL14 and REL15 and reported here[2]. In the commits 68dcce247f1a(REL14) and 272248a0c1(REL15), the reason why we make the association between sub-txns to top-txn in SnapBuildXidSetCatalogChanges() is just to avoid the assertion failure in AssertTXNLsnOrder(). However, since the invalidation messages are not transported from sub-txn to top-txn during the assignment, another assertion check in ReorderBufferForget() fails when forgetting the subtransaction. If we apply this idea of skipping the assertion checks, we no longer need to make the such association in SnapBuildXidSetCatalogChanges() and resolve this issue as well. > > >>> > > >> > > >> Don't we know 848 (the top-level xact) won't be decoded? In that case we > > >> won't need the snapshot, so why build it? > > >> > > > > > > But this transaction id can be part of committed.xip array if it has > > > made any catalog changes. We add the transaction/subtransaction to > > > this array before deciding whether to skip decoding/replay of its > > > commit. > > > > > > > Hmm, yeah. It's been a while since I last looked into how we build > > snapshots and how we share them between the transactions :-( If we share > > the snapshots between transactions, you're probably right we can't just > > skip these changes. > > > > However, doesn't that pretty much mean we *have* to do something about > > the assignment? I mean, suppose we miss the assignment (like now), so > > that we end up with two TXNs that we think are top-level. And then we > > get the commit for the actual top-level transaction. AFAICS that won't > > clean-up the subxact, and we end up with a lingering TXN. > > > > I think we will clean up such a subxact. Such a xact should be skipped > via DecodeTXNNeedSkip() and then it will call ReorderBufferForget() > for each of the subxacts and that will make sure that we clean up each > of subtxn's. > Right. Regards, [1] https://www.postgresql.org/message-id/TYAPR01MB58666BD6BE24853269624282F5419%40TYAPR01MB5866.jpnprd01.prod.outlook.com [2] https://www.postgresql.org/message-id/TYAPR01MB58660803BCAA7849C8584AA4F57E9%40TYAPR01MB5866.jpnprd01.prod.outlook.com -- Masahiko Sawada PostgreSQL Contributors Team RDS Open Source Databases Amazon Web Services: https://aws.amazon.com
Attachment
pgsql-hackers by date: