Add pg_stat_wal statistics view.
authorFujii Masao <[email protected]>
Fri, 2 Oct 2020 01:17:11 +0000 (10:17 +0900)
committerFujii Masao <[email protected]>
Fri, 2 Oct 2020 01:17:11 +0000 (10:17 +0900)
This view shows the statistics about WAL activity. Currently it has only
two columns: wal_buffers_full and stats_reset. wal_buffers_full column
indicates the number of times WAL data was written to the disk because
WAL buffers got full. This information is useful when tuning wal_buffers.
stats_reset column indicates the time at which these statistics were
last reset.

pg_stat_wal view is also the basic infrastructure to expose other
various statistics about WAL activity later.

Bump PGSTAT_FILE_FORMAT_ID due to the change in pgstat format.

Bump catalog version.

Author: Masahiro Ikeda
Reviewed-by: Takayuki Tsunakawa, Kyotaro Horiguchi, Amit Kapila, Fujii Masao
Discussion: https://postgr.es/m/188bd3f2d2233cf97753b5ced02bb050@oss.nttdata.com

13 files changed:
doc/src/sgml/monitoring.sgml
src/backend/access/transam/xlog.c
src/backend/catalog/system_views.sql
src/backend/postmaster/checkpointer.c
src/backend/postmaster/pgstat.c
src/backend/utils/adt/pgstatfuncs.c
src/include/catalog/catversion.h
src/include/catalog/pg_proc.dat
src/include/pgstat.h
src/test/regress/expected/rules.out
src/test/regress/expected/sysviews.out
src/test/regress/sql/sysviews.sql
src/tools/pgindent/typedefs.list

index 4e0193a967cb2040d6d1b50d4abdc86b72b741ba..495018009a2a3eab9f037fdd9b4392457b2e7ac6 100644 (file)
@@ -424,6 +424,14 @@ postgres   27093  0.0  0.0  30096  2752 ?        Ss   11:34   0:00 postgres: ser
      </entry>
      </row>
 
+     <row>
+      <entry><structname>pg_stat_wal</structname><indexterm><primary>pg_stat_wal</primary></indexterm></entry>
+      <entry>One row only, showing statistics about WAL activity. See
+       <link linkend="monitoring-pg-stat-wal-view">
+       <structname>pg_stat_wal</structname></link> for details.
+      </entry>
+     </row>
+
      <row>
       <entry><structname>pg_stat_database</structname><indexterm><primary>pg_stat_database</primary></indexterm></entry>
       <entry>One row per database, showing database-wide statistics. See
@@ -3280,6 +3288,56 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i
 
  </sect2>
 
+ <sect2 id="monitoring-pg-stat-wal-view">
+   <title><structname>pg_stat_wal</structname></title>
+
+  <indexterm>
+   <primary>pg_stat_wal</primary>
+  </indexterm>
+
+  <para>
+   The <structname>pg_stat_wal</structname> view will always have a
+   single row, containing data about WAL activity of the cluster.
+  </para>
+
+  <table id="pg-stat-wal-view" xreflabel="pg_stat_wal">
+   <title><structname>pg_stat_wal</structname> View</title>
+   <tgroup cols="1">
+    <thead>
+     <row>
+      <entry role="catalog_table_entry"><para role="column_definition">
+       Column Type
+      </para>
+      <para>
+       Description
+      </para></entry>
+     </row>
+    </thead>
+
+    <tbody>
+     <row>
+      <entry role="catalog_table_entry"><para role="column_definition">
+       <structfield>wal_buffers_full</structfield> <type>bigint</type>
+      </para>
+      <para>
+       Number of times WAL data was written to the disk because WAL buffers got full
+      </para></entry>
+     </row>
+
+     <row>
+      <entry role="catalog_table_entry"><para role="column_definition">
+       <structfield>stats_reset</structfield> <type>timestamp with time zone</type>
+      </para>
+      <para>
+       Time at which these statistics were last reset
+      </para></entry>
+     </row>
+     </tbody>
+   </tgroup>
+  </table>
+
+</sect2>
+
  <sect2 id="monitoring-pg-stat-database-view">
   <title><structname>pg_stat_database</structname></title>
 
@@ -4668,8 +4726,9 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i
         argument.  The argument can be <literal>bgwriter</literal> to reset
         all the counters shown in
         the <structname>pg_stat_bgwriter</structname>
