Re: logical replication worker accesses catalogs in error context callback
Bharath Rupireddy <bharath.rupireddyforpostgres@gmail.com>
From: Bharath Rupireddy <bharath.rupireddyforpostgres@gmail.com>
To: Andres Freund <andres@anarazel.de>
Cc: Amit Kapila <amit.kapila16@gmail.com>, Zhihong Yu <zyu@yugabyte.com>, Masahiko Sawada <sawada.mshk@gmail.com>, PostgreSQL-development <pgsql-hackers@postgresql.org>,
Peter Eisentraut <peter_e@gmx.net>, Petr Jelinek <petr@2ndquadrant.com>, Alvaro Herrera <alvherre@alvh.no-ip.org>
Date: 2021-02-04T09:38:42Z
Lists: pgsql-hackers
On Thu, Feb 4, 2021 at 5:16 AM Andres Freund <andres@anarazel.de> wrote: > > > > About 0001, have we tried to reproduce the actual bug here which means > > > > when the error_callback is called we should face some problem? I feel > > > > with the correct testcase we should hit the Assert > > > > (Assert(IsTransactionState());) in SearchCatCacheInternal because > > > > there we expect the transaction to be in a valid state. I understand > > > > that the transaction is in a broken state at that time but having a > > > > testcase to hit the actual bug makes it easy to test the fix. > > > > > > I think it's easy to hit - add a trivial DEBUG message to XLogWrite(), > > > and run anything involving logical rep using a low enough log > > > level. There might even be enough messages with a low enough level > > > already somewhere in the relevant paths. > > > > I'm not sure how adding a DEBUG message to XLogWrite() would ensure > > the logical replication worker on the subscriber system enters > > slot_store_error_callback and hits the Assert(IsTransactionState());? > > Could you please elaborate? Or I may be missing something here to > > understand. > > XLogWrite() is in a critical section, the DEBUG messages triggers error > context callbacks to be called, the callbacks allocate memory, which > triggers an assertion. I see that XLogWrite() can be called from logical replication worker(apply_handle_commit->apply_handle_commit_internal->CommitTransactionCommand->CommitTransaction->RecordTransactionCommit->XLogFlush->XLogWrite --> by now the txn state is not TRANS_INPROGRESS, so IsTransactionState() can return false. Adding a DEBUG message there can call the error context callback. But the error context callback slot_store_error_callback, gets used in slot_store_data and slot_modify_data. In both places we just register the callback before an attribute processing for loop and deregister after it. So, when we are in those for loops, we expect to be in TRANS_INPROGRESS, see ensure_transaction before slot_store_data and the same is true for slot_modify_data. So, to really hit the assert failure in the catalogue access from slot_store_error_callback, first, we shouldn't be in TRANS_INPROGRESS in those for loops and have a DEBUG message. I'm not exactly sure how we achieve this. Am I missing something? With Regards, Bharath Rupireddy. EnterpriseDB: http://www.enterprisedb.com
Commits
-
Avoid doing catalog lookups in postgres_fdw's conversion_error_callback.
- bee18616a650 13.4 landed
- bd2e68d0bf94 12.8 landed
- b23ac5aefae4 10.18 landed
- a9460dbf1577 11.13 landed
- 67f925bbd9de 9.6.23 landed
- c7b7311f6177 15.0 landed
- 86d4914210e9 14.0 landed
-
Don't try to print data type names in slot_store_error_callback().
- 63a952167092 14.0 landed
- feff6155734e 12.8 landed
- 7fc97752d566 13.4 landed
- 50371df266d4 15.0 landed
- 32d50b895217 11.13 landed
- 0b5089e8c979 10.18 landed
-
logical replication: fix OID type mapping mechanism
- 24c0a6c64976 11.0 cited
-
Improve sys/catcache performance.
- 141fd1b66ce6 11.0 cited
-
Logical replication
- 665d1fad99e7 10.0 cited