Re: Synchronizing slots from primary to standby

Поиск
Список
Период
Сортировка
От Alvaro Herrera
Тема Re: Synchronizing slots from primary to standby
Дата
Msg-id 20230825084528.eqklwfzizr4h7wbg@alvherre.pgsql
обсуждение исходный текст
Ответ на Re: Synchronizing slots from primary to standby  (shveta malik <shveta.malik@gmail.com>)
Ответы Re: Synchronizing slots from primary to standby  (shveta malik <shveta.malik@gmail.com>)
Список pgsql-hackers
Wait a minute ...

From bac0fbef8b203c530e5117b0b7cfee13cfab78b9 Mon Sep 17 00:00:00 2001
From: Bharath Rupireddy <bharath.rupireddyforpostgres@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.

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



В списке pgsql-hackers по дате отправления:

Предыдущее
От: Peter Smith
Дата:
Сообщение: Re: [PoC] pg_upgrade: allow to upgrade publisher node
Следующее
От: Richard Guo
Дата:
Сообщение: Re: Support run-time partition pruning for hash join