-        view, or <literal>archiver</literal> to reset all the counters shown in
-        the <structname>pg_stat_archiver</structname> view.
+        view, <literal>archiver</literal> to reset all the counters shown in
+        the <structname>pg_stat_archiver</structname> view or <literal>wal</literal>
+        to reset all the counters shown in the <structname>pg_stat_wal</structname> view.
        </para>
        <para>
         This function is restricted to superusers by default, but other users
index 03c089b9a966aede4b595a312919880ab7009cb2..8f11b1b9de18cf1fc691965b51a205f12462199f 100644 (file)
@@ -2196,6 +2196,7 @@ AdvanceXLInsertBuffer(XLogRecPtr upto, bool opportunistic)
                    WriteRqst.Flush = 0;
                    XLogWrite(WriteRqst, false);
                    LWLockRelease(WALWriteLock);
+                   WalStats.m_wal_buffers_full++;
                    TRACE_POSTGRESQL_WAL_BUFFER_WRITE_DIRTY_DONE();
                }
                /* Re-acquire WALBufMappingLock and retry */
index ed4f3f142d87d4ffc905f13ab8e3f967c22f4d7f..923c2e2be1f60d76f985c273f75672bbe19c1f17 100644 (file)
@@ -979,6 +979,12 @@ CREATE VIEW pg_stat_bgwriter AS
         pg_stat_get_buf_alloc() AS buffers_alloc,
         pg_stat_get_bgwriter_stat_reset_time() AS stats_reset;
 
+CREATE VIEW pg_stat_wal AS
+    SELECT
+        w.wal_buffers_full,
+        w.stats_reset
+    FROM pg_stat_get_wal() w;
+
 CREATE VIEW pg_stat_progress_analyze AS
     SELECT
         S.pid AS pid, S.datid AS datid, D.datname AS datname,
index 3e7dcd4f764da93f08718da4f9c914106c22e13e..429c8010ef449627f98d0be624adcc35df8aee1e 100644 (file)
@@ -504,6 +504,9 @@ CheckpointerMain(void)
         */
        pgstat_send_bgwriter();
 
+       /* Send WAL statistics to the stats collector. */
+       pgstat_send_wal();
+
        /*
         * If any checkpoint flags have been set, redo the loop to handle the
         * checkpoint without sleeping.
index e6be2b7836a4aebdc20046736dff47aa4ecebfd2..5294c7854942ae2f71c39fdc1e93ee6088206bd0 100644 (file)
@@ -135,11 +135,12 @@ char     *pgstat_stat_filename = NULL;
 char      *pgstat_stat_tmpname = NULL;
 
 /*
- * BgWriter global statistics counters (unused in other processes).
- * Stored directly in a stats message structure so it can be sent
- * without needing to copy things around.  We assume this inits to zeroes.
+ * BgWriter and WAL global statistics counters.
+ * Stored directly in a stats message structure so they can be sent
+ * without needing to copy things around.  We assume these init to zeroes.
  */
 PgStat_MsgBgWriter BgWriterStats;
+PgStat_MsgWal WalStats;
 
 /*
  * List of SLRU names that we keep stats for.  There is no central registry of
@@ -281,6 +282,7 @@ static int  localNumBackends = 0;
  */
 static PgStat_ArchiverStats archiverStats;
 static PgStat_GlobalStats globalStats;
+static PgStat_WalStats walStats;
 static PgStat_SLRUStats slruStats[SLRU_NUM_ELEMENTS];
 
 /*
@@ -353,6 +355,7 @@ static void pgstat_recv_vacuum(PgStat_MsgVacuum *msg, int len);
 static void pgstat_recv_analyze(PgStat_MsgAnalyze *msg, int len);
 static void pgstat_recv_archiver(PgStat_MsgArchiver *msg, int len);
 static void pgstat_recv_bgwriter(PgStat_MsgBgWriter *msg, int len);
+static void pgstat_recv_wal(PgStat_MsgWal *msg, int len);
 static void pgstat_recv_slru(PgStat_MsgSLRU *msg, int len);
 static void pgstat_recv_funcstat(PgStat_MsgFuncstat *msg, int len);
 static void pgstat_recv_funcpurge(PgStat_MsgFuncpurge *msg, int len);
@@ -938,6 +941,9 @@ pgstat_report_stat(bool force)
    /* Now, send function statistics */
    pgstat_send_funcstats();
 
+   /* Send WAL statistics */
+   pgstat_send_wal();
+
    /* Finally send SLRU statistics */
    pgstat_send_slru();
 }
