Re: Synchronizing slots from primary to standby

From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: shveta malik <shveta(dot)malik(at)gmail(dot)com>
Cc: "Drouvot, Bertrand" <bertranddrouvot(dot)pg(at)gmail(dot)com>, Bharath Rupireddy <bharath(dot)rupireddyforpostgres(at)gmail(dot)com>, Amit Kapila <amit(dot)kapila16(at)gmail(dot)com>, Peter Eisentraut <peter(dot)eisentraut(at)enterprisedb(dot)com>, Bruce Momjian <bruce(at)momjian(dot)us>, Ashutosh Sharma <ashu(dot)coek88(at)gmail(dot)com>, Andres Freund <andres(at)anarazel(dot)de>, pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>, Ajin Cherian <itsajin(at)gmail(dot)com>
Subject: Re: Synchronizing slots from primary to standby
Date: 2023-08-25 08:45:28
Message-ID: 20230825084528.eqklwfzizr4h7wbg@alvherre.pgsql
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Wait a minute ...

From bac0fbef8b203c530e5117b0b7cfee13cfab78b9 Mon Sep 17 00:00:00 2001
From: Bharath Rupireddy <bharath(dot)rupireddyforpostgres(at)gmail(dot)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.

--
Álvaro Herrera Breisgau, Deutschland — https://www.EnterpriseDB.com/
"No renuncies a nada. No te aferres a nada."

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Richard Guo 2023-08-25 08:48:35 Re: Support run-time partition pruning for hash join
Previous Message Peter Smith 2023-08-25 08:43:47 Re: [PoC] pg_upgrade: allow to upgrade publisher node