diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c index cd14667..35337e9 100644 --- a/src/backend/storage/ipc/procarray.c +++ b/src/backend/storage/ipc/procarray.c @@ -1304,6 +1304,21 @@ TransactionIdIsActive(TransactionId xid) TransactionId GetOldestXmin(Relation rel, bool ignoreVacuum) { + uint8 ignoreFlags = PROC_IN_LOGICAL_DECODING; + + if (ignoreVacuum) + ignoreFlags |= PROC_IN_VACUUM; + + return GetOldestXminExtended(rel, ignoreFlags); +} + +/* + * GetOldestXminExtended -- Like GetOldestXmin, but can ignore + * arbitrary flags. + */ +TransactionId +GetOldestXminExtended(Relation rel, uint8 ignoreFlags) +{ ProcArrayStruct *arrayP = procArray; TransactionId result; int index; @@ -1344,10 +1359,7 @@ GetOldestXmin(Relation rel, bool ignoreVacuum) * Backend is doing logical decoding which manages xmin separately, * check below. */ - if (pgxact->vacuumFlags & PROC_IN_LOGICAL_DECODING) - continue; - - if (ignoreVacuum && (pgxact->vacuumFlags & PROC_IN_VACUUM)) + if (pgxact->vacuumFlags & ignoreFlags) continue; if (allDbs || diff --git a/src/include/storage/procarray.h b/src/include/storage/procarray.h index 9d5a13e..2d3e8d0 100644 --- a/src/include/storage/procarray.h +++ b/src/include/storage/procarray.h @@ -53,6 +53,7 @@ extern RunningTransactions GetRunningTransactionData(void); extern bool TransactionIdIsInProgress(TransactionId xid); extern bool TransactionIdIsActive(TransactionId xid); +extern TransactionId GetOldestXminExtended(Relation rel, uint8 vacuumFlags); extern TransactionId GetOldestXmin(Relation rel, bool ignoreVacuum); extern TransactionId GetOldestActiveTransactionId(void); extern TransactionId GetOldestSafeDecodingTransactionId(void);