Make pg_stat_wal_receiver consistent with the WAL receiver's shmem info
authorMichael Paquier <michael@paquier.xyz>
Sun, 17 May 2020 00:22:07 +0000 (09:22 +0900)
committerMichael Paquier <michael@paquier.xyz>
Sun, 17 May 2020 00:22:07 +0000 (09:22 +0900)
d140f2f3 has renamed receivedUpto to flushedUpto, and has added
writtenUpto to the WAL receiver's shared memory information, but
pg_stat_wal_receiver was not consistent with that.  This commit renames
received_lsn to flushed_lsn, and adds a new column called written_lsn.

Bump catalog version.

Author: Michael Paquier
Reviewed-by: Álvaro Herrera
Discussion: https://postgr.es/m/20200515090817.GA212736@paquier.xyz

doc/src/sgml/monitoring.sgml
src/backend/catalog/system_views.sql
src/backend/replication/walreceiver.c
src/include/catalog/catversion.h
src/include/catalog/pg_proc.dat
src/test/regress/expected/rules.out

index be31ac48b130d50037ed4313292aef98c23524c6..cd526128983e2dd6aa53ee8d7995909125bbc929 100644 (file)
@@ -2541,7 +2541,17 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i
 
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
-       <structfield>received_lsn</structfield> <type>pg_lsn</type>
+       <structfield>written_lsn</structfield> <type>pg_lsn</type>
+      </para>
+      <para>
+       Last write-ahead log location already received and written to disk,
+       but not flushed. This should not be used for data integrity checks.
+      </para></entry>
+     </row>
+
+     <row>
+      <entry role="catalog_table_entry"><para role="column_definition">
+       <structfield>flushed_lsn</structfield> <type>pg_lsn</type>
       </para>
       <para>
        Last write-ahead log location already received and flushed to
index 2bd5f5ea14a984beb05148944cc63378280f5bb2..56420bbc9d6f1bd6dd1ef7e312779f4412492540 100644 (file)
@@ -812,7 +812,8 @@ CREATE VIEW pg_stat_wal_receiver AS
             s.status,
             s.receive_start_lsn,
             s.receive_start_tli,
-            s.received_lsn,
+            s.written_lsn,
+            s.flushed_lsn,
             s.received_tli,
             s.last_msg_send_time,
             s.last_msg_receipt_time,
index d69fb90132d1d39ef16bd410bc38ceca8cd7afa9..d1ad75da87ae48027fa507cb499b5708fdacd907 100644 (file)
@@ -1348,7 +1348,8 @@ pg_stat_get_wal_receiver(PG_FUNCTION_ARGS)
        WalRcvState state;
        XLogRecPtr      receive_start_lsn;
        TimeLineID      receive_start_tli;
-       XLogRecPtr      received_lsn;
+       XLogRecPtr      written_lsn;
+       XLogRecPtr      flushed_lsn;
        TimeLineID      received_tli;
        TimestampTz last_send_time;
        TimestampTz last_receipt_time;
@@ -1366,7 +1367,8 @@ pg_stat_get_wal_receiver(PG_FUNCTION_ARGS)
        state = WalRcv->walRcvState;
        receive_start_lsn = WalRcv->receiveStart;
        receive_start_tli = WalRcv->receiveStartTLI;
-       received_lsn = WalRcv->flushedUpto;
+       written_lsn = pg_atomic_read_u64(&WalRcv->writtenUpto);
+       flushed_lsn = WalRcv->flushedUpto;
        received_tli = WalRcv->receivedTLI;
        last_send_time = WalRcv->lastMsgSendTime;
        last_receipt_time = WalRcv->lastMsgReceiptTime;
@@ -1413,43 +1415,47 @@ pg_stat_get_wal_receiver(PG_FUNCTION_ARGS)
                else
                        values[2] = LSNGetDatum(receive_start_lsn);
                values[3] = Int32GetDatum(receive_start_tli);
-               if (XLogRecPtrIsInvalid(received_lsn))
+               if (XLogRecPtrIsInvalid(written_lsn))
                        nulls[4] = true;
                else
-                       values[4] = LSNGetDatum(received_lsn);
-               values[5] = Int32GetDatum(received_tli);
+                       values[4] = LSNGetDatum(written_lsn);
+               if (XLogRecPtrIsInvalid(flushed_lsn))
+                       nulls[5] = true;
+               else
+                       values[5] = LSNGetDatum(flushed_lsn);
+               values[6] = Int32GetDatum(received_tli);
                if (last_send_time == 0)
-                       nulls[6] = true;
+                       nulls[7] = true;
                else
-                       values[6] = TimestampTzGetDatum(last_send_time);
+                       values[7] = TimestampTzGetDatum(last_send_time);
                if (last_receipt_time == 0)
-                       nulls[7] = true;
+                       nulls[8] = true;
                else
-                       values[7] = TimestampTzGetDatum(last_receipt_time);
+                       values[8] = TimestampTzGetDatum(last_receipt_time);
                if (XLogRecPtrIsInvalid(latest_end_lsn))
