On Fri, Aug 25, 2023 at 2:15 PM Alvaro Herrera <alvhe...@alvh.no-ip.org> wrote:
>
> Wait a minute ...
>
> From bac0fbef8b203c530e5117b0b7cfee13cfab78b9 Mon Sep 17 00:00:00 2001
> From: Bharath Rupireddy <bharath.rupireddyforpostg...@gmail.com>
> Date: Sat, 22 Jul 2023 10:17:48 +0000
> Subject: [PATCH v13 1/2] Allow logical walsenders to wait for physical
>  standbys
>
> @@ -2498,6 +2500,13 @@ ReorderBufferProcessTXN(ReorderBuffer *rb, 
> ReorderBufferTXN *txn,
>                 }
>                 else
>                 {
> +                       /*
> +                        * Before we send out the last set of changes to 
> logical decoding
> +                        * output plugin, wait for specified streaming 
> replication standby
> +                        * servers (if any) to confirm receipt of WAL upto 
> commit_lsn.
> +                        */
> +                       WaitForStandbyLSN(commit_lsn);
>
> OK, so we call this new function frequently enough -- once per
> transaction, if I read this correctly?  So ...
>
> +void
> +WaitForStandbyLSN(XLogRecPtr wait_for_lsn)
> +{
>  ...
>
> +       /* "*" means all logical walsenders should wait for physical 
> standbys. */
> +       if (strcmp(synchronize_slot_names, "*") != 0)
> +       {
> +               bool    shouldwait = false;
> +
> +               rawname = pstrdup(synchronize_slot_names);
> +               SplitIdentifierString(rawname, ',', &elemlist);
> +
> +               foreach (l, elemlist)
> +               {
> +                       char *name = lfirst(l);
> +                       if (strcmp(name, 
> NameStr(MyReplicationSlot->data.name)) == 0)
> +                       {
> +                               shouldwait = true;
> +                               break;
> +                       }
> +               }
> +
> +               pfree(rawname);
> +               rawname = NULL;
> +               list_free(elemlist);
> +               elemlist = NIL;
> +
> +               if (!shouldwait)
> +                       return;
> +       }
> +
> +       rawname = pstrdup(standby_slot_names);
> +       SplitIdentifierString(rawname, ',', &elemlist);
>
> ... do we really want to be doing the GUC string parsing every time
> through it?  This sounds like it could be a bottleneck, or at least slow
> things down.  Maybe we should think about caching this somehow.
>

Yes, these parsed lists are now cached. Please see v15
(https://www.postgresql.org/message-id/CAJpy0uAuzbzvcjpnzFTiWuDBctnH-SDZC6AZabPX65x9GWBrjQ%40mail.gmail.com)

thanks
Shveta


Reply via email to