diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml
index be31ac48b13..cd526128983 100644
--- a/doc/src/sgml/monitoring.sgml
+++ b/doc/src/sgml/monitoring.sgml
@@ -2541,7 +2541,17 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i
- received_lsn pg_lsn
+ written_lsn pg_lsn
+
+
+ Last write-ahead log location already received and written to disk,
+ but not flushed. This should not be used for data integrity checks.
+
+
+
+
+
+ flushed_lsn pg_lsn
Last write-ahead log location already received and flushed to
diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql
index 2bd5f5ea14a..56420bbc9d6 100644
--- a/src/backend/catalog/system_views.sql
+++ b/src/backend/catalog/system_views.sql
@@ -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,
diff --git a/src/backend/replication/walreceiver.c b/src/backend/replication/walreceiver.c
index d69fb90132d..d1ad75da87a 100644
--- a/src/backend/replication/walreceiver.c
+++ b/src/backend/replication/walreceiver.c
@@ -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);
- if (last_send_time == 0)
- nulls[6] = true;
+ values[4] = LSNGetDatum(written_lsn);
+ if (XLogRecPtrIsInvalid(flushed_lsn))
+ nulls[5] = true;
else
- values[6] = TimestampTzGetDatum(last_send_time);
- if (last_receipt_time == 0)
+ values[5] = LSNGetDatum(flushed_lsn);
+ values[6] = Int32GetDatum(received_tli);
+ if (last_send_time == 0)
nulls[7] = true;
else
- values[7] = TimestampTzGetDatum(last_receipt_time);
- if (XLogRecPtrIsInvalid(latest_end_lsn))
+ values[7] = TimestampTzGetDatum(last_send_time);
+ if (last_receipt_time == 0)
nulls[8] = true;
else
- values[8] = LSNGetDatum(latest_end_lsn);
- if (latest_end_time == 0)
+ values[8] = TimestampTzGetDatum(last_receipt_time);
+ if (XLogRecPtrIsInvalid(latest_end_lsn))
nulls[9] = true;
else
- values[9] = TimestampTzGetDatum(latest_end_time);
- if (*slotname == '\0')
+ values[9] = LSNGetDatum(latest_end_lsn);
+ if (latest_end_time == 0)
nulls[10] = true;
else
- values[10] = CStringGetTextDatum(slotname);
- if (*sender_host == '\0')
+ values[10] = TimestampTzGetDatum(latest_end_time);
+ if (*slotname == '\0')
nulls[11] = true;
else
- values[11] = CStringGetTextDatum(sender_host);
- if (sender_port == 0)
+ values[11] = CStringGetTextDatum(slotname);
+ if (*sender_host == '\0')
nulls[12] = true;
else
- values[12] = Int32GetDatum(sender_port);
- if (*conninfo == '\0')
+ values[12] = CStringGetTextDatum(sender_host);
+ if (sender_port == 0)
nulls[13] = true;
else
- values[13] = CStringGetTextDatum(conninfo);
+ values[13] = Int32GetDatum(sender_port);
+ if (*conninfo == '\0')
+ nulls[14] = true;
+ else
+ values[14] = CStringGetTextDatum(conninfo);
}
/* Returns the record as Datum */
diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h
index 5a771e75912..62815342abb 100644
--- a/src/include/catalog/catversion.h
+++ b/src/include/catalog/catversion.h
@@ -53,6 +53,6 @@
*/
/* yyyymmddN */
-#define CATALOG_VERSION_NO 202005121
+#define CATALOG_VERSION_NO 202005171
#endif
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index 9edae40ed89..61f2c2f5b49 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -5244,9 +5244,9 @@
{ 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',
diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out
index 8876025aaa7..b813e322153 100644
--- a/src/test/regress/expected/rules.out
+++ b/src/test/regress/expected/rules.out
@@ -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,