-                       nulls[8] = true;
+                       nulls[9] = true;
                else
-                       values[8] = LSNGetDatum(latest_end_lsn);
+                       values[9] = LSNGetDatum(latest_end_lsn);
                if (latest_end_time == 0)
-                       nulls[9] = true;
+                       nulls[10] = true;
                else
-                       values[9] = TimestampTzGetDatum(latest_end_time);
+                       values[10] = TimestampTzGetDatum(latest_end_time);
                if (*slotname == '\0')
-                       nulls[10] = true;
+                       nulls[11] = true;
                else
-                       values[10] = CStringGetTextDatum(slotname);
+                       values[11] = CStringGetTextDatum(slotname);
                if (*sender_host == '\0')
-                       nulls[11] = true;
+                       nulls[12] = true;
                else
-                       values[11] = CStringGetTextDatum(sender_host);
+                       values[12] = CStringGetTextDatum(sender_host);
                if (sender_port == 0)
-                       nulls[12] = true;
+                       nulls[13] = true;
                else
-                       values[12] = Int32GetDatum(sender_port);
+                       values[13] = Int32GetDatum(sender_port);
                if (*conninfo == '\0')
-                       nulls[13] = true;
+                       nulls[14] = true;
                else
-                       values[13] = CStringGetTextDatum(conninfo);
+                       values[14] = CStringGetTextDatum(conninfo);
        }
 
        /* Returns the record as Datum */
index 5a771e75912a4474d49cf0fd29a545cfca7345f6..62815342abb1f740dc90fd9d059ca2fd6f65ceb9 100644 (file)
@@ -53,6 +53,6 @@
  */
 
 /*                                                     yyyymmddN */
-#define CATALOG_VERSION_NO     202005121
+#define CATALOG_VERSION_NO     202005171
 
 #endif
index 9edae40ed895ad2594a33acbd0ac7cf8242abafc..61f2c2f5b4905eb77743b32d100f775496672584 100644 (file)
 { oid => '3317', descr => 'statistics: information about WAL receiver',
   proname => 'pg_stat_get_wal_receiver', proisstrict => 'f', provolatile => 's',
   proparallel => 'r', prorettype => 'record', proargtypes => '',
-  proallargtypes => '{int4,text,pg_lsn,int4,pg_lsn,int4,timestamptz,timestamptz,pg_lsn,timestamptz,text,text,int4,text}',
-  proargmodes => '{o,o,o,o,o,o,o,o,o,o,o,o,o,o}',
-  proargnames => '{pid,status,receive_start_lsn,receive_start_tli,received_lsn,received_tli,last_msg_send_time,last_msg_receipt_time,latest_end_lsn,latest_end_time,slot_name,sender_host,sender_port,conninfo}',
+  proallargtypes => '{int4,text,pg_lsn,int4,pg_lsn,pg_lsn,int4,timestamptz,timestamptz,pg_lsn,timestamptz,text,text,int4,text}',
+  proargmodes => '{o,o,o,o,o,o,o,o,o,o,o,o,o,o,o}',
+  proargnames => '{pid,status,receive_start_lsn,receive_start_tli,written_lsn,flushed_lsn,received_tli,last_msg_send_time,last_msg_receipt_time,latest_end_lsn,latest_end_time,slot_name,sender_host,sender_port,conninfo}',
   prosrc => 'pg_stat_get_wal_receiver' },
 { oid => '6118', descr => 'statistics: information about subscription',
   proname => 'pg_stat_get_subscription', proisstrict => 'f', provolatile => 's',
index 8876025aaa7cdda0b2fd3aada0c72731241bd555..b813e322153d27481f13d6df27a3892531e772b0 100644 (file)
@@ -2124,7 +2124,8 @@ pg_stat_wal_receiver| SELECT s.pid,
     s.status,
     s.receive_start_lsn,
     s.receive_start_tli,
-    s.received_lsn,
+    s.written_lsn,
+    s.flushed_lsn,
     s.received_tli,
     s.last_msg_send_time,
     s.last_msg_receipt_time,
@@ -2134,7 +2135,7 @@ pg_stat_wal_receiver| SELECT s.pid,
     s.sender_host,
     s.sender_port,
     s.conninfo
-   FROM pg_stat_get_wal_receiver() s(pid, status, receive_start_lsn, receive_start_tli, received_lsn, received_tli, last_msg_send_time, last_msg_receipt_time, latest_end_lsn, latest_end_time, slot_name, sender_host, sender_port, conninfo)
+   FROM pg_stat_get_wal_receiver() s(pid, status, receive_start_lsn, receive_start_tli, written_lsn, flushed_lsn, received_tli, last_msg_send_time, last_msg_receipt_time, latest_end_lsn, latest_end_time, slot_name, sender_host, sender_port, conninfo)
   WHERE (s.pid IS NOT NULL);
 pg_stat_xact_all_tables| SELECT c.oid AS relid,
     n.nspname AS schemaname,