Refactor some code related to backend statistics
authorMichael Paquier <[email protected]>
Fri, 10 Jan 2025 00:00:48 +0000 (09:00 +0900)
committerMichael Paquier <[email protected]>
Fri, 10 Jan 2025 00:00:48 +0000 (09:00 +0900)
This commit changes the way pending backend statistics are tracked by
moving them into a new structure called PgStat_BackendPending, removing
PgStat_BackendPendingIO.  PgStat_BackendPending currently only includes
PgStat_PendingIO for the pending I/O stats.

pgstat_flush_backend() is extended with a "flags" argument to control
which parts of the stats of a backend should be flushed.

With this refactoring, it becomes easier to plug into backend statistics
more data.  A patch to add information related to WAL in this stats kind
is under discussion.

Author: Bertrand Drouvot
Discussion: https://postgr.es/m/Z3zqc4o09dM/[email protected]

src/backend/utils/activity/pgstat.c
src/backend/utils/activity/pgstat_backend.c
src/backend/utils/activity/pgstat_io.c
src/backend/utils/activity/pgstat_relation.c
src/backend/utils/adt/pgstatfuncs.c
src/include/pgstat.h
src/include/utils/pgstat_internal.h
src/tools/pgindent/typedefs.list

index 16a03b8ce15a50dcee7f56cd56c3434e281bda32..34520535d5491908d5e391fb4890e810b565bf7d 100644 (file)
@@ -370,7 +370,7 @@ static const PgStat_KindInfo pgstat_kind_builtin_infos[PGSTAT_KIND_BUILTIN_SIZE]
                .shared_size = sizeof(PgStatShared_Backend),
                .shared_data_off = offsetof(PgStatShared_Backend, stats),
                .shared_data_len = sizeof(((PgStatShared_Backend *) 0)->stats),
-               .pending_size = sizeof(PgStat_BackendPendingIO),
+               .pending_size = sizeof(PgStat_BackendPending),
 
                .flush_pending_cb = pgstat_backend_flush_cb,
                .reset_timestamp_cb = pgstat_backend_reset_timestamp_cb,
index 1f91bfef0a3a3be0895198b2ecefd44d1a27c62e..207bfa3c2769ca01c41f3640880a787bb052ae64 100644 (file)
@@ -39,23 +39,21 @@ pgstat_fetch_stat_backend(ProcNumber procNumber)
 }
 
 /*
- * Flush out locally pending backend statistics
- *
- * If no stats have been recorded, this function returns false.
+ * Flush out locally pending backend IO statistics.  Locking is managed
+ * by the caller.
  */
-bool
-pgstat_backend_flush_cb(PgStat_EntryRef *entry_ref, bool nowait)
+static void
+pgstat_flush_backend_entry_io(PgStat_EntryRef *entry_ref)
 {
-       PgStatShared_Backend *shbackendioent;
-       PgStat_BackendPendingIO *pendingent;
+       PgStatShared_Backend *shbackendent;
+       PgStat_BackendPending *pendingent;
        PgStat_BktypeIO *bktype_shstats;
+       PgStat_PendingIO *pending_io;
 
-       if (!pgstat_lock_entry(entry_ref, nowait))
-               return false;
-
-       shbackendioent = (PgStatShared_Backend *) entry_ref->shared_stats;
-       bktype_shstats = &shbackendioent->stats.stats;
-       pendingent = (PgStat_BackendPendingIO *) entry_ref->pending;
+       shbackendent = (PgStatShared_Backend *) entry_ref->shared_stats;
+       pendingent = (PgStat_BackendPending *) entry_ref->pending;
+       bktype_shstats = &shbackendent->stats.io_stats;
+       pending_io = &pendingent->pending_io;
 
        for (int io_object = 0; io_object < IOOBJECT_NUM_TYPES; io_object++)
        {
@@ -66,15 +64,33 @@ pgstat_backend_flush_cb(PgStat_EntryRef *entry_ref, bool nowait)
                                instr_time      time;
 
                                bktype_shstats->counts[io_object][io_context][io_op] +=
-                                       pendingent->counts[io_object][io_context][io_op];
+                                       pending_io->counts[io_object][io_context][io_op];
 
-                               time = pendingent->pending_times[io_object][io_context][io_op];
+                               time = pending_io->pending_times[io_object][io_context][io_op];
 
                                bktype_shstats->times[io_object][io_context][io_op] +=
                                        INSTR_TIME_GET_MICROSEC(time);
                        }
                }
        }
+}
+
+/*
+ * Wrapper routine to flush backend statistics.
+ */
+static bool
+pgstat_flush_backend_entry(PgStat_EntryRef *entry_ref, bool nowait,
+                                                  bits32 flags)
+{
+       if (!pgstat_tracks_backend_bktype(MyBackendType))
+               return false;
+
+       if (!pgstat_lock_entry(entry_ref, nowait))
+               return false;
+
+       /* Flush requested statistics */
+       if (flags & PGSTAT_BACKEND_FLUSH_IO)
+               pgstat_flush_backend_entry_io(entry_ref);
 
        pgstat_unlock_entry(entry_ref);
 
@@ -82,10 +98,23 @@ pgstat_backend_flush_cb(PgStat_EntryRef *entry_ref, bool nowait)
 }
 
 /*
- * Simpler wrapper of pgstat_backend_flush_cb()
+ * Callback to flush out locally pending backend statistics.
+ *
+ * If no stats have been recorded, this function returns false.
+ */
+bool
+pgstat_backend_flush_cb(PgStat_EntryRef *entry_ref, bool nowait)
+{
+       return pgstat_flush_backend_entry(entry_ref, nowait, PGSTAT_BACKEND_FLUSH_ALL);
+}
+
+/*
+ * Flush out locally pending backend statistics
+ *
+ * "flags" parameter controls which statistics to flush.
  */
 void
-pgstat_flush_backend(bool nowait)
+pgstat_flush_backend(bool nowait, bits32 flags)
 {
        PgStat_EntryRef *entry_ref;
 
@@ -94,7 +123,7 @@ pgstat_flush_backend(bool nowait)
 
        entry_ref = pgstat_get_entry_ref(PGSTAT_KIND_BACKEND, InvalidOid,
                                                                         MyProcNumber, false, NULL);
-       (void) pgstat_backend_flush_cb(entry_ref, nowait);
+       (void) pgstat_flush_backend_entry(entry_ref, nowait, flags);
 }
 
 /*
@@ -119,9 +148,9 @@ pgstat_create_backend(ProcNumber procnum)
 }
 
 /*
- * Find or create a local PgStat_BackendPendingIO entry for proc number.
+ * Find or create a local PgStat_BackendPending entry for proc number.
  */
-PgStat_BackendPendingIO *
+PgStat_BackendPending *
 pgstat_prep_backend_pending(ProcNumber procnum)
 {
        PgStat_EntryRef *entry_ref;
index f9a1f91dba858336dd7a0b930a8ff56047a3a257..a7445995d32262aa021315e91fc861085e6a0752 100644 (file)
@@ -81,10 +81,10 @@ pgstat_count_io_op_n(IOObject io_object, IOContext io_context, IOOp io_op, uint3
 
        if (pgstat_tracks_backend_bktype(MyBackendType))
        {
-               PgStat_PendingIO *entry_ref;
+               PgStat_BackendPending *entry_ref;
 
                entry_ref = pgstat_prep_backend_pending(MyProcNumber);
-               entry_ref->counts[io_object][io_context][io_op] += cnt;
+               entry_ref->pending_io.counts[io_object][io_context][io_op] += cnt;
        }
 
        PendingIOStats.counts[io_object][io_context][io_op] += cnt;
@@ -151,10 +151,10 @@ pgstat_count_io_op_time(IOObject io_object, IOContext io_context, IOOp io_op,
 
                if (pgstat_tracks_backend_bktype(MyBackendType))
                {
-                       PgStat_PendingIO *entry_ref;
+                       PgStat_BackendPending *entry_ref;
 
                        entry_ref = pgstat_prep_backend_pending(MyProcNumber);
-                       INSTR_TIME_ADD(entry_ref->pending_times[io_object][io_context][io_op],
+                       INSTR_TIME_ADD(entry_ref->pending_io.pending_times[io_object][io_context][io_op],
                                                   io_time);
                }
        }
index 2cc304f8812abc223d6874d11bb5d27cd136e2a2..09247ba09712a143321bfb2a249a547bb647cebc 100644 (file)
@@ -264,7 +264,7 @@ pgstat_report_vacuum(Oid tableoid, bool shared,
         * VACUUM command has processed all tables and committed.
         */
        pgstat_flush_io(false);
-       pgstat_flush_backend(false);
+       pgstat_flush_backend(false, PGSTAT_BACKEND_FLUSH_IO);
 }
 
 /*
@@ -351,7 +351,7 @@ pgstat_report_analyze(Relation rel,
 
        /* see pgstat_report_vacuum() */
        pgstat_flush_io(false);
-       pgstat_flush_backend(false);
+       pgstat_flush_backend(false, PGSTAT_BACKEND_FLUSH_IO);
 }
 
 /*
index 3245f3a8d8a59cd44a157793c22f10910de09168..5f8d20a406d429b44c870cc1442e7e73eb3aad8c 100644 (file)
@@ -1544,7 +1544,7 @@ pg_stat_get_backend_io(PG_FUNCTION_ARGS)
        if (bktype == B_INVALID)
                return (Datum) 0;
 
-       bktype_stats = &backend_stats->stats;
+       bktype_stats = &backend_stats->io_stats;
 
        /*
         * In Assert builds, we can afford an extra loop through all of the
index 0d8427f27d174880b214166526875c60dbeeed69..f1dfe2b5e91045dba1aeed47884f71d1ec5c48d3 100644 (file)
@@ -375,15 +375,24 @@ typedef struct PgStat_IO
        PgStat_BktypeIO stats[BACKEND_NUM_TYPES];
 } PgStat_IO;
 
-/* Backend statistics store the same amount of IO data as PGSTAT_KIND_IO */
-typedef PgStat_PendingIO PgStat_BackendPendingIO;
-
 typedef struct PgStat_Backend
 {
        TimestampTz stat_reset_timestamp;
-       PgStat_BktypeIO stats;
+       PgStat_BktypeIO io_stats;
 } PgStat_Backend;
 
+/* ---------
+ * PgStat_BackendPending       Non-flushed backend stats.
+ * ---------
+ */
+typedef struct PgStat_BackendPending
+{
+       /*
+        * Backend statistics store the same amount of IO data as PGSTAT_KIND_IO.
+        */
+       PgStat_PendingIO pending_io;
+} PgStat_BackendPending;
+
 typedef struct PgStat_StatDBEntry
 {
        PgStat_Counter xact_commit;
index 52eb008710f75f0516970009adac7fa0bd692806..4bb8e5c53ab2fcd5b65e26c243f7a181b20395f0 100644 (file)
@@ -613,9 +613,12 @@ extern void pgstat_archiver_snapshot_cb(void);
  * Functions in pgstat_backend.c
  */
 
-extern void pgstat_flush_backend(bool nowait);
+/* flags for pgstat_flush_backend() */
+#define PGSTAT_BACKEND_FLUSH_IO                (1 << 0)        /* Flush I/O statistics */
+#define PGSTAT_BACKEND_FLUSH_ALL       (PGSTAT_BACKEND_FLUSH_IO)
 
-extern PgStat_BackendPendingIO *pgstat_prep_backend_pending(ProcNumber procnum);
+extern void pgstat_flush_backend(bool nowait, bits32 flags);
+extern PgStat_BackendPending *pgstat_prep_backend_pending(ProcNumber procnum);
 extern bool pgstat_backend_flush_cb(PgStat_EntryRef *entry_ref, bool nowait);
 extern void pgstat_backend_reset_timestamp_cb(PgStatShared_Common *header, TimestampTz ts);
 
index 9f83ecf181f9e654eb12c45bb3951946f7c806ce..eb93debe1088aacfa2a843d1931fc38e61bea3d7 100644 (file)
@@ -2140,7 +2140,7 @@ PgStatShared_Subscription
 PgStatShared_Wal
 PgStat_ArchiverStats
 PgStat_Backend
-PgStat_BackendPendingIO
+PgStat_BackendPending
 PgStat_BackendSubEntry
 PgStat_BgWriterStats
 PgStat_BktypeIO