Skip to content

Commit 21471f1

Browse files
committed
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 b68b29b, 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
1 parent cc22368 commit 21471f1

File tree

9 files changed

+79
-10
lines changed

9 files changed

+79
-10
lines changed

src/backend/utils/activity/pgstat.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,7 @@ static const PgStat_KindInfo pgstat_kind_infos[PGSTAT_NUM_KINDS] = {
354354
.shared_data_off = offsetof(PgStatShared_Archiver, stats),
355355
.shared_data_len = sizeof(((PgStatShared_Archiver *) 0)->stats),
356356

357+
.init_shmem_cb = pgstat_archiver_init_shmem_cb,
357358
.reset_all_cb = pgstat_archiver_reset_all_cb,
358359
.snapshot_cb = pgstat_archiver_snapshot_cb,
359360
},
@@ -368,6 +369,7 @@ static const PgStat_KindInfo pgstat_kind_infos[PGSTAT_NUM_KINDS] = {
368369
.shared_data_off = offsetof(PgStatShared_BgWriter, stats),
369370
.shared_data_len = sizeof(((PgStatShared_BgWriter *) 0)->stats),
370371

372+
.init_shmem_cb = pgstat_bgwriter_init_shmem_cb,
371373
.reset_all_cb = pgstat_bgwriter_reset_all_cb,
372374
.snapshot_cb = pgstat_bgwriter_snapshot_cb,
373375
},
@@ -382,6 +384,7 @@ static const PgStat_KindInfo pgstat_kind_infos[PGSTAT_NUM_KINDS] = {
382384
.shared_data_off = offsetof(PgStatShared_Checkpointer, stats),
383385
.shared_data_len = sizeof(((PgStatShared_Checkpointer *) 0)->stats),
384386

387+
.init_shmem_cb = pgstat_checkpointer_init_shmem_cb,
385388
.reset_all_cb = pgstat_checkpointer_reset_all_cb,
386389
.snapshot_cb = pgstat_checkpointer_snapshot_cb,
387390
},
@@ -396,6 +399,7 @@ static const PgStat_KindInfo pgstat_kind_infos[PGSTAT_NUM_KINDS] = {
396399
.shared_data_off = offsetof(PgStatShared_IO, stats),
397400
.shared_data_len = sizeof(((PgStatShared_IO *) 0)->stats),
398401

402+
.init_shmem_cb = pgstat_io_init_shmem_cb,
399403
.reset_all_cb = pgstat_io_reset_all_cb,
400404
.snapshot_cb = pgstat_io_snapshot_cb,
401405
},
@@ -410,6 +414,7 @@ static const PgStat_KindInfo pgstat_kind_infos[PGSTAT_NUM_KINDS] = {
410414
.shared_data_off = offsetof(PgStatShared_SLRU, stats),
411415
.shared_data_len = sizeof(((PgStatShared_SLRU *) 0)->stats),
412416

417+
.init_shmem_cb = pgstat_slru_init_shmem_cb,
413418
.reset_all_cb = pgstat_slru_reset_all_cb,
414419
.snapshot_cb = pgstat_slru_snapshot_cb,
415420
},
@@ -424,6 +429,7 @@ static const PgStat_KindInfo pgstat_kind_infos[PGSTAT_NUM_KINDS] = {
424429
.shared_data_off = offsetof(PgStatShared_Wal, stats),
425430
.shared_data_len = sizeof(((PgStatShared_Wal *) 0)->stats),
426431

432+
.init_shmem_cb = pgstat_wal_init_shmem_cb,
427433
.reset_all_cb = pgstat_wal_reset_all_cb,
428434
.snapshot_cb = pgstat_wal_snapshot_cb,
429435
},

src/backend/utils/activity/pgstat_archiver.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,14 @@ pgstat_fetch_stat_archiver(void)
6262
return &pgStatLocal.snapshot.archiver;
6363
}
6464

