diff --git a/src/backend/replication/logical/launcher.c b/src/backend/replication/logical/launcher.c index ecd11e9508..9ab91c3197 100644 --- a/src/backend/replication/logical/launcher.c +++ b/src/backend/replication/logical/launcher.c @@ -1392,14 +1392,22 @@ advance_conflict_slot_xmin(FullTransactionId new_xmin) * xmin of the replication slot. This handles the case where transaction * ID wraparound has occurred. */ +elog(LOG,"XXX: launcher new_xid= %u",next_xid); +elog(LOG,"XXX: launcher current slot xmin = %u",MyReplicationSlot->data.xmin); + if (next_xid < MyReplicationSlot->data.xmin) xmin_epoch--; full_xmin = FullTransactionIdFromEpochAndXid(xmin_epoch, MyReplicationSlot->data.xmin); +elog(LOG,"XXX: launcher full_xmin= %u",XidFromFullTransactionId(full_xmin)); if (FullTransactionIdPrecedesOrEquals(new_xmin, full_xmin)) + { + elog(LOG,"XXX: launcher returned without updating xmin!"); return false; + } + SpinLockAcquire(&MyReplicationSlot->mutex); MyReplicationSlot->data.xmin = XidFromFullTransactionId(new_xmin); @@ -1411,6 +1419,8 @@ advance_conflict_slot_xmin(FullTransactionId new_xmin) ReplicationSlotSave(); elog(DEBUG1, "updated xmin: %u", MyReplicationSlot->data.xmin); +elog(LOG,"XXX: launcher updated xmin = %u",MyReplicationSlot->data.xmin); + /* * Now the new xmin is safely on disk, we can let the global value * advance. We do not take ProcArrayLock or similar since we only advance diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index afd31e1525..3d1024b96e 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -4136,12 +4136,20 @@ get_candidate_xid(RetainConflictInfoData *data) next_full_xid = ReadNextFullTransactionId(); epoch = EpochFromFullTransactionId(next_full_xid); +elog(LOG,"XXX: oldest_running_xid = %u",oldest_running_xid); +elog(LOG,"XXX: next_full_xid = %u ",XidFromFullTransactionId(next_full_xid)); + /* Compute the epoch of the oldest_running_xid */ if (oldest_running_xid > XidFromFullTransactionId(next_full_xid)) + { + elog(LOG,"XXX: xid WRAPAROUND happend!!!"); epoch--; + } full_xid = FullTransactionIdFromEpochAndXid(epoch, oldest_running_xid); +elog(LOG,"XXX: candidate full_xid = %u ",XidFromFullTransactionId(full_xid)); + /* Return if the oldest_nonremovable_xid cannot be advanced */ if (FullTransactionIdFollowsOrEquals(MyLogicalRepWorker->oldest_nonremovable_xid, full_xid))