@@ -1370,11 +1376,13 @@ pgstat_reset_shared_counters(const char *target)
        msg.m_resettarget = RESET_ARCHIVER;
    else if (strcmp(target, "bgwriter") == 0)
        msg.m_resettarget = RESET_BGWRITER;
+   else if (strcmp(target, "wal") == 0)
+       msg.m_resettarget = RESET_WAL;
    else
        ereport(ERROR,
                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                 errmsg("unrecognized reset target: \"%s\"", target),
-                errhint("Target must be \"archiver\" or \"bgwriter\".")));
+                errhint("Target must be \"archiver\", \"bgwriter\" or \"wal\".")));
 
    pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSHAREDCOUNTER);
    pgstat_send(&msg, sizeof(msg));
@@ -2674,6 +2682,21 @@ pgstat_fetch_global(void)
    return &globalStats;
 }
 
+/*
+ * ---------
+ * pgstat_fetch_stat_wal() -
+ *
+ * Support function for the SQL-callable pgstat* functions. Returns
+ * a pointer to the WAL statistics struct.
+ * ---------
+ */
+PgStat_WalStats *
+pgstat_fetch_stat_wal(void)
+{
+   backend_read_statsfile();
+
+   return &walStats;
+}
 
 /*
  * ---------
@@ -4419,6 +4442,38 @@ pgstat_send_bgwriter(void)
    MemSet(&BgWriterStats, 0, sizeof(BgWriterStats));
 }
 
+/* ----------
+ * pgstat_send_wal() -
+ *
+ *     Send WAL statistics to the collector
+ * ----------
+ */
+void
+pgstat_send_wal(void)
+{
+   /* We assume this initializes to zeroes */
+   static const PgStat_MsgWal all_zeroes;
+
+   /*
+    * This function can be called even if nothing at all has happened. In
+    * this case, avoid sending a completely empty message to the stats
+    * collector.
+    */
+   if (memcmp(&WalStats, &all_zeroes, sizeof(PgStat_MsgWal)) == 0)
+       return;
+
+   /*
+    * Prepare and send the message
+    */
+   pgstat_setheader(&WalStats.m_hdr, PGSTAT_MTYPE_WAL);
+   pgstat_send(&WalStats, sizeof(WalStats));
+
+   /*
+    * Clear out the statistics buffer, so it can be re-used.
+    */
+   MemSet(&WalStats, 0, sizeof(WalStats));
+}
+
 /* ----------
  * pgstat_send_slru() -
  *
@@ -4658,6 +4713,10 @@ PgstatCollectorMain(int argc, char *argv[])
                    pgstat_recv_bgwriter(&msg.msg_bgwriter, len);
                    break;
 
+               case PGSTAT_MTYPE_WAL:
+                   pgstat_recv_wal(&msg.msg_wal, len);
+                   break;
+
                case PGSTAT_MTYPE_SLRU:
                    pgstat_recv_slru(&msg.msg_slru, len);
                    break;
@@ -4927,6 +4986,12 @@ pgstat_write_statsfiles(bool permanent, bool allDbs)
    rc = fwrite(&archiverStats, sizeof(archiverStats), 1, fpout);
    (void) rc;                  /* we'll check for error with ferror */
 
+   /*
+    * Write WAL stats struct
+    */
+   rc = fwrite(&walStats, sizeof(walStats), 1, fpout);
+   (void) rc;                  /* we'll check for error with ferror */
+
    /*
     * Write SLRU stats struct
     */
@@ -5186,11 +5251,12 @@ pgstat_read_statsfiles(Oid onlydb, bool permanent, bool deep)
                         HASH_ELEM | HASH_BLOBS | HASH_CONTEXT);
 
    /*
-    * Clear out global and archiver statistics so they start from zero in
-    * case we can't load an existing statsfile.
+    * Clear out global, archiver, WAL and SLRU statistics so they start from
+    * zero in case we can't load an existing statsfile.
     */
    memset(&globalStats, 0, sizeof(globalStats));
    memset(&archiverStats, 0, sizeof(archiverStats));
+   memset(&walStats, 0, sizeof(walStats));
    memset(&slruStats, 0, sizeof(slruStats));
 
    /*
@@ -5199,6 +5265,7 @@ pgstat_read_statsfiles(Oid onlydb, bool permanent, bool deep)
     */
    globalStats.stat_reset_timestamp = GetCurrentTimestamp();
    archiverStats.stat_reset_timestamp = globalStats.stat_reset_timestamp;
