On Fri, 2023-03-31 at 02:50 -0700, Jeff Davis wrote: > But if the ConditionVariableEventSleep() API is added, then I think > we > should change the non-recovery case to use a CV as well for > consistency, and it would avoid the need for WalSndWakeup().
It seems like what we ultimately want is for WalSndWakeup() to selectively wake up physical and/or logical walsenders depending on the caller. For instance: WalSndWakeup(bool physical, bool logical) The callers: * On promotion, StartupXLog would call: - WalSndWakeup(true, true) * XLogFlush/XLogBackgroundFlush/XLogWalRcvFlush would call: - WalSndWakeup(true, !RecoveryInProgress()) * ApplyWalRecord would call: - WalSndWakeup(switchedTLI, switchedTLI || RecoveryInProgress()) There seem to be two approaches to making that work: 1. Use two ConditionVariables, and WalSndWakeup would broadcast to one or both depending on its arguments. 2. Have a "replicaiton_kind" variable in WalSnd (either set based on MyDatabaseId==InvalidOid, or set at START_REPLICATION time) to indicate whether it's a physical or logical walsender. WalSndWakeup would wake up the right walsenders based on its arguments. #2 seems simpler at least for now. Would that work? Regards, Jeff Davis