65+
void
66+
pgstat_archiver_init_shmem_cb(void *stats)
67+
{
68+
PgStatShared_Archiver *stats_shmem = (PgStatShared_Archiver *) stats;
69+
70+
LWLockInitialize(&stats_shmem->lock, LWTRANCHE_PGSTATS_DATA);
71+
}
72+
6573
void
6674
pgstat_archiver_reset_all_cb(TimestampTz ts)
6775
{

src/backend/utils/activity/pgstat_bgwriter.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,14 @@ pgstat_fetch_stat_bgwriter(void)
7575
return &pgStatLocal.snapshot.bgwriter;
7676
}
7777

78+
void
79+
pgstat_bgwriter_init_shmem_cb(void *stats)
80+
{
81+
PgStatShared_BgWriter *stats_shmem = (PgStatShared_BgWriter *) stats;
82+
83+
LWLockInitialize(&stats_shmem->lock, LWTRANCHE_PGSTATS_DATA);
84+
}
85+
7886
void
7987
pgstat_bgwriter_reset_all_cb(TimestampTz ts)
8088
{

src/backend/utils/activity/pgstat_checkpointer.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,14 @@ pgstat_fetch_stat_checkpointer(void)
8484
return &pgStatLocal.snapshot.checkpointer;
8585
}
8686

87+
void
88+
pgstat_checkpointer_init_shmem_cb(void *stats)
89+
{
90+
PgStatShared_Checkpointer *stats_shmem = (PgStatShared_Checkpointer *) stats;
91+
92+
LWLockInitialize(&stats_shmem->lock, LWTRANCHE_PGSTATS_DATA);
93+
}
94+
8795
void
8896
pgstat_checkpointer_reset_all_cb(TimestampTz ts)
8997
{

src/backend/utils/activity/pgstat_io.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,15 @@ pgstat_get_io_object_name(IOObject io_object)
251251
pg_unreachable();
252252
}
253253

254+
void
255+
pgstat_io_init_shmem_cb(void *stats)
256+
{
257+
PgStatShared_IO *stat_shmem = (PgStatShared_IO *) stats;
258+
259+
for (int i = 0; i < BACKEND_NUM_TYPES; i++)
260+
LWLockInitialize(&stat_shmem->locks[i], LWTRANCHE_PGSTATS_DATA);
261+
}
262+
254263
void
255264
pgstat_io_reset_all_cb(TimestampTz ts)
256265
{

src/backend/utils/activity/pgstat_shmem.c

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -196,17 +196,18 @@ StatsShmemInit(void)
196196

197197
pg_atomic_init_u64(&ctl->gc_request_count, 1);
198198

199-
200199
/* initialize fixed-numbered stats */
201-
LWLockInitialize(&ctl->archiver.lock, LWTRANCHE_PGSTATS_DATA);
202-
LWLockInitialize(&ctl->bgwriter.lock, LWTRANCHE_PGSTATS_DATA);
203-
LWLockInitialize(&ctl->checkpointer.lock, LWTRANCHE_PGSTATS_DATA);
204-
LWLockInitialize(&ctl->slru.lock, LWTRANCHE_PGSTATS_DATA);
205-
LWLockInitialize(&ctl->wal.lock, LWTRANCHE_PGSTATS_DATA);
206-
207-
for (int i = 0; i < BACKEND_NUM_TYPES; i++)
208-
LWLockInitialize(&ctl->io.locks[i],
209-
LWTRANCHE_PGSTATS_DATA);
200+
for (int kind = PGSTAT_KIND_FIRST_VALID; kind <= PGSTAT_KIND_LAST; kind++)
201+
{
202+
const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind);
203+
char *ptr;
204+
205+
if (!kind_info->fixed_amount)
206+
continue;
207+
208+
ptr = ((char *) ctl) + kind_info->shared_ctl_off;
209+
kind_info->init_shmem_cb(ptr);
210+
}
210211
}
211212
else
212213
{

src/backend/utils/activity/pgstat_slru.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,14 @@ pgstat_slru_flush(bool nowait)
192192
return false;
193193
}
194194

195+
void
196+
pgstat_slru_init_shmem_cb(void *stats)
197+
{
198+
PgStatShared_SLRU *stats_shmem = (PgStatShared_SLRU *) stats;
199+
200+
LWLockInitialize(&stats_shmem->lock, LWTRANCHE_PGSTATS_DATA);
201+
}
202+
195203
void
196204
pgstat_slru_reset_all_cb(TimestampTz ts)
197205
{

src/backend/utils/activity/pgstat_wal.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,14 @@ pgstat_have_pending_wal(void)
163163
PendingWalStats.wal_sync != 0;
164164
}
165165

166+
void
167+
pgstat_wal_init_shmem_cb(void *stats)
168+
{
169+
PgStatShared_Wal *stats_shmem = (PgStatShared_Wal *) stats;
170+
171+
LWLockInitialize(&stats_shmem->lock, LWTRANCHE_PGSTATS_DATA);
172+
}
173+
166174
void
167175
pgstat_wal_reset_all_cb(TimestampTz ts)
168176
{

src/include/utils/pgstat_internal.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,13 @@ typedef struct PgStat_KindInfo
251251
const PgStatShared_Common *header, NameData *name);
252252
bool (*from_serialized_name) (const NameData *name, PgStat_HashKey *key);
253253

254+
/*
255+
* For fixed-numbered statistics: Initialize shared memory state.
256+
*
257+
* "stats" is the pointer to the allocated shared memory area.
258+
*/
259+
void (*init_shmem_cb) (void *stats);
260+
254261
/*
255262
* For fixed-numbered statistics: Reset All.
256263
*/
@@ -528,6 +535,7 @@ extern void pgstat_snapshot_fixed(PgStat_Kind kind);
528535
* Functions in pgstat_archiver.c
529536
*/
530537

538+
extern void pgstat_archiver_init_shmem_cb(void *stats);
531539
extern void pgstat_archiver_reset_all_cb(TimestampTz ts);
532540
extern void pgstat_archiver_snapshot_cb(void);
533541

@@ -536,6 +544,7 @@ extern void pgstat_archiver_snapshot_cb(void);
536544
* Functions in pgstat_bgwriter.c
537545
*/
538546

547+
extern void pgstat_bgwriter_init_shmem_cb(void *stats);
539548
extern void pgstat_bgwriter_reset_all_cb(TimestampTz ts);
540549
extern void pgstat_bgwriter_snapshot_cb(void);
541550

@@ -544,6 +553,7 @@ extern void pgstat_bgwriter_snapshot_cb(void);
544553
* Functions in pgstat_checkpointer.c
545554
*/
546555

556+
extern void pgstat_checkpointer_init_shmem_cb(void *stats);
547557
extern void pgstat_checkpointer_reset_all_cb(TimestampTz ts);
548558
extern void pgstat_checkpointer_snapshot_cb(void);
549559

@@ -574,6 +584,7 @@ extern bool pgstat_function_flush_cb(PgStat_EntryRef *entry_ref, bool nowait);
574584
*/
575585

576586
extern bool pgstat_flush_io(bool nowait);
587+
extern void pgstat_io_init_shmem_cb(void *stats);
577588
extern void pgstat_io_reset_all_cb(TimestampTz ts);
578589
extern void pgstat_io_snapshot_cb(void);
579590

@@ -632,6 +643,7 @@ extern PgStatShared_Common *pgstat_init_entry(PgStat_Kind kind,
632643
*/
633644

634645
extern bool pgstat_slru_flush(bool nowait);
646+
extern void pgstat_slru_init_shmem_cb(void *stats);
635647
extern void pgstat_slru_reset_all_cb(TimestampTz ts);
636648
extern void pgstat_slru_snapshot_cb(void);
637649

@@ -644,6 +656,7 @@ extern bool pgstat_flush_wal(bool nowait);
644656
extern void pgstat_init_wal(void);
645657
extern bool pgstat_have_pending_wal(void);
646658

659+
extern void pgstat_wal_init_shmem_cb(void *stats);
647660
extern void pgstat_wal_reset_all_cb(TimestampTz ts);
648661
extern void pgstat_wal_snapshot_cb(void);
649662

0 commit comments

Comments
 (0)