Thread
-
raising errors from Xact leads to assertion failure
Kirill Reshke <reshkekirill@gmail.com> — 2026-05-06T16:34:34Z
Hi! I am testing our 2pc tx implementation at the moment, and to do that, I created a simple auxiliary extension at [0]. My intent is to test what would happened in my system when one of PostgreSQL shards will error-out during PREPARE TRANSACTION (practically, this happens from time to time when postgresql is configured with max_prep_xact = 0) When I compile it with master (which is 5cdec423193cb99b502816197395637120256f0d for me) and run this SQL, it leads to assertion failure. My extension does elog() for the XACT_EVENT_PREPARE event type in XactCallback. For XACT_EVENT_PRE_PREPARE everything works just fine. So... My question is, is this illegal to elog () in XACT_EVENT_PREPARE case, and if yes, is this somehow documented ? SQL: reshke=# set twopc_aux_tester.error_on_prepare to true; SET reshke=# begin; BEGIN reshke=*# prepare transaction 'dz'; ERROR: injected error ``` Continuing. (gdb) Program received signal SIGABRT, Aborted. __pthread_kill_implementation (no_tid=0, signo=6, threadid=<optimized out>) at ./nptl/pthread_kill.c:44 warning: 44 ./nptl/pthread_kill.c: No such file or directory (gdb) bt #0 __pthread_kill_implementation (no_tid=0, signo=6, threadid=<optimized out>) at ./nptl/pthread_kill.c:44 #1 __pthread_kill_internal (signo=6, threadid=<optimized out>) at ./nptl/pthread_kill.c:78 #2 __GI___pthread_kill (threadid=<optimized out>, signo=signo@entry=6) at ./nptl/pthread_kill.c:89 #3 0x00007724a144527e in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26 #4 0x00007724a14288ff in __GI_abort () at ./stdlib/abort.c:79 #5 0x000057429dc7d9cf in ExceptionalCondition (conditionName=conditionName@entry=0x57429dd94bb0 "TransactionIdIsValid(proc->xid)", fileName=fileName@entry=0x57429dd05192 "procarray.c", lineNumber=lineNumber@entry=673) at assert.c:65 #6 0x000057429dae9293 in ProcArrayEndTransaction (proc=0x77249e689500, latestXid=<optimized out>) at procarray.c:673 #7 0x000057429d7bfb84 in AbortTransaction () at xact.c:3002 #8 0x000057429d7c04f6 in AbortCurrentTransactionInternal () at xact.c:3629 #9 AbortCurrentTransaction () at xact.c:3507 #10 0x000057429db18c48 in PostgresMain (dbname=<optimized out>, username=<optimized out>) at postgres.c:4539 #11 0x000057429db13333 in BackendMain (startup_data=<optimized out>, startup_data_len=<optimized out>) at backend_startup.c:124 #12 0x000057429da50ec1 in postmaster_child_launch (child_type=<optimized out>, child_slot=1, startup_data=startup_data@entry=0x7ffc84fb6d30, startup_data_len=startup_data_len@entry=24, client_sock=client_sock@entry=0x7ffc84fb6d50) at launch_backend.c:268 #13 0x000057429da54b2a in BackendStartup (client_sock=0x7ffc84fb6d50) at postmaster.c:3627 #14 ServerLoop () at postmaster.c:1728 #15 0x000057429da566f8 in PostmasterMain (argc=argc@entry=3, argv=argv@entry=0x5742b27a31a0) at postmaster.c:1415 #16 0x000057429d6fb0ae in main (argc=3, argv=0x5742b27a31a0) at main.c:231 (gdb) ``` [0] https://github.com/pg-sharding/twopc_aux_tester -- Best regards, Kirill Reshke