aboutsummaryrefslogtreecommitdiff
path: root/src/backend/storage/ipc/sinvaladt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/storage/ipc/sinvaladt.c')
-rw-r--r--src/backend/storage/ipc/sinvaladt.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/backend/storage/ipc/sinvaladt.c b/src/backend/storage/ipc/sinvaladt.c
index 59310b708fb..21f0ff97579 100644
--- a/src/backend/storage/ipc/sinvaladt.c
+++ b/src/backend/storage/ipc/sinvaladt.c
@@ -757,6 +757,47 @@ SICleanupQueue(bool callerHasWriteLock, int minFree)
}
}
+/*
+ * SIResetAll
+ * Mark all active backends as "reset"
+ *
+ * Use this when we don't know what needs to be invalidated. It's a
+ * cluster-wide InvalidateSystemCaches(). This was a back-branch-only remedy
+ * to avoid a WAL format change.
+ *
+ * The implementation is like SICleanupQueue(false, MAXNUMMESSAGES + 1), with
+ * one addition. SICleanupQueue() assumes minFree << MAXNUMMESSAGES, so it
+ * assumes hasMessages==true for any backend it resets. We're resetting even
+ * fully-caught-up backends, so we set hasMessages.
+ */
+void
+SIResetAll(void)
+{
+ SISeg *segP = shmInvalBuffer;
+ int i;
+
+ LWLockAcquire(SInvalWriteLock, LW_EXCLUSIVE);
+ LWLockAcquire(SInvalReadLock, LW_EXCLUSIVE);
+
+ for (i = 0; i < segP->lastBackend; i++)
+ {
+ ProcState *stateP = &segP->procState[i];
+
+ if (stateP->procPid == 0 || stateP->sendOnly)
+ continue;
+
+ /* Consuming the reset will update "nextMsgNum" and "signaled". */
+ stateP->resetState = true;
+ stateP->hasMessages = true;
+ }
+
+ segP->minMsgNum = segP->maxMsgNum;
+ segP->nextThreshold = CLEANUP_MIN;
+
+ LWLockRelease(SInvalReadLock);
+ LWLockRelease(SInvalWriteLock);
+}
+
/*
* GetNextLocalTransactionId --- allocate a new LocalTransactionId