diff options
Diffstat (limited to 'src/backend/access/transam/xlog.c')
-rw-r--r-- | src/backend/access/transam/xlog.c | 55 |
1 files changed, 30 insertions, 25 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 2d4b62aa840..2deb7e5d89b 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -153,6 +153,7 @@ static XLogRecPtr LastRec; /* Local copy of WalRcv->receivedUpto */ static XLogRecPtr receivedUpto = 0; +static TimeLineID receiveTLI = 0; /* * During recovery, lastFullPageWrites keeps track of full_page_writes that @@ -6366,6 +6367,12 @@ StartupXLOG(void) xlogctl->SharedRecoveryInProgress = false; SpinLockRelease(&xlogctl->info_lck); } + + /* + * If there were cascading standby servers connected to us, nudge any + * wal sender processes to notice that we've been promoted. + */ + WalSndWakeup(); } /* @@ -7626,7 +7633,7 @@ CreateRestartPoint(int flags) XLogRecPtr endptr; /* Get the current (or recent) end of xlog */ - endptr = GetStandbyFlushRecPtr(NULL); + endptr = GetStandbyFlushRecPtr(); KeepLogSeg(endptr, &_logSegNo); _logSegNo--; @@ -9087,13 +9094,10 @@ do_pg_abort_backup(void) /* * Get latest redo apply position. * - * Optionally, returns the current recovery target timeline. Callers not - * interested in that may pass NULL for targetTLI. - * * Exported to allow WALReceiver to read the pointer directly. */ XLogRecPtr -GetXLogReplayRecPtr(TimeLineID *targetTLI) +GetXLogReplayRecPtr(void) { /* use volatile pointer to prevent code rearrangement */ volatile XLogCtlData *xlogctl = XLogCtl; @@ -9101,8 +9105,6 @@ GetXLogReplayRecPtr(TimeLineID *targetTLI) SpinLockAcquire(&xlogctl->info_lck); recptr = xlogctl->lastReplayedEndRecPtr; - if (targetTLI) - *targetTLI = xlogctl->RecoveryTargetTLI; SpinLockRelease(&xlogctl->info_lck); return recptr; @@ -9111,18 +9113,15 @@ GetXLogReplayRecPtr(TimeLineID *targetTLI) /* * Get current standby flush position, ie, the last WAL position * known to be fsync'd to disk in standby. - * - * If 'targetTLI' is not NULL, it's set to the current recovery target - * timeline. */ XLogRecPtr -GetStandbyFlushRecPtr(TimeLineID *targetTLI) +GetStandbyFlushRecPtr(void) { XLogRecPtr receivePtr; XLogRecPtr replayPtr; - receivePtr = GetWalRcvWriteRecPtr(NULL); - replayPtr = GetXLogReplayRecPtr(targetTLI); + receivePtr = GetWalRcvWriteRecPtr(NULL, NULL); + replayPtr = GetXLogReplayRecPtr(); if (XLByteLT(receivePtr, replayPtr)) return replayPtr; @@ -9611,7 +9610,10 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess, * archive and pg_xlog before failover. */ if (CheckForStandbyTrigger()) + { + ShutdownWalRcv(); return false; + } /* * If primary_conninfo is set, launch walreceiver to try to @@ -9626,8 +9628,14 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess, if (PrimaryConnInfo) { XLogRecPtr ptr = fetching_ckpt ? RedoStartLSN : RecPtr; - - RequestXLogStreaming(ptr, PrimaryConnInfo); + TimeLineID tli = tliOfPointInHistory(ptr, expectedTLEs); + + if (curFileTLI > 0 && tli < curFileTLI) + elog(ERROR, "according to history file, WAL location %X/%X belongs to timeline %u, but previous recovered WAL file came from timeline %u", + (uint32) (ptr >> 32), (uint32) ptr, + tli, curFileTLI); + curFileTLI = tli; + RequestXLogStreaming(curFileTLI, ptr, PrimaryConnInfo); } /* * Move to XLOG_FROM_STREAM state in either case. We'll get @@ -9653,10 +9661,10 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess, */ /* * Before we leave XLOG_FROM_STREAM state, make sure that - * walreceiver is not running, so that it won't overwrite - * any WAL that we restore from archive. + * walreceiver is not active, so that it won't overwrite + * WAL that we restore from archive. */ - if (WalRcvInProgress()) + if (WalRcvStreaming()) ShutdownWalRcv(); /* @@ -9749,7 +9757,7 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess, /* * Check if WAL receiver is still active. */ - if (!WalRcvInProgress()) + if (!WalRcvStreaming()) { lastSourceFailed = true; break; @@ -9772,8 +9780,8 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess, { XLogRecPtr latestChunkStart; - receivedUpto = GetWalRcvWriteRecPtr(&latestChunkStart); - if (XLByteLT(RecPtr, receivedUpto)) + receivedUpto = GetWalRcvWriteRecPtr(&latestChunkStart, &receiveTLI); + if (XLByteLT(RecPtr, receivedUpto) && receiveTLI == curFileTLI) { havedata = true; if (!XLByteLT(RecPtr, latestChunkStart)) @@ -9888,8 +9896,7 @@ emode_for_corrupt_record(int emode, XLogRecPtr RecPtr) /* * Check to see whether the user-specified trigger file exists and whether a - * promote request has arrived. If either condition holds, request postmaster - * to shut down walreceiver, wait for it to exit, and return true. + * promote request has arrived. If either condition holds, return true. */ static bool CheckForStandbyTrigger(void) @@ -9904,7 +9911,6 @@ CheckForStandbyTrigger(void) { ereport(LOG, (errmsg("received promote request"))); - ShutdownWalRcv(); ResetPromoteTriggered(); triggered = true; return true; @@ -9917,7 +9923,6 @@ CheckForStandbyTrigger(void) { ereport(LOG, (errmsg("trigger file found: %s", TriggerFile))); - ShutdownWalRcv(); unlink(TriggerFile); triggered = true; return true; |