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