0004-Address-walwriter-and-checkpointer-by-proc-number.patch
text/x-patch
Filename: 0004-Address-walwriter-and-checkpointer-by-proc-number.patch
Type: text/x-patch
Part: 3
Message:
Re: Interrupts vs signals
Patch
Format: format-patch
Series: patch 0004
Subject: Address walwriter and checkpointer by proc number
| File | + | − |
|---|---|---|
| src/backend/access/transam/xlog.c | 9 | 2 |
| src/backend/postmaster/checkpointer.c | 12 | 5 |
| src/backend/postmaster/walwriter.c | 3 | 3 |
| src/backend/storage/lmgr/proc.c | 2 | 2 |
| src/include/storage/proc.h | 8 | 4 |
From 787761b6f959b018f0af68861191ca67a6185b1d Mon Sep 17 00:00:00 2001
From: Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date: Fri, 23 Aug 2024 17:25:15 +0300
Subject: [PATCH 04/11] Address walwriter and checkpointer by proc number
instead of pointing directly to their latch
---
src/backend/access/transam/xlog.c | 11 +++++++++--
src/backend/postmaster/checkpointer.c | 17 ++++++++++++-----
src/backend/postmaster/walwriter.c | 6 +++---
src/backend/storage/lmgr/proc.c | 4 ++--
src/include/storage/proc.h | 12 ++++++++----
5 files changed, 34 insertions(+), 16 deletions(-)
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 45a4a40eca..63a8ab5a29 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -2669,8 +2669,15 @@ XLogSetAsyncXactLSN(XLogRecPtr asyncXactLSN)
wakeup = true;
}
- if (wakeup && ProcGlobal->walwriterLatch)
- SetLatch(ProcGlobal->walwriterLatch);
+ if (wakeup)
+ {
+ volatile PROC_HDR *procglobal = ProcGlobal;
+ ProcNumber walwriterProc;
+
+ walwriterProc = procglobal->walwriterProc;
+ if (walwriterProc != INVALID_PROC_NUMBER)
+ SetLatch(&GetPGProcByNumber(walwriterProc)->procLatch);
+ }
}
/*
diff --git a/src/backend/postmaster/checkpointer.c b/src/backend/postmaster/checkpointer.c
index 199f008bcd..e556d7ecee 100644
--- a/src/backend/postmaster/checkpointer.c
+++ b/src/backend/postmaster/checkpointer.c
@@ -324,10 +324,10 @@ CheckpointerMain(char *startup_data, size_t startup_data_len)
UpdateSharedMemoryConfig();
/*
- * Advertise our latch that backends can use to wake us up while we're
- * sleeping.
+ * Advertise our proc number that backends can use to wake us up while
+ * we're sleeping.
*/
- ProcGlobal->checkpointerLatch = &MyProc->procLatch;
+ ProcGlobal->checkpointerProc = MyProcNumber;
/*
* Loop forever
@@ -1128,8 +1128,15 @@ ForwardSyncRequest(const FileTag *ftag, SyncRequestType type)
LWLockRelease(CheckpointerCommLock);
/* ... but not till after we release the lock */
- if (too_full && ProcGlobal->checkpointerLatch)
- SetLatch(ProcGlobal->checkpointerLatch);
+ if (too_full)
+ {
+ volatile PROC_HDR *procglobal = ProcGlobal;
+ ProcNumber checkpointerProc;
+
+ checkpointerProc = procglobal->checkpointerProc;
+ if (checkpointerProc != INVALID_PROC_NUMBER)
+ SetLatch(&GetPGProcByNumber(checkpointerProc)->procLatch);
+ }
return true;
}
diff --git a/src/backend/postmaster/walwriter.c b/src/backend/postmaster/walwriter.c
index 6e7918a78d..0c55d9fa59 100644
--- a/src/backend/postmaster/walwriter.c
+++ b/src/backend/postmaster/walwriter.c
@@ -210,10 +210,10 @@ WalWriterMain(char *startup_data, size_t startup_data_len)
SetWalWriterSleeping(false);
/*
- * Advertise our latch that backends can use to wake us up while we're
- * sleeping.
+ * Advertise our proc number that backends can use to wake us up while
+ * we're sleeping.
*/
- ProcGlobal->walwriterLatch = &MyProc->procLatch;
+ ProcGlobal->walwriterProc = MyProcNumber;
/*
* Loop forever
diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c
index ac66da8638..56c60704f5 100644
--- a/src/backend/storage/lmgr/proc.c
+++ b/src/backend/storage/lmgr/proc.c
@@ -177,8 +177,8 @@ InitProcGlobal(void)
dlist_init(&ProcGlobal->bgworkerFreeProcs);
dlist_init(&ProcGlobal->walsenderFreeProcs);
ProcGlobal->startupBufferPinWaitBufId = -1;
- ProcGlobal->walwriterLatch = NULL;
- ProcGlobal->checkpointerLatch = NULL;
+ ProcGlobal->walwriterProc = INVALID_PROC_NUMBER;
+ ProcGlobal->checkpointerProc = INVALID_PROC_NUMBER;
pg_atomic_init_u32(&ProcGlobal->procArrayGroupFirst, INVALID_PROC_NUMBER);
pg_atomic_init_u32(&ProcGlobal->clogGroupFirst, INVALID_PROC_NUMBER);
diff --git a/src/include/storage/proc.h b/src/include/storage/proc.h
index deeb06c9e0..95710e416f 100644
--- a/src/include/storage/proc.h
+++ b/src/include/storage/proc.h
@@ -413,10 +413,14 @@ typedef struct PROC_HDR
pg_atomic_uint32 procArrayGroupFirst;
/* First pgproc waiting for group transaction status update */
pg_atomic_uint32 clogGroupFirst;
- /* WALWriter process's latch */
- Latch *walwriterLatch;
- /* Checkpointer process's latch */
- Latch *checkpointerLatch;
+
+ /*
+ * Current slot numbers of some auxiliary processes. There can be only one
+ * of each of these running at a time.
+ */
+ ProcNumber walwriterProc;
+ ProcNumber checkpointerProc;
+
/* Current shared estimate of appropriate spins_per_delay value */
int spins_per_delay;
/* Buffer id of the buffer that Startup process waits for pin on, or -1 */
--
2.39.2