+   walStats.stat_reset_timestamp = globalStats.stat_reset_timestamp;
 
    /*
     * Set the same reset timestamp for all SLRU items too.
@@ -5268,6 +5335,17 @@ pgstat_read_statsfiles(Oid onlydb, bool permanent, bool deep)
        goto done;
    }
 
+   /*
+    * Read WAL stats struct
+    */
+   if (fread(&walStats, 1, sizeof(walStats), fpin) != sizeof(walStats))
+   {
+       ereport(pgStatRunningInCollector ? LOG : WARNING,
+               (errmsg("corrupted statistics file \"%s\"", statfile)));
+       memset(&walStats, 0, sizeof(walStats));
+       goto done;
+   }
+
    /*
     * Read SLRU stats struct
     */
@@ -5578,6 +5656,7 @@ pgstat_read_db_statsfile_timestamp(Oid databaseid, bool permanent,
    PgStat_StatDBEntry dbentry;
    PgStat_GlobalStats myGlobalStats;
    PgStat_ArchiverStats myArchiverStats;
+   PgStat_WalStats myWalStats;
    PgStat_SLRUStats mySLRUStats[SLRU_NUM_ELEMENTS];
    FILE       *fpin;
    int32       format_id;
@@ -5633,6 +5712,17 @@ pgstat_read_db_statsfile_timestamp(Oid databaseid, bool permanent,
        return false;
    }
 
+   /*
+    * Read WAL stats struct
+    */
+   if (fread(&myWalStats, 1, sizeof(myWalStats), fpin) != sizeof(myWalStats))
+   {
+       ereport(pgStatRunningInCollector ? LOG : WARNING,
+               (errmsg("corrupted statistics file \"%s\"", statfile)));
+       FreeFile(fpin);
+       return false;
+   }
+
    /*
     * Read SLRU stats struct
     */
@@ -6213,6 +6303,12 @@ pgstat_recv_resetsharedcounter(PgStat_MsgResetsharedcounter *msg, int len)
        memset(&archiverStats, 0, sizeof(archiverStats));
        archiverStats.stat_reset_timestamp = GetCurrentTimestamp();
    }
+   else if (msg->m_resettarget == RESET_WAL)
+   {
+       /* Reset the WAL statistics for the cluster. */
+       memset(&walStats, 0, sizeof(walStats));
+       walStats.stat_reset_timestamp = GetCurrentTimestamp();
+   }
 
    /*
     * Presumably the sender of this message validated the target, don't
@@ -6427,6 +6523,18 @@ pgstat_recv_bgwriter(PgStat_MsgBgWriter *msg, int len)
    globalStats.buf_alloc += msg->m_buf_alloc;
 }
 
+/* ----------
+ * pgstat_recv_wal() -
+ *
+ * Process a WAL message.
+ * ----------
+ */
+static void
+pgstat_recv_wal(PgStat_MsgWal *msg, int len)
+{
+   walStats.wal_buffers_full += msg->m_wal_buffers_full;
+}
+
 /* ----------
  * pgstat_recv_slru() -
  *
index 95738a4e34eecb2992442d299031b8d243d86d3e..24e191ea30b67c61c8d9005f5d7b24d36142049b 100644 (file)
@@ -1697,6 +1697,42 @@ pg_stat_get_buf_alloc(PG_FUNCTION_ARGS)
    PG_RETURN_INT64(pgstat_fetch_global()->buf_alloc);
 }
 
+/*
+ * Returns statistics of WAL activity
+ */
+Datum
+pg_stat_get_wal(PG_FUNCTION_ARGS)
+{
+#define PG_STAT_GET_WAL_COLS   2
+   TupleDesc   tupdesc;
+   Datum       values[PG_STAT_GET_WAL_COLS];
+   bool        nulls[PG_STAT_GET_WAL_COLS];
+   PgStat_WalStats *wal_stats;
+
+   /* Initialise values and NULL flags arrays */
+   MemSet(values, 0, sizeof(values));
+   MemSet(nulls, 0, sizeof(nulls));
+
+   /* Initialise attributes information in the tuple descriptor */
+   tupdesc = CreateTemplateTupleDesc(PG_STAT_GET_WAL_COLS);
+   TupleDescInitEntry(tupdesc, (AttrNumber) 1, "wal_buffers_full",
+                      INT8OID, -1, 0);
+   TupleDescInitEntry(tupdesc, (AttrNumber) 2, "stats_reset",
+                      TIMESTAMPTZOID, -1, 0);
+
+   BlessTupleDesc(tupdesc);
+
+   /* Get statistics about WAL activity */
+   wal_stats = pgstat_fetch_stat_wal();
+
+   /* Fill values and NULLs */
+   values[0] = Int64GetDatum(wal_stats->wal_buffers_full);
+   values[1] = TimestampTzGetDatum(wal_stats->stat_reset_timestamp);
+
+   /* Returns the record as Datum */
+   PG_RETURN_DATUM(HeapTupleGetDatum(heap_form_tuple(tupdesc, values, nulls)));
+}
+
 /*
  * Returns statistics of SLRU caches.
  */
