Re: Minimal logical decoding on standbys - Mailing list pgsql-hackers

From Jeff Davis
Subject Re: Minimal logical decoding on standbys
Date
Msg-id 6437cee668bb3e1157fe4a69ea0fa3377c1abaab.camel@j-davis.com
Whole thread Raw
In response to Re: Minimal logical decoding on standbys  (Jeff Davis <pgsql@j-davis.com>)
Responses Re: Minimal logical decoding on standbys  (Amit Kapila <amit.kapila16@gmail.com>)
List pgsql-hackers
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




pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: Infinite Interval
Next
From: Jeff Davis
Date:
Subject: Re: Minimal logical decoding on standbys