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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy