diff options
author | Robert Haas | 2021-10-29 20:03:16 +0000 |
---|---|---|
committer | Robert Haas | 2021-10-29 21:05:21 +0000 |
commit | c00f605ab03aec7df21eff0f098751837f2ba935 (patch) | |
tree | f395f1959a987ccb242114cae0f1b5e2e13ec19c | |
parent | 082b1b87a32b4690644014bcb43a492551eae01e (diff) |
Add GetWALInsertionTimeLine(); also return it via GetFlushRecPtr().
Having lots of code that relies on the ThisTimeLineID global variable
is problematic, but to have any chance of fixing that, we must provide
another way for code outside xlog.c to get the relevant value. This
commit adds infrastructure for doing that on a system that is in
normal running, but doesn't do anything about the case where the
system is in recovery.
Here, we provide two different methods for getting the timeline of
a system in normal running. First, a number of the places where we
call GetFlushRecPtr() need the timeline as well, so provide it via
an out parameter. Second, for other places that just need the
timeline and not any LSN, add a GetWALInsertionTimeLine() function.
Future commits will take care of actually removing references to
ThisTimeLineID; this commit is just infrastructure.
-rw-r--r-- | src/backend/access/transam/xlog.c | 22 | ||||
-rw-r--r-- | src/backend/access/transam/xlogfuncs.c | 2 | ||||
-rw-r--r-- | src/backend/access/transam/xlogutils.c | 6 | ||||
-rw-r--r-- | src/backend/replication/logical/logicalfuncs.c | 2 | ||||
-rw-r--r-- | src/backend/replication/logical/worker.c | 2 | ||||
-rw-r--r-- | src/backend/replication/slotfuncs.c | 2 | ||||
-rw-r--r-- | src/backend/replication/walsender.c | 14 | ||||
-rw-r--r-- | src/include/access/xlog.h | 3 |
8 files changed, 35 insertions, 18 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index f547efd294..6070e0f3b3 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -8695,16 +8695,36 @@ GetInsertRecPtr(void) * position known to be fsync'd to disk. */ XLogRecPtr -GetFlushRecPtr(void) +GetFlushRecPtr(TimeLineID *insertTLI) { SpinLockAcquire(&XLogCtl->info_lck); LogwrtResult = XLogCtl->LogwrtResult; SpinLockRelease(&XLogCtl->info_lck); + /* + * If we're writing and flushing WAL, the time line can't be changing, + * so no lock is required. + */ + if (insertTLI) + *insertTLI = XLogCtl->ThisTimeLineID; + return LogwrtResult.Flush; } /* + * GetWALInsertionTimeLine -- Returns the current timeline of a system that + * is not in recovery. + */ +TimeLineID +GetWALInsertionTimeLine(void) +{ + Assert(XLogCtl->SharedRecoveryState == RECOVERY_STATE_DONE); + + /* Since the value can't be changing, no lock is required. */ + return XLogCtl->ThisTimeLineID; +} + +/* * GetLastImportantRecPtr -- Returns the LSN of the last important record * inserted. All records not explicitly marked as unimportant are considered * important. diff --git a/src/backend/access/transam/xlogfuncs.c b/src/backend/access/transam/xlogfuncs.c index b98deb72ec..5bebcc50dd 100644 --- a/src/backend/access/transam/xlogfuncs.c +++ b/src/backend/access/transam/xlogfuncs.c @@ -382,7 +382,7 @@ pg_current_wal_flush_lsn(PG_FUNCTION_ARGS) errmsg("recovery is in progress"), errhint("WAL control functions cannot be executed during recovery."))); - current_recptr = GetFlushRecPtr(); + current_recptr = GetFlushRecPtr(NULL); PG_RETURN_LSN(current_recptr); } diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index 88a1bfd939..c40500a6f2 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -862,13 +862,9 @@ read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, /* * Determine the limit of xlog we can currently read to, and what the * most recent timeline is. - * - * RecoveryInProgress() will update ThisTimeLineID when it first - * notices recovery finishes, so we only have to maintain it for the - * local process until recovery ends. */ if (!RecoveryInProgress()) - read_upto = GetFlushRecPtr(); + read_upto = GetFlushRecPtr(&ThisTimeLineID); else read_upto = GetXLogReplayRecPtr(&ThisTimeLineID); tli = ThisTimeLineID; diff --git a/src/backend/replication/logical/logicalfuncs.c b/src/backend/replication/logical/logicalfuncs.c index 5a7fae4a87..2609a0a710 100644 --- a/src/backend/replication/logical/logicalfuncs.c +++ b/src/backend/replication/logical/logicalfuncs.c @@ -211,7 +211,7 @@ pg_logical_slot_get_changes_guts(FunctionCallInfo fcinfo, bool confirm, bool bin * Compute the current end-of-wal. */ if (!RecoveryInProgress()) - end_of_wal = GetFlushRecPtr(); + end_of_wal = GetFlushRecPtr(NULL); else end_of_wal = GetXLogReplayRecPtr(NULL); diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index 8d96c926b4..0bd5d0ee5e 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -2435,7 +2435,7 @@ get_flush_position(XLogRecPtr *write, XLogRecPtr *flush, bool *have_pending_txes) { dlist_mutable_iter iter; - XLogRecPtr local_flush = GetFlushRecPtr(); + XLogRecPtr local_flush = GetFlushRecPtr(NULL); *write = InvalidXLogRecPtr; *flush = InvalidXLogRecPtr; diff --git a/src/backend/replication/slotfuncs.c b/src/backend/replication/slotfuncs.c index 877a006d50..a80298ba53 100644 --- a/src/backend/replication/slotfuncs.c +++ b/src/backend/replication/slotfuncs.c @@ -625,7 +625,7 @@ pg_replication_slot_advance(PG_FUNCTION_ARGS) * target position accordingly. */ if (!RecoveryInProgress()) - moveto = Min(moveto, GetFlushRecPtr()); + moveto = Min(moveto, GetFlushRecPtr(NULL)); else moveto = Min(moveto, GetXLogReplayRecPtr(NULL)); diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index d9ab6d6de2..d09bffaa9d 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -402,7 +402,7 @@ IdentifySystem(void) logptr = GetStandbyFlushRecPtr(); } else - logptr = GetFlushRecPtr(); + logptr = GetFlushRecPtr(&ThisTimeLineID); snprintf(xloc, sizeof(xloc), "%X/%X", LSN_FORMAT_ARGS(logptr)); @@ -720,7 +720,7 @@ StartReplication(StartReplicationCmd *cmd) FlushPtr = GetStandbyFlushRecPtr(); } else - FlushPtr = GetFlushRecPtr(); + FlushPtr = GetFlushRecPtr(&ThisTimeLineID); if (cmd->timeline != 0) { @@ -1487,7 +1487,7 @@ WalSndWaitForWal(XLogRecPtr loc) /* Get a more recent flush pointer. */ if (!RecoveryInProgress()) - RecentFlushPtr = GetFlushRecPtr(); + RecentFlushPtr = GetFlushRecPtr(NULL); else RecentFlushPtr = GetXLogReplayRecPtr(NULL); @@ -1521,7 +1521,7 @@ WalSndWaitForWal(XLogRecPtr loc) /* Update our idea of the currently flushed position. */ if (!RecoveryInProgress()) - RecentFlushPtr = GetFlushRecPtr(); + RecentFlushPtr = GetFlushRecPtr(NULL); else RecentFlushPtr = GetXLogReplayRecPtr(NULL); @@ -2756,7 +2756,7 @@ XLogSendPhysical(void) * primary: if the primary subsequently crashes and restarts, standbys * must not have applied any WAL that got lost on the primary. */ - SendRqstPtr = GetFlushRecPtr(); + SendRqstPtr = GetFlushRecPtr(NULL); } /* @@ -2997,9 +2997,9 @@ XLogSendLogical(void) * we only need to update flushPtr if EndRecPtr is past it. */ if (flushPtr == InvalidXLogRecPtr) - flushPtr = GetFlushRecPtr(); + flushPtr = GetFlushRecPtr(NULL); else if (logical_decoding_ctx->reader->EndRecPtr >= flushPtr) - flushPtr = GetFlushRecPtr(); + flushPtr = GetFlushRecPtr(NULL); /* If EndRecPtr is still past our flushPtr, it means we caught up. */ if (logical_decoding_ctx->reader->EndRecPtr >= flushPtr) diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h index 5e2c94a05f..72417f44b6 100644 --- a/src/include/access/xlog.h +++ b/src/include/access/xlog.h @@ -312,7 +312,8 @@ extern void UpdateFullPageWrites(void); extern void GetFullPageWriteInfo(XLogRecPtr *RedoRecPtr_p, bool *doPageWrites_p); extern XLogRecPtr GetRedoRecPtr(void); extern XLogRecPtr GetInsertRecPtr(void); -extern XLogRecPtr GetFlushRecPtr(void); +extern XLogRecPtr GetFlushRecPtr(TimeLineID *insertTLI); +extern TimeLineID GetWALInsertionTimeLine(void); extern XLogRecPtr GetLastImportantRecPtr(void); extern void RemovePromoteSignalFiles(void); |