diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/storage/ipc/procarray.c | 13 | ||||
-rw-r--r-- | src/include/storage/standby.h | 2 |
2 files changed, 14 insertions, 1 deletions
diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c index 9eea1ed315a..b3cd248fb64 100644 --- a/src/backend/storage/ipc/procarray.c +++ b/src/backend/storage/ipc/procarray.c @@ -2688,6 +2688,7 @@ GetRunningTransactionData(void) RunningTransactions CurrentRunningXacts = &CurrentRunningXactsData; TransactionId latestCompletedXid; TransactionId oldestRunningXid; + TransactionId oldestDatabaseRunningXid; TransactionId *xids; int index; int count; @@ -2732,7 +2733,7 @@ GetRunningTransactionData(void) latestCompletedXid = XidFromFullTransactionId(TransamVariables->latestCompletedXid); - oldestRunningXid = + oldestDatabaseRunningXid = oldestRunningXid = XidFromFullTransactionId(TransamVariables->nextXid); /* @@ -2740,6 +2741,8 @@ GetRunningTransactionData(void) */ for (index = 0; index < arrayP->numProcs; index++) { + int pgprocno = arrayP->pgprocnos[index]; + PGPROC *proc = &allProcs[pgprocno]; TransactionId xid; /* Fetch xid just once - see GetNewTransactionId */ @@ -2760,6 +2763,13 @@ GetRunningTransactionData(void) if (TransactionIdPrecedes(xid, oldestRunningXid)) oldestRunningXid = xid; + /* + * Also, update the oldest running xid within the current database. + */ + if (proc->databaseId == MyDatabaseId && + TransactionIdPrecedes(xid, oldestRunningXid)) + oldestDatabaseRunningXid = xid; + if (ProcGlobal->subxidStates[index].overflowed) suboverflowed = true; @@ -2826,6 +2836,7 @@ GetRunningTransactionData(void) CurrentRunningXacts->subxid_overflow = suboverflowed; CurrentRunningXacts->nextXid = XidFromFullTransactionId(TransamVariables->nextXid); CurrentRunningXacts->oldestRunningXid = oldestRunningXid; + CurrentRunningXacts->oldestDatabaseRunningXid = oldestDatabaseRunningXid; CurrentRunningXacts->latestCompletedXid = latestCompletedXid; Assert(TransactionIdIsValid(CurrentRunningXacts->nextXid)); diff --git a/src/include/storage/standby.h b/src/include/storage/standby.h index 534d56fbc9f..0fc0804e266 100644 --- a/src/include/storage/standby.h +++ b/src/include/storage/standby.h @@ -82,6 +82,8 @@ typedef struct RunningTransactionsData bool subxid_overflow; /* snapshot overflowed, subxids missing */ TransactionId nextXid; /* xid from TransamVariables->nextXid */ TransactionId oldestRunningXid; /* *not* oldestXmin */ + TransactionId oldestDatabaseRunningXid; /* same as above, but within the + * current database */ TransactionId latestCompletedXid; /* so we can set xmax */ TransactionId *xids; /* array of (sub)xids still running */ |