aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Paquier <michael@paquier.xyz>2024-07-11 09:21:40 +0900
committerMichael Paquier <michael@paquier.xyz>2024-07-11 09:21:40 +0900
commit21471f18e9d9aa3383314ed8bc9163bc369109ae (patch)
treeba62b94e3c4a735dbb3b1924381f73bb024fa0d5
parentcc2236854e2bb4f2120927c390c63cc2aad77762 (diff)
downloadpostgresql-21471f18e9d9aa3383314ed8bc9163bc369109ae.tar.gz
postgresql-21471f18e9d9aa3383314ed8bc9163bc369109ae.zip
Add PgStat_KindInfo.init_shmem_cb
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/Zot5bxoPYdS7yaoy@paquier.xyz
-rw-r--r--src/backend/utils/activity/pgstat.c6
-rw-r--r--src/backend/utils/activity/pgstat_archiver.c8
-rw-r--r--src/backend/utils/activity/pgstat_bgwriter.c8
-rw-r--r--src/backend/utils/activity/pgstat_checkpointer.c8
-rw-r--r--src/backend/utils/activity/pgstat_io.c9
-rw-r--r--src/backend/utils/activity/pgstat_shmem.c21
-rw-r--r--src/backend/utils/activity/pgstat_slru.c8
-rw-r--r--src/backend/utils/activity/pgstat_wal.c8
-rw-r--r--src/include/utils/pgstat_internal.h13
9 files changed, 79 insertions, 10 deletions
diff --git a/src/backend/utils/activity/pgstat.c b/src/backend/utils/activity/pgstat.c
index 65b937a85f4..ef435167f7f 100644
--- a/src/backend/utils/activity/pgstat.c
+++ b/src/backend/utils/activity/pgstat.c
@@ -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,
},
diff --git a/src/backend/utils/activity/pgstat_archiver.c b/src/backend/utils/activity/pgstat_archiver.c
index 66398b20e5e..60e04711c44 100644
--- a/src/backend/utils/activity/pgstat_archiver.c
+++ b/src/backend/utils/activity/pgstat_archiver.c
@@ -63,6 +63,14 @@ pgstat_fetch_stat_archiver(void)
}
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)
{
PgStatShared_Archiver *stats_shmem = &pgStatLocal.shmem->archiver;
diff --git a/src/backend/utils/activity/pgstat_bgwriter.c b/src/backend/utils/activity/pgstat_bgwriter.c
index 7d2432e4fa8..364a7a2024a 100644
--- a/src/backend/utils/activity/pgstat_bgwriter.c
+++ b/src/backend/utils/activity/pgstat_bgwriter.c
@@ -76,6 +76,14 @@ pgstat_fetch_stat_bgwriter(void)
}
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)
{
PgStatShared_BgWriter *stats_shmem = &pgStatLocal.shmem->bgwriter;
diff --git a/src/backend/utils/activity/pgstat_checkpointer.c b/src/backend/utils/activity/pgstat_checkpointer.c
index 30a8110e381..bbfc9c7e183 100644
--- a/src/backend/utils/activity/pgstat_checkpointer.c
+++ b/src/backend/utils/activity/pgstat_checkpointer.c
@@ -85,6 +85,14 @@ pgstat_fetch_stat_checkpointer(void)
}
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)
{
PgStatShared_Checkpointer *stats_shmem = &pgStatLocal.shmem->checkpointer;
diff --git a/src/backend/utils/activity/pgstat_io.c b/src/backend/utils/activity/pgstat_io.c
index 9d6e0673827..8af55989eed 100644
--- a/src/backend/utils/activity/pgstat_io.c
+++ b/src/backend/utils/activity/pgstat_io.c
@@ -252,6 +252,15 @@ pgstat_get_io_object_name(IOObject io_object)
}
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)
{
for (int i = 0; i < BACKEND_NUM_TYPES; i++)
diff --git a/src/backend/utils/activity/pgstat_shmem.c b/src/backend/utils/activity/pgstat_shmem.c
index 634b9678206..1c2b69d5634 100644
--- a/src/backend/utils/activity/pgstat_shmem.c
+++ b/src/backend/utils/activity/pgstat_shmem.c
@@ -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
{
diff --git a/src/backend/utils/activity/pgstat_slru.c b/src/backend/utils/activity/pgstat_slru.c
index 56ea1c33785..6f922a85bfc 100644
--- a/src/backend/utils/activity/pgstat_slru.c
+++ b/src/backend/utils/activity/pgstat_slru.c
@@ -193,6 +193,14 @@ pgstat_slru_flush(bool nowait)
}
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)
{
for (int i = 0; i < SLRU_NUM_ELEMENTS; i++)
diff --git a/src/backend/utils/activity/pgstat_wal.c b/src/backend/utils/activity/pgstat_wal.c
index 0e374f133a9..e2a3f6b865c 100644
--- a/src/backend/utils/activity/pgstat_wal.c
+++ b/src/backend/utils/activity/pgstat_wal.c
@@ -164,6 +164,14 @@ pgstat_have_pending_wal(void)
}
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)
{
PgStatShared_Wal *stats_shmem = &pgStatLocal.shmem->wal;
diff --git a/src/include/utils/pgstat_internal.h b/src/include/utils/pgstat_internal.h
index 43d6deb03cf..778f625ca1d 100644
--- a/src/include/utils/pgstat_internal.h
+++ b/src/include/utils/pgstat_internal.h
@@ -252,6 +252,13 @@ typedef struct PgStat_KindInfo
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.
*/
void (*reset_all_cb) (TimestampTz ts);
@@ -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);