faster_hot_standby_startup_withsubxacts.v1.patch
application/octet-stream
Filename: faster_hot_standby_startup_withsubxacts.v1.patch
Type: application/octet-stream
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
Series: patch v1
| File | + | − |
|---|---|---|
| src/backend/storage/ipc/procarray.c | 32 | 20 |
diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c
index bbc5f44..fa86e7c 100644
--- a/src/backend/storage/ipc/procarray.c
+++ b/src/backend/storage/ipc/procarray.c
@@ -475,8 +475,9 @@ ProcArrayApplyRecoveryInfo(RunningTransactions running)
/*
* If our initial RunningTransactionsData had an overflowed snapshot then
- * we knew we were missing some subxids from our snapshot. We can use this
- * data as an initial snapshot, but we cannot yet mark it valid. We know
+ * we knew we were missing some subxids from our snapshot. If we continue
+ * to see overflowed snapshots then we might never be able to start up,
+ * so we make another test to see if our snapshot is now valid. We know
* that the missing subxids are equal to or earlier than nextXid. After we
* initialise we continue to apply changes during recovery, so once the
* oldestRunningXid is later than the nextXid from the initial snapshot we
@@ -485,21 +486,31 @@ ProcArrayApplyRecoveryInfo(RunningTransactions running)
*/
if (standbyState == STANDBY_SNAPSHOT_PENDING)
{
- if (TransactionIdPrecedes(standbySnapshotPendingXmin,
- running->oldestRunningXid))
+ /*
+ * If the snapshot isn't overflowed, reset our pending state and
+ * use this snapshot instead.
+ */
+ if (!running->subxid_overflow)
+ standbyState = STANDBY_INITIALIZED;
+ else
{
- standbyState = STANDBY_SNAPSHOT_READY;
- elog(trace_recovery(DEBUG2),
- "running xact data now proven complete");
- elog(trace_recovery(DEBUG2),
- "recovery snapshots are now enabled");
+ if (TransactionIdPrecedes(standbySnapshotPendingXmin,
+ running->oldestRunningXid))
+ {
+ standbyState = STANDBY_SNAPSHOT_READY;
+ elog(trace_recovery(DEBUG2),
+ "running xact data now proven complete");
+ elog(LOG,
+ "recovery snapshots are now enabled");
+ }
+ else
+ elog(LOG,
+ "recovery snapshot waiting for non-overflowed snapshot or "
+ "until oldest active xid on standby is at least %u (now %u)",
+ standbySnapshotPendingXmin,
+ running->oldestRunningXid);
+ return;
}
- else
- elog(trace_recovery(DEBUG2),
- "recovery snapshot waiting for %u oldest active xid on standby is %u",
- standbySnapshotPendingXmin,
- running->oldestRunningXid);
- return;
}
Assert(standbyState == STANDBY_INITIALIZED);
@@ -604,7 +615,6 @@ ProcArrayApplyRecoveryInfo(RunningTransactions running)
standbyState = STANDBY_SNAPSHOT_READY;
standbySnapshotPendingXmin = InvalidTransactionId;
- procArray->lastOverflowedXid = InvalidTransactionId;
}
/*
@@ -627,13 +637,15 @@ ProcArrayApplyRecoveryInfo(RunningTransactions running)
LWLockRelease(ProcArrayLock);
- elog(trace_recovery(DEBUG2), "running transaction data initialized");
KnownAssignedXidsDisplay(trace_recovery(DEBUG3));
if (standbyState == STANDBY_SNAPSHOT_READY)
- elog(trace_recovery(DEBUG2), "recovery snapshots are now enabled");
+ elog(LOG, "recovery snapshots are now enabled");
else
- ereport(LOG,
- (errmsg("consistent state delayed because recovery snapshot incomplete")));
+ elog(LOG,
+ "recovery snapshot waiting for non-overflowed snapshot or "
+ "until oldest active xid on standby is at least %u (now %u)",
+ standbySnapshotPendingXmin,
+ running->oldestRunningXid);
}
/*