diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c index 9f1616c8773..16848fa226c 100644 --- a/src/backend/access/transam/twophase.c +++ b/src/backend/access/transam/twophase.c @@ -2156,26 +2156,6 @@ ProcessTwoPhaseBuffer(TransactionId xid, if (!fromdisk) Assert(prepare_start_lsn != InvalidXLogRecPtr); - /* Reject XID if too new */ - if (TransactionIdFollowsOrEquals(xid, origNextXid)) - { - if (fromdisk) - { - ereport(WARNING, - (errmsg("removing future two-phase state file for transaction %u", - xid))); - RemoveTwoPhaseFile(xid, true); - } - else - { - ereport(WARNING, - (errmsg("removing future two-phase state from memory for transaction %u", - xid))); - PrepareRedoRemove(xid, true); - } - return NULL; - } - /* Already processed? */ if (TransactionIdDidCommit(xid) || TransactionIdDidAbort(xid)) { @@ -2196,6 +2176,26 @@ ProcessTwoPhaseBuffer(TransactionId xid, return NULL; } + /* Reject XID if too new */ + if (TransactionIdFollowsOrEquals(xid, origNextXid)) + { + if (fromdisk) + { + ereport(WARNING, + (errmsg("removing future two-phase state file for transaction %u", + xid))); + RemoveTwoPhaseFile(xid, true); + } + else + { + ereport(WARNING, + (errmsg("removing future two-phase state from memory for transaction %u", + xid))); + PrepareRedoRemove(xid, true); + } + return NULL; + } + if (fromdisk) { /* Read and validate file */ diff --git a/src/test/recovery/t/009_twophase.pl b/src/test/recovery/t/009_twophase.pl index 59c186a1c82..a5686db2526 100644 --- a/src/test/recovery/t/009_twophase.pl +++ b/src/test/recovery/t/009_twophase.pl @@ -7,7 +7,7 @@ use warnings; use PostgresNode; use TestLib; -use Test::More tests => 28; +use Test::More tests => 27; my $psql_out = ''; my $psql_rc = ''; @@ -527,26 +527,3 @@ $cur_standby->psql( is( $psql_out, qq{27|issued to paris}, "Check expected t_009_tbl2 data on standby"); - -############################################################################### -# Check handling of orphaned 2PC files at recovery. -############################################################################### - -$cur_primary->teardown_node; - -# Grab location in logs of primary -my $log_offset = -s $cur_primary->logfile; - -# Create a fake file with a transaction ID large enough to be in the future, -# then check that the primary is able to start and remove this file at -# recovery. - -my $future_2pc_file = $cur_primary->data_dir . '/pg_twophase/00FFFFFF'; -append_to_file $future_2pc_file, ""; - -$cur_primary->start; -$cur_primary->log_check( - "future two-phase file removed at recovery", - $log_offset, - log_like => - [qr/removing future two-phase state file for transaction 16777215/]);