agora inbox for [email protected]help / color / mirror / Atom feed
[PATCH 2/7] Do not dereference varattrib_4b in VARSIZE_4B. 126+ messages / 2 participants [nested] [flat]
* [PATCH 2/7] Do not dereference varattrib_4b in VARSIZE_4B. @ 2026-03-11 13:53 Antonin Houska <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Antonin Houska @ 2026-03-11 13:53 UTC (permalink / raw) Since VARSIZE_ANY() may call VARSIZE_4B(), it's possible that the compiler (when invoked with -Warray-bounds) complains if the argument of VARSIZE_ANY() is actually smaller than what VARSIZE_4B() expects. This patch adjusts the VARSIZE_4B() macro so that it does not have to dereference the varattrib_4b structure. We assume that varlena value always starts with the length word. The problem does not exist in the tree at the moment since the current users of VARSIZE_ANY() pass a pointer to a dynamically allocated memory, so the compiler has no idea about the memory available. However, in an upcoming patch, it makes sense to pass a pointer to a local variable of "varlena" type. In such a case, the compiler warning might appear because sizeof(varlena) is lower than sizeof(varattrib_4b). --- src/include/varatt.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/include/varatt.h b/src/include/varatt.h index 000bdf33b92..31063e5d4f1 100644 --- a/src/include/varatt.h +++ b/src/include/varatt.h @@ -207,7 +207,7 @@ typedef struct /* VARSIZE_4B() should only be used on known-aligned data */ #define VARSIZE_4B(PTR) \ - (((const varattrib_4b *) (PTR))->va_4byte.va_header & 0x3FFFFFFF) + (*((const uint32 *) (PTR)) & 0x3FFFFFFF) #define VARSIZE_1B(PTR) \ (((const varattrib_1b *) (PTR))->va_header & 0x7F) #define VARTAG_1B_E(PTR) \ @@ -240,7 +240,7 @@ typedef struct /* VARSIZE_4B() should only be used on known-aligned data */ #define VARSIZE_4B(PTR) \ - ((((const varattrib_4b *) (PTR))->va_4byte.va_header >> 2) & 0x3FFFFFFF) + ((*((const uint32 *) (PTR)) >> 2) & 0x3FFFFFFF) #define VARSIZE_1B(PTR) \ ((((const varattrib_1b *) (PTR))->va_header >> 1) & 0x7F) #define VARTAG_1B_E(PTR) \ -- 2.47.3 --=-=-= Content-Type: text/plain Content-Disposition: attachment; filename=v42-0003-Add-CONCURRENTLY-option-to-REPACK-command.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
* [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic @ 2026-07-09 18:57 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 126+ messages in thread From: Nathan Bossart @ 2026-07-09 18:57 UTC (permalink / raw) --- src/backend/access/transam/parallel.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 89e9d224eec..57f5f26bbec 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -37,7 +37,6 @@ #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" #include "utils/guc.h" @@ -101,11 +100,8 @@ typedef struct FixedParallelState TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; - /* Mutex protects remaining fields. */ - slock_t mutex; - /* Maximum XactLastRecEnd of any worker. */ - XLogRecPtr last_xlog_end; + pg_atomic_uint64 last_xlog_end; } FixedParallelState; /* @@ -358,8 +354,7 @@ InitializeParallelDSM(ParallelContext *pcxt) fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); - SpinLockInit(&fps->mutex); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_init_u64(&fps->last_xlog_end, InvalidXLogRecPtr); shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps); /* We can skip the rest of this if we're not budgeting for any workers. */ @@ -532,7 +527,7 @@ ReinitializeParallelDSM(ParallelContext *pcxt) /* Reset a few bits of fixed parallel state to a clean state. */ fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - fps->last_xlog_end = InvalidXLogRecPtr; + pg_atomic_write_u64(&fps->last_xlog_end, InvalidXLogRecPtr); /* Recreate error queues (if they exist). */ if (pcxt->nworkers > 0) @@ -900,10 +895,12 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) if (pcxt->toc != NULL) { FixedParallelState *fps; + XLogRecPtr last_xlog_end; fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false); - if (fps->last_xlog_end > XactLastRecEnd) - XactLastRecEnd = fps->last_xlog_end; + last_xlog_end = pg_atomic_read_u64(&fps->last_xlog_end); + if (last_xlog_end > XactLastRecEnd) + XactLastRecEnd = last_xlog_end; } } @@ -1596,10 +1593,7 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) FixedParallelState *fps = MyFixedParallelState; Assert(fps != NULL); - SpinLockAcquire(&fps->mutex); - if (fps->last_xlog_end < last_xlog_end) - fps->last_xlog_end = last_xlog_end; - SpinLockRelease(&fps->mutex); + pg_atomic_monotonic_advance_u64(&fps->last_xlog_end, last_xlog_end); } /* -- 2.50.1 (Apple Git-155) --Ot5x3ffkWEuxilWO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=v1-0004-convert-PROC_HDR-startupBufferPinWaitBufId-to-an-.patch ^ permalink raw reply [nested|flat] 126+ messages in thread
end of thread, other threads:[~2026-07-09 18:57 UTC | newest] Thread overview: 126+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2026-03-11 13:53 [PATCH 2/7] Do not dereference varattrib_4b in VARSIZE_4B. Antonin Houska <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]> 2026-07-09 18:57 [PATCH v1 3/8] convert FixedParallelState->last_xlog_end to an atomic Nathan Bossart <[email protected]>
This inbox is served by agora; see mirroring instructions for how to clone and mirror all data and code used for this inbox