mirror of
https://github.com/postgres/postgres.git
synced 2025-06-14 18:42:34 +03:00
Fix skip-empty-xacts with sequences in test_decoding
Regression tests need to use skip-empty-xacts = false, because there
might be accidental concurrent activity (like autovacuum), particularly
on slow machines. The tests added by 80901b3291
failed to do that in a
couple places, triggering occasional failures on buildfarm.
Fixing the tests however uncovered a bug in the code, because sequence
callbacks did not handle skip-empty-xacts properly. For trasactional
increments we need to check/update the xact_wrote_changes flag, and emit
the BEGIN if it's the first change in the transaction.
Reported-by: Andres Freund
Discussion: https://postgr.es/m/20220212220413.b25amklo7t4xb7ni%40alap3.anarazel.de
This commit is contained in:
@ -774,10 +774,21 @@ pg_decode_sequence(LogicalDecodingContext *ctx, ReorderBufferTXN *txn,
|
||||
int64 last_value, int64 log_cnt, bool is_called)
|
||||
{
|
||||
TestDecodingData *data = ctx->output_plugin_private;
|
||||
TestDecodingTxnData *txndata = txn->output_plugin_private;
|
||||
|
||||
if (!data->include_sequences)
|
||||
return;
|
||||
|
||||
/* output BEGIN if we haven't yet, but only for the transactional case */
|
||||
if (transactional)
|
||||
{
|
||||
if (data->skip_empty_xacts && !txndata->xact_wrote_changes)
|
||||
{
|
||||
pg_output_begin(ctx, data, txn, false);
|
||||
}
|
||||
txndata->xact_wrote_changes = true;
|
||||
}
|
||||
|
||||
OutputPluginPrepareWrite(ctx, true);
|
||||
appendStringInfoString(ctx->out, "sequence ");
|
||||
appendStringInfoString(ctx->out,
|
||||
@ -994,10 +1005,21 @@ pg_decode_stream_sequence(LogicalDecodingContext *ctx, ReorderBufferTXN *txn,
|
||||
int64 last_value, int64 log_cnt, bool is_called)
|
||||
{
|
||||
TestDecodingData *data = ctx->output_plugin_private;
|
||||
TestDecodingTxnData *txndata = txn->output_plugin_private;
|
||||
|
||||
if (!data->include_sequences)
|
||||
return;
|
||||
|
||||
/* output BEGIN if we haven't yet, but only for the transactional case */
|
||||
if (transactional)
|
||||
{
|
||||
if (data->skip_empty_xacts && !txndata->xact_wrote_changes)
|
||||
{
|
||||
pg_output_begin(ctx, data, txn, false);
|
||||
}
|
||||
txndata->xact_wrote_changes = true;
|
||||
}
|
||||
|
||||
OutputPluginPrepareWrite(ctx, true);
|
||||
appendStringInfoString(ctx->out, "streaming sequence ");
|
||||
appendStringInfoString(ctx->out,
|
||||
|
Reference in New Issue
Block a user