index 650e1f733ed2bdcd9b20b87fa217ee298a7abd50..1be017972438cf3f019d54e61fb8ce3471230a2f 100644 (file)
@@ -53,6 +53,6 @@
  */
 
 /*                         yyyymmddN */
-#define CATALOG_VERSION_NO 202009181
+#define CATALOG_VERSION_NO 202010021
 
 #endif
index f48f5fb4d99b0c8fd94fd29cecfeb5ae63166825..d6f3e2d286b46bdfb6de3f15e20ef388304b5296 100644 (file)
   proname => 'pg_stat_get_buf_alloc', provolatile => 's', proparallel => 'r',
   prorettype => 'int8', proargtypes => '', prosrc => 'pg_stat_get_buf_alloc' },
 
+{ oid => '1136', descr => 'statistics: information about WAL activity',
+  proname => 'pg_stat_get_wal', proisstrict => 'f', provolatile => 's',
+  proparallel => 'r', prorettype => 'record', proargtypes => '',
+  proallargtypes => '{int8,timestamptz}',
+  proargmodes => '{o,o}',
+  proargnames => '{wal_buffers_full,stats_reset}',
+  prosrc => 'pg_stat_get_wal' },
+
 { oid => '2306', descr => 'statistics: information about SLRU caches',
   proname => 'pg_stat_get_slru', prorows => '100', proisstrict => 'f',
   proretset => 't', provolatile => 's', proparallel => 'r',
index 0dfbac46b4b06b82ee43e5981794fb3ab553dcf1..343eef507eab3045f1f770e97e636799c2d12b33 100644 (file)
@@ -61,6 +61,7 @@ typedef enum StatMsgType
    PGSTAT_MTYPE_ANALYZE,
    PGSTAT_MTYPE_ARCHIVER,
    PGSTAT_MTYPE_BGWRITER,
+   PGSTAT_MTYPE_WAL,
    PGSTAT_MTYPE_SLRU,
    PGSTAT_MTYPE_FUNCSTAT,
    PGSTAT_MTYPE_FUNCPURGE,
@@ -122,7 +123,8 @@ typedef struct PgStat_TableCounts
 typedef enum PgStat_Shared_Reset_Target
 {
    RESET_ARCHIVER,
-   RESET_BGWRITER
+   RESET_BGWRITER,
+   RESET_WAL
 } PgStat_Shared_Reset_Target;
 
 /* Possible object types for resetting single counters */
@@ -436,6 +438,16 @@ typedef struct PgStat_MsgBgWriter
    PgStat_Counter m_checkpoint_sync_time;
 } PgStat_MsgBgWriter;
 
+/* ----------
+ * PgStat_MsgWal           Sent by backends and background processes to update WAL statistics.
+ * ----------
+ */
+typedef struct PgStat_MsgWal
+{
+   PgStat_MsgHdr m_hdr;
+   PgStat_Counter m_wal_buffers_full;
+} PgStat_MsgWal;
+
 /* ----------
  * PgStat_MsgSLRU          Sent by a backend to update SLRU statistics.
  * ----------
@@ -596,6 +608,7 @@ typedef union PgStat_Msg
    PgStat_MsgAnalyze msg_analyze;
    PgStat_MsgArchiver msg_archiver;
    PgStat_MsgBgWriter msg_bgwriter;
+   PgStat_MsgWal msg_wal;
    PgStat_MsgSLRU msg_slru;
    PgStat_MsgFuncstat msg_funcstat;
    PgStat_MsgFuncpurge msg_funcpurge;
@@ -614,7 +627,7 @@ typedef union PgStat_Msg
  * ------------------------------------------------------------
  */
 
