At Tue, 19 Apr 2022 10:55:26 -0700, Andres Freund <and...@anarazel.de> wrote in > Hi, > > On 2022-04-19 10:36:24 -0700, Andres Freund wrote: > > On 2022-04-19 13:50:25 +0200, Erik Rijkers wrote: > > > The 12th run of statbug.sh crashed and gave a corefile. > > > > I ran through quite a few iterations by now, without reproducing :( > > > > I guess there's some timing issue and you're hitting on your system > > due to the slower disks. > > Ah. I found the issue. The new pgstat_report_stat(true) call in > LogicalRepApplyLoop()'s "timeout" section doesn't check if we're in a > transaction. And the transactional stats code doesn't handle that (never > has). > > I think all that's needed is a if (IsTransactionState()) around that > pgstat_report_stat().
if (!IsTransactinoState()) ? > It might be possible to put an assertion into pgstat_report_stat(), but > I need to look at the process exit code to see if it is. Inserting a sleep in pgoutput_commit_txn reproduced this. Crashes with the same stack trace with the similar variable state. diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c index b197bfd565..def4d751d3 100644 --- a/src/backend/replication/pgoutput/pgoutput.c +++ b/src/backend/replication/pgoutput/pgoutput.c @@ -568,6 +568,7 @@ pgoutput_commit_txn(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, return; } + sleep(2); OutputPluginPrepareWrite(ctx, true); logicalrep_write_commit(ctx->out, txn, commit_lsn); OutputPluginWrite(ctx, true); The following actuall works for this. diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index 4171371296..f4e5359513 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -2882,10 +2882,11 @@ LogicalRepApplyLoop(XLogRecPtr last_received) send_feedback(last_received, requestReply, requestReply); /* - * Force reporting to ensure long idle periods don't lead to - * arbitrarily delayed stats. + * Force reporting to ensure long out-of-transaction idle periods + * don't lead to arbitrarily delayed stats. */ - pgstat_report_stat(true); + if (!IsTransactionState()) + pgstat_report_stat(true); } } regards. -- Kyotaro Horiguchi NTT Open Source Software Center