On 10.04.2025 05:25, Michael Paquier wrote:
Confirmed. One thing where it would be possible to make things work
is to introduce some persistency of the injection points, say these
are flushed at shutdown. We could do that without touching at the
backend code and only in the module injection_points, but perhaps this
thread is not enough to justify this extra complexity.
Agree, it should be discussed in another thread.
On 10.04.2025 05:25, Michael Paquier wrote:
What do you think?
Yes, patch for me looks ok, only one suggestion, I am not sure
but I am afraid we are loosing this.
if (WalSndCtl->sync_standbys_status & SYNC_STANDBY_INIT)
{
if ((WalSndCtl->sync_standbys_status &
SYNC_STANDBY_DEFINED) == 0 ||
lsn <= WalSndCtl->lsn[mode])
{
LWLockRelease(SyncRepLock);
return;
}
}
else if (!SyncStandbysDefined())
{
/*
* If we are here, the sync standby data has not been
initialized yet,
* so fall back to the best thing we can do: a check on
* SyncStandbysDefined() to see if the GUC is set or not.
*
* If the GUC has a value, we wait until the
checkpointer updates the
* status data because we cannot be sure yet if we
should wait or not.
* If the GUC has *no* value, we are sure that there is
no point to
* wait; this matters for example when initializing a
cluster, where
* we should never wait, and no sync standbys is the
default behavior.
*/
LWLockRelease(SyncRepLock);
return;
}
+ else if (lsn <= WalSndCtl->lsn[mode])
+ {
+ LWLockRelease(SyncRepLock);
+ return;
+ }
What do you think?
Best regards,
Maksim Melnikov