-#define PGSTAT_FILE_FORMAT_ID  0x01A5BC9D
+#define PGSTAT_FILE_FORMAT_ID  0x01A5BC9E
 
 /* ----------
  * PgStat_StatDBEntry          The collector's data per database
@@ -745,6 +758,15 @@ typedef struct PgStat_GlobalStats
    TimestampTz stat_reset_timestamp;
 } PgStat_GlobalStats;
 
+/*
+ * WAL statistics kept in the stats collector
+ */
+typedef struct PgStat_WalStats
+{
+   PgStat_Counter wal_buffers_full;
+   TimestampTz stat_reset_timestamp;
+} PgStat_WalStats;
+
 /*
  * SLRU statistics kept in the stats collector
  */
@@ -1265,6 +1287,11 @@ extern char *pgstat_stat_filename;
  */
 extern PgStat_MsgBgWriter BgWriterStats;
 
+/*
+ * WAL statistics counter is updated by backends and background processes
+ */
+extern PgStat_MsgWal WalStats;
+
 /*
  * Updated by pgstat_count_buffer_*_time macros
  */
@@ -1464,6 +1491,7 @@ extern void pgstat_twophase_postabort(TransactionId xid, uint16 info,
 
 extern void pgstat_send_archiver(const char *xlog, bool failed);
 extern void pgstat_send_bgwriter(void);
+extern void pgstat_send_wal(void);
 
 /* ----------
  * Support functions for the SQL-callable functions to
@@ -1478,6 +1506,7 @@ extern PgStat_StatFuncEntry *pgstat_fetch_stat_funcentry(Oid funcid);
 extern int pgstat_fetch_stat_numbackends(void);
 extern PgStat_ArchiverStats *pgstat_fetch_stat_archiver(void);
 extern PgStat_GlobalStats *pgstat_fetch_global(void);
+extern PgStat_WalStats *pgstat_fetch_stat_wal(void);
 extern PgStat_SLRUStats *pgstat_fetch_slru(void);
 
 extern void pgstat_count_slru_page_zeroed(int slru_idx);
index 2a18dc423e2bfd2ca6705e7c4b20a9a334c421c9..af4192f9a87222a6ce613f0abb146f0bb6896ac3 100644 (file)
@@ -2129,6 +2129,9 @@ pg_stat_user_tables| SELECT pg_stat_all_tables.relid,
     pg_stat_all_tables.autoanalyze_count
    FROM pg_stat_all_tables
   WHERE ((pg_stat_all_tables.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_stat_all_tables.schemaname !~ '^pg_toast'::text));
+pg_stat_wal| SELECT w.wal_buffers_full,
+    w.stats_reset
+   FROM pg_stat_get_wal() w(wal_buffers_full, stats_reset);
 pg_stat_wal_receiver| SELECT s.pid,
     s.status,
     s.receive_start_lsn,
index 1cffc3349d6023e087c5b331a6e7e5aeedad343f..81bdacf59daa5a9718dc93a04f1af913a0b3871f 100644 (file)
@@ -76,6 +76,13 @@ select count(*) >= 0 as ok from pg_prepared_xacts;
  t
 (1 row)
 
+-- There must be only one record
+select count(*) = 1 as ok from pg_stat_wal;
+ ok 
+----
+ t
+(1 row)
+
 -- This is to record the prevailing planner enable_foo settings during
 -- a regression test run.
 select name, setting from pg_settings where name like 'enable%';
index ac4a0e1cbba7ec579330f5d7c5fa9ad015d9ffb4..b9b875bc6abc2528a79d24e5d0f10f3227f7ca6b 100644 (file)
@@ -37,6 +37,9 @@ select count(*) = 0 as ok from pg_prepared_statements;
 -- See also prepared_xacts.sql
 select count(*) >= 0 as ok from pg_prepared_xacts;
 
+-- There must be only one record
+select count(*) = 1 as ok from pg_stat_wal;
+
 -- This is to record the prevailing planner enable_foo settings during
 -- a regression test run.
 select name, setting from pg_settings where name like 'enable%';
index 9cd1179af63cdcbb78b71906cdc0a7ecad829754..4191f948696343b208f705f4d6392548e84b02cb 100644 (file)
@@ -1841,6 +1841,7 @@ PgStat_MsgTabpurge
 PgStat_MsgTabstat
 PgStat_MsgTempFile
 PgStat_MsgVacuum
+PgStat_MsgWal
 PgStat_SLRUStats
 PgStat_Shared_Reset_Target
 PgStat_Single_Reset_Type
@@ -1852,6 +1853,7 @@ PgStat_TableCounts
 PgStat_TableEntry
 PgStat_TableStatus
 PgStat_TableXactStatus
+PgStat_WalStats
 PgXmlErrorContext
 PgXmlStrictness
 Pg_finfo_record