Add PgStat_KindInfo.init_shmem_cb
authorMichael Paquier <[email protected]>
Thu, 11 Jul 2024 00:21:40 +0000 (09:21 +0900)
committerMichael Paquier <[email protected]>
Thu, 11 Jul 2024 00:21:40 +0000 (09:21 +0900)
This new callback gives fixed-numbered stats the possibility to take
actions based on the area of shared memory allocated for them.

This removes from pgstat_shmem.c any knowledge specific to the types
of fixed-numbered stats, and the initializations happen in their own
files.  Like b68b29bc8fec, this change is useful to make this area of
the code more pluggable, so as custom fixed-numbered stats can take
actions after their shared memory area is initialized.

Reviewed-by: Bertrand Drouvot
Discussion: https://postgr.es/m/[email protected]

src/backend/utils/activity/pgstat.c
src/backend/utils/activity/pgstat_archiver.c
src/backend/utils/activity/pgstat_bgwriter.c
src/backend/utils/activity/pgstat_checkpointer.c
src/backend/utils/activity/pgstat_io.c
src/backend/utils/activity/pgstat_shmem.c
src/backend/utils/activity/pgstat_slru.c
src/backend/utils/activity/pgstat_wal.c
src/include/utils/pgstat_internal.h

index 65b937a85f4cfb935e63f4e0f4f6a158f2ea5d06..ef435167f7f0dcb6101080ae64b1dae8a974121a 100644 (file)
@@ -354,6 +354,7 @@ static const PgStat_KindInfo pgstat_kind_infos[PGSTAT_NUM_KINDS] = {
        .shared_data_off = offsetof(PgStatShared_Archiver, stats),
        .shared_data_len = sizeof(((PgStatShared_Archiver *) 0)->stats),
 
+       .init_shmem_cb = pgstat_archiver_init_shmem_cb,
        .reset_all_cb = pgstat_archiver_reset_all_cb,
        .snapshot_cb = pgstat_archiver_snapshot_cb,
    },
@@ -368,6 +369,7 @@ static const PgStat_KindInfo pgstat_kind_infos[PGSTAT_NUM_KINDS] = {
        .shared_data_off = offsetof(PgStatShared_BgWriter, stats),
        .shared_data_len = sizeof(((PgStatShared_BgWriter *) 0)->stats),
 
+       .init_shmem_cb = pgstat_bgwriter_init_shmem_cb,
        .reset_all_cb = pgstat_bgwriter_reset_all_cb,
        .snapshot_cb = pgstat_bgwriter_snapshot_cb,
    },
@@ -382,6 +384,7 @@ static const PgStat_KindInfo pgstat_kind_infos[PGSTAT_NUM_KINDS] = {
        .shared_data_off = offsetof(PgStatShared_Checkpointer, stats),
        .shared_data_len = sizeof(((PgStatShared_Checkpointer *) 0)->stats),
 
+       .init_shmem_cb = pgstat_checkpointer_init_shmem_cb,
        .reset_all_cb = pgstat_checkpointer_reset_all_cb,
        .snapshot_cb = pgstat_checkpointer_snapshot_cb,
    },
@@ -396,6 +399,7 @@ static const PgStat_KindInfo pgstat_kind_infos[PGSTAT_NUM_KINDS] = {
        .shared_data_off = offsetof(PgStatShared_IO, stats),
        .shared_data_len = sizeof(((PgStatShared_IO *) 0)->stats),
 
+       .init_shmem_cb = pgstat_io_init_shmem_cb,
        .reset_all_cb = pgstat_io_reset_all_cb,
        .snapshot_cb = pgstat_io_snapshot_cb,
    },
@@ -410,6 +414,7 @@ static const PgStat_KindInfo pgstat_kind_infos[PGSTAT_NUM_KINDS] = {
        .shared_data_off = offsetof(PgStatShared_SLRU, stats),
        .shared_data_len = sizeof(((PgStatShared_SLRU *) 0)->stats),
 
+       .init_shmem_cb = pgstat_slru_init_shmem_cb,
        .reset_all_cb = pgstat_slru_reset_all_cb,
        .snapshot_cb = pgstat_slru_snapshot_cb,
    },
@@ -424,6 +429,7 @@ static const PgStat_KindInfo pgstat_kind_infos[PGSTAT_NUM_KINDS] = {
        .shared_data_off = offsetof(PgStatShared_Wal, stats),
        .shared_data_len = sizeof(((PgStatShared_Wal *) 0)->stats),
 
+       .init_shmem_cb = pgstat_wal_init_shmem_cb,
        .reset_all_cb = pgstat_wal_reset_all_cb,
        .snapshot_cb = pgstat_wal_snapshot_cb,
    },
index 66398b20e5e3e11cc93a0a1d5dcb233d6f120abb..60e04711c44f7b55e4281c9285045f6f1ed175f7 100644 (file)
@@ -62,6 +62,14 @@ pgstat_fetch_stat_archiver(void)
    return &pgStatLocal.snapshot.archiver;
 }
 
+void
+pgstat_archiver_init_shmem_cb(void *stats)
+{
+   PgStatShared_Archiver *stats_shmem = (PgStatShared_Archiver *) stats;
+
+   LWLockInitialize(&stats_shmem->lock, LWTRANCHE_PGSTATS_DATA);
+}
+
 void
 pgstat_archiver_reset_all_cb(TimestampTz ts)
 {
index 7d2432e4fa8baec198546ebffb409d4c3f63e274..364a7a2024a3199abcae7e0db0d08e98dad682d3 100644 (file)
@@ -75,6 +75,14 @@ pgstat_fetch_stat_bgwriter(void)
    return &pgStatLocal.snapshot.bgwriter;
 }
 
+void
+pgstat_bgwriter_init_shmem_cb(void *stats)
+{
+   PgStatShared_BgWriter *stats_shmem = (PgStatShared_BgWriter *) stats;
+
+   LWLockInitialize(&stats_shmem->lock, LWTRANCHE_PGSTATS_DATA);
+}
+
 void
 pgstat_bgwriter_reset_all_cb(TimestampTz ts)
 {
index 30a8110e38187b4d47e5232bad5990faefa9c5f1..bbfc9c7e1833c67a26efc4eb7bc76a8790fefe39 100644 (file)
@@ -84,6 +84,14 @@ pgstat_fetch_stat_checkpointer(void)
    return &pgStatLocal.snapshot.checkpointer;
 }
 
+void
+pgstat_checkpointer_init_shmem_cb(void *stats)
+{
+   PgStatShared_Checkpointer *stats_shmem = (PgStatShared_Checkpointer *) stats;
+
+   LWLockInitialize(&stats_shmem->lock, LWTRANCHE_PGSTATS_DATA);
+}
+
 void
 pgstat_checkpointer_reset_all_cb(TimestampTz ts)
 {
index 9d6e067382778b946e003a6cc3fc184b6e60c697..8af55989eed83da95d12e43187009093305c5018 100644 (file)
@@ -251,6 +251,15 @@ pgstat_get_io_object_name(IOObject io_object)
    pg_unreachable();
 }
 
+void
+pgstat_io_init_shmem_cb(void *stats)
+{
+   PgStatShared_IO *stat_shmem = (PgStatShared_IO *) stats;
+
+   for (int i = 0; i < BACKEND_NUM_TYPES; i++)
+       LWLockInitialize(&stat_shmem->locks[i], LWTRANCHE_PGSTATS_DATA);
+}
+
 void
 pgstat_io_reset_all_cb(TimestampTz ts)
 {
index 634b9678206d352b7482f26287f2eb0fd4561659..1c2b69d5634690de7e0a32a16489d8413d44bedd 100644 (file)
@@ -196,17 +196,18 @@ StatsShmemInit(void)
 
        pg_atomic_init_u64(&ctl->gc_request_count, 1);
 
-
        /* initialize fixed-numbered stats */
-       LWLockInitialize(&ctl->archiver.lock, LWTRANCHE_PGSTATS_DATA);
-       LWLockInitialize(&ctl->bgwriter.lock, LWTRANCHE_PGSTATS_DATA);
-       LWLockInitialize(&ctl->checkpointer.lock, LWTRANCHE_PGSTATS_DATA);
-       LWLockInitialize(&ctl->slru.lock, LWTRANCHE_PGSTATS_DATA);
-       LWLockInitialize(&ctl->wal.lock, LWTRANCHE_PGSTATS_DATA);
-
-       for (int i = 0; i < BACKEND_NUM_TYPES; i++)
-           LWLockInitialize(&ctl->io.locks[i],
-                            LWTRANCHE_PGSTATS_DATA);
+       for (int kind = PGSTAT_KIND_FIRST_VALID; kind <= PGSTAT_KIND_LAST; kind++)
+       {
+           const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind);
+           char       *ptr;
+
+           if (!kind_info->fixed_amount)
+               continue;
+
+           ptr = ((char *) ctl) + kind_info->shared_ctl_off;
+           kind_info->init_shmem_cb(ptr);
+       }
    }
    else
    {
index 56ea1c33785752fca27859124cfe74272faeb418..6f922a85bfc690c3ef50816b38daf874efa701c3 100644 (file)
@@ -192,6 +192,14 @@ pgstat_slru_flush(bool nowait)
    return false;
 }
 
+void
+pgstat_slru_init_shmem_cb(void *stats)
+{
+   PgStatShared_SLRU *stats_shmem = (PgStatShared_SLRU *) stats;
+
+   LWLockInitialize(&stats_shmem->lock, LWTRANCHE_PGSTATS_DATA);
+}
+
 void
 pgstat_slru_reset_all_cb(TimestampTz ts)
 {
index 0e374f133a9042054b0589156f0c2e848c49756c..e2a3f6b865c212e2571a5bca5eda57f308bb6c31 100644 (file)
@@ -163,6 +163,14 @@ pgstat_have_pending_wal(void)
        PendingWalStats.wal_sync != 0;
 }
 
+void
+pgstat_wal_init_shmem_cb(void *stats)
+{
+   PgStatShared_Wal *stats_shmem = (PgStatShared_Wal *) stats;
+
+   LWLockInitialize(&stats_shmem->lock, LWTRANCHE_PGSTATS_DATA);
+}
+
 void
 pgstat_wal_reset_all_cb(TimestampTz ts)
 {
index 43d6deb03cf1c5c9874e7c68f081f101e8aad9eb..778f625ca1de4c5be5db69f65545f8d2496a7cfe 100644 (file)
@@ -251,6 +251,13 @@ typedef struct PgStat_KindInfo
                                       const PgStatShared_Common *header, NameData *name);
    bool        (*from_serialized_name) (const NameData *name, PgStat_HashKey *key);
 
+   /*
+    * For fixed-numbered statistics: Initialize shared memory state.
+    *
+    * "stats" is the pointer to the allocated shared memory area.
+    */
+   void        (*init_shmem_cb) (void *stats);
+
    /*
     * For fixed-numbered statistics: Reset All.
     */
@@ -528,6 +535,7 @@ extern void pgstat_snapshot_fixed(PgStat_Kind kind);
  * Functions in pgstat_archiver.c
  */
 
+extern void pgstat_archiver_init_shmem_cb(void *stats);
 extern void pgstat_archiver_reset_all_cb(TimestampTz ts);
 extern void pgstat_archiver_snapshot_cb(void);
 
@@ -536,6 +544,7 @@ extern void pgstat_archiver_snapshot_cb(void);
  * Functions in pgstat_bgwriter.c
  */
 
+extern void pgstat_bgwriter_init_shmem_cb(void *stats);
 extern void pgstat_bgwriter_reset_all_cb(TimestampTz ts);
 extern void pgstat_bgwriter_snapshot_cb(void);
 
@@ -544,6 +553,7 @@ extern void pgstat_bgwriter_snapshot_cb(void);
  * Functions in pgstat_checkpointer.c
  */
 
+extern void pgstat_checkpointer_init_shmem_cb(void *stats);
 extern void pgstat_checkpointer_reset_all_cb(TimestampTz ts);
 extern void pgstat_checkpointer_snapshot_cb(void);
 
@@ -574,6 +584,7 @@ extern bool pgstat_function_flush_cb(PgStat_EntryRef *entry_ref, bool nowait);
  */
 
 extern bool pgstat_flush_io(bool nowait);
+extern void pgstat_io_init_shmem_cb(void *stats);
 extern void pgstat_io_reset_all_cb(TimestampTz ts);
 extern void pgstat_io_snapshot_cb(void);
 
@@ -632,6 +643,7 @@ extern PgStatShared_Common *pgstat_init_entry(PgStat_Kind kind,
  */
 
 extern bool pgstat_slru_flush(bool nowait);
+extern void pgstat_slru_init_shmem_cb(void *stats);
 extern void pgstat_slru_reset_all_cb(TimestampTz ts);
 extern void pgstat_slru_snapshot_cb(void);
 
@@ -644,6 +656,7 @@ extern bool pgstat_flush_wal(bool nowait);
 extern void pgstat_init_wal(void);
 extern bool pgstat_have_pending_wal(void);
 
+extern void pgstat_wal_init_shmem_cb(void *stats);
 extern void pgstat_wal_reset_all_cb(TimestampTz ts);
 extern void pgstat_wal_snapshot_cb(void);