From 10e384581362cb1323a5638bbaaeb36600c73f27 Mon Sep 17 00:00:00 2001 From: Bharath Rupireddy Date: Wed, 10 May 2023 06:29:25 +0000 Subject: [PATCH v1] Use conditional variable to wake up walsenders --- src/backend/access/transam/xlogrecovery.c | 3 ++- src/backend/replication/walsender.c | 6 ++++++ src/include/replication/walsender_private.h | 3 +++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c index 188f6d6f85..547862058d 100644 --- a/src/backend/access/transam/xlogrecovery.c +++ b/src/backend/access/transam/xlogrecovery.c @@ -50,6 +50,7 @@ #include "postmaster/startup.h" #include "replication/slot.h" #include "replication/walreceiver.h" +#include "replication/walsender_private.h" #include "storage/fd.h" #include "storage/ipc.h" #include "storage/latch.h" @@ -1958,7 +1959,7 @@ ApplyWalRecord(XLogReaderState *xlogreader, XLogRecord *record, TimeLineID *repl * ------ */ if (AllowCascadeReplication()) - WalSndWakeup(switchedTLI, true); + ConditionVariableBroadcast(&WalSndCtl->cv); /* * If rm_redo called XLogRequestWalReceiverReply, then we wake up the diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index 45b8b3684f..177b0db844 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -3310,6 +3310,8 @@ WalSndShmemInit(void) SpinLockInit(&walsnd->mutex); } } + + ConditionVariableInit(&WalSndCtl->cv); } /* @@ -3368,9 +3370,13 @@ WalSndWait(uint32 socket_events, long timeout, uint32 wait_event) WaitEvent event; ModifyWaitEvent(FeBeWaitSet, FeBeWaitSetSocketPos, socket_events, NULL); + + ConditionVariablePrepareToSleep(&WalSndCtl->cv); if (WaitEventSetWait(FeBeWaitSet, timeout, &event, 1, wait_event) == 1 && (event.events & WL_POSTMASTER_DEATH)) proc_exit(1); + + ConditionVariableCancelSleep(); } /* diff --git a/src/include/replication/walsender_private.h b/src/include/replication/walsender_private.h index ff25aa70a8..c05f31e03c 100644 --- a/src/include/replication/walsender_private.h +++ b/src/include/replication/walsender_private.h @@ -17,6 +17,7 @@ #include "nodes/nodes.h" #include "nodes/replnodes.h" #include "replication/syncrep.h" +#include "storage/condition_variable.h" #include "storage/latch.h" #include "storage/shmem.h" #include "storage/spin.h" @@ -108,6 +109,8 @@ typedef struct */ bool sync_standbys_defined; + ConditionVariable cv; + WalSnd walsnds[FLEXIBLE_ARRAY_MEMBER]; } WalSndCtlData; -- 2.34.1