Re: RE: Re:BUG #18369: logical decoding core on AssertTXNLsnOrder() - Mailing list pgsql-bugs
From | Amit Kapila |
---|---|
Subject | Re: RE: Re:BUG #18369: logical decoding core on AssertTXNLsnOrder() |
Date | |
Msg-id | CAA4eK1KpW5pHMwMp9hfXYvOeEU5Rcbhoc7FxtBOGPgKeyYLDmA@mail.gmail.com Whole thread Raw |
In response to | Re:RE: Re:BUG #18369: logical decoding core on AssertTXNLsnOrder() (ocean_li_996 <ocean_li_996@163.com>) |
Responses |
RE: RE: Re:BUG #18369: logical decoding core on AssertTXNLsnOrder()
|
List | pgsql-bugs |
On Wed, Mar 6, 2024 at 9:04 AM ocean_li_996 <ocean_li_996@163.com> wrote: > > Thanks for your attention. > > At 2024-03-05 17:24:05, "Hayato Kuroda (Fujitsu)" <kuroda.hayato@fujitsu.com> wrote: > > >Dear Haiyang Li, > > > >... > >## Found issue > > > >### Empty transaction is decoded on PG14 and PG15 > > > >However, there is a room for generating ReorderBufferTxn for empty transactions, > >which was introduced by 6b77048e5. Conditions are: > > > >1. There are sub transactions which modify only temp tables, and > >2. the top transaction modifies the catalog. > > > >The call-stack toward the generation is below. > > > >``` > >ReorderBufferTXNByXid(create = true, create_as_top = true) > >ReorderBufferXidSetCatalogChanges() // for sub transactions > >SnapBuildXidSetCatalogChanges() // for top transaction > >DecodeCommit() // for top transaction > >``` > > > >The path has been introduced by 6b77048e5. > >Previously, calling ReorderBufferXidSetCatalogChanges() for sub transactions > >would be skipped, if they do not have catalog changes or they have not decoded yet. > >However, the commit ensures sub transactions must be marked as containing > >catalog changes, and this also enforces to decode transactions even if it is > >empty. > > > >### Assertion failure > > > >The empty transactions would be created as top transactions. At that time, > >AssertTXNLsnOrder() is called so that we ensured that first_lsn of top-transactions > >must be strictly higher than previous. But they can be the same if there are more > >than two empty transactions. It led an assertion failure. > > > Your analysis is correct for me. Actually, I mentioned in [1] that I can reproduce this issue before 6b77048e5. > After some attempts and analysis, I also believe that the issue will only occur after 6b77048e5. > > > ... > > > >## Possible solutions > > > >I think there are several solutions. > >Note that I assumed here that fixes for all the versions should be almost the same. > > > >* Ease the condition in AssertTXNLsnOrder(). If the decoded transaction is empty, > > it can be allowed that the first_lsn is same as previous one. > > PSA file to see my consideration. > LGFM. For my observation, the most case failed on AsserTXNOrder is checking empty > decoded transaction. Maybe we should pay more attention to review ReorderBufferTXNIsEmpty. > > >* Generate a ReorderBufferTXN as sub transaction when we are in this path. > > The approach has already been shared by you. However, note that this needs to > > extend the ReorderBufferXidSetCatalogChanges function, and breaks ABI > > compatibility [1]. > Yes, It breaks ABI compatibility. > One possibility is introducing ReorderBufferXidSetCatalogChangesEx, a new API with a bool parameter. I don't know if this is a good idea but I prefer not to tinker with asserts as proposed by Kuroda-San in another approach. -- With Regards, Amit Kapila.
pgsql-bugs by date: