diff --git a/src/backend/utils/activity/pgstat.c b/src/backend/utils/activity/pgstat.c index 65b937a85f..ef435167f7 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 66398b20e5..60e04711c4 100644 --- a/src/backend/utils/activity/pgstat_archiver.c +++ b/src/backend/utils/activity/pgstat_archiver.c @@ -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) { diff --git a/src/backend/utils/activity/pgstat_bgwriter.c b/src/backend/utils/activity/pgstat_bgwriter.c index 7d2432e4fa..364a7a2024 100644 --- a/src/backend/utils/activity/pgstat_bgwriter.c +++ b/src/backend/utils/activity/pgstat_bgwriter.c @@ -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) { diff --git a/src/backend/utils/activity/pgstat_checkpointer.c b/src/backend/utils/activity/pgstat_checkpointer.c index 30a8110e38..bbfc9c7e18 100644 --- a/src/backend/utils/activity/pgstat_checkpointer.c +++ b/src/backend/utils/activity/pgstat_checkpointer.c @@ -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) { diff --git a/src/backend/utils/activity/pgstat_io.c b/src/backend/utils/activity/pgstat_io.c index 9d6e067382..8af55989ee 100644 --- a/src/backend/utils/activity/pgstat_io.c +++ b/src/backend/utils/activity/pgstat_io.c @@ -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) { diff --git a/src/backend/utils/activity/pgstat_shmem.c b/src/backend/utils/activity/pgstat_shmem.c index 634b967820..1c2b69d563 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 kind = PGSTAT_KIND_FIRST_VALID; kind <= PGSTAT_KIND_LAST; kind++) + { + const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind); + char *ptr; - for (int i = 0; i < BACKEND_NUM_TYPES; i++) - LWLockInitialize(&ctl->io.locks[i], - LWTRANCHE_PGSTATS_DATA); + 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 56ea1c3378..6f922a85bf 100644 --- a/src/backend/utils/activity/pgstat_slru.c +++ b/src/backend/utils/activity/pgstat_slru.c @@ -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) { diff --git a/src/backend/utils/activity/pgstat_wal.c b/src/backend/utils/activity/pgstat_wal.c index 0e374f133a..e2a3f6b865 100644 --- a/src/backend/utils/activity/pgstat_wal.c +++ b/src/backend/utils/activity/pgstat_wal.c @@ -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) { diff --git a/src/include/utils/pgstat_internal.h b/src/include/utils/pgstat_internal.h index 43d6deb03c..778f625ca1 100644 --- a/src/include/utils/pgstat_internal.h +++ b/src/include/utils/pgstat_internal.h @@ -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);