aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/utils/activity/pgstat.c56
-rw-r--r--src/include/utils/pgstat_internal.h6
2 files changed, 24 insertions, 38 deletions
diff --git a/src/backend/utils/activity/pgstat.c b/src/backend/utils/activity/pgstat.c
index c37c11b2ecb..65b937a85f4 100644
--- a/src/backend/utils/activity/pgstat.c
+++ b/src/backend/utils/activity/pgstat.c
@@ -349,6 +349,7 @@ static const PgStat_KindInfo pgstat_kind_infos[PGSTAT_NUM_KINDS] = {
.fixed_amount = true,
+ .snapshot_ctl_off = offsetof(PgStat_Snapshot, archiver),
.shared_ctl_off = offsetof(PgStat_ShmemControl, archiver),
.shared_data_off = offsetof(PgStatShared_Archiver, stats),
.shared_data_len = sizeof(((PgStatShared_Archiver *) 0)->stats),
@@ -362,6 +363,7 @@ static const PgStat_KindInfo pgstat_kind_infos[PGSTAT_NUM_KINDS] = {
.fixed_amount = true,
+ .snapshot_ctl_off = offsetof(PgStat_Snapshot, bgwriter),
.shared_ctl_off = offsetof(PgStat_ShmemControl, bgwriter),
.shared_data_off = offsetof(PgStatShared_BgWriter, stats),
.shared_data_len = sizeof(((PgStatShared_BgWriter *) 0)->stats),
@@ -375,6 +377,7 @@ static const PgStat_KindInfo pgstat_kind_infos[PGSTAT_NUM_KINDS] = {
.fixed_amount = true,
+ .snapshot_ctl_off = offsetof(PgStat_Snapshot, checkpointer),
.shared_ctl_off = offsetof(PgStat_ShmemControl, checkpointer),
.shared_data_off = offsetof(PgStatShared_Checkpointer, stats),
.shared_data_len = sizeof(((PgStatShared_Checkpointer *) 0)->stats),
@@ -388,6 +391,7 @@ static const PgStat_KindInfo pgstat_kind_infos[PGSTAT_NUM_KINDS] = {
.fixed_amount = true,
+ .snapshot_ctl_off = offsetof(PgStat_Snapshot, io),
.shared_ctl_off = offsetof(PgStat_ShmemControl, io),
.shared_data_off = offsetof(PgStatShared_IO, stats),
.shared_data_len = sizeof(((PgStatShared_IO *) 0)->stats),
@@ -401,6 +405,7 @@ static const PgStat_KindInfo pgstat_kind_infos[PGSTAT_NUM_KINDS] = {
.fixed_amount = true,
+ .snapshot_ctl_off = offsetof(PgStat_Snapshot, slru),
.shared_ctl_off = offsetof(PgStat_ShmemControl, slru),
.shared_data_off = offsetof(PgStatShared_SLRU, stats),
.shared_data_len = sizeof(((PgStatShared_SLRU *) 0)->stats),
@@ -414,6 +419,7 @@ static const PgStat_KindInfo pgstat_kind_infos[PGSTAT_NUM_KINDS] = {
.fixed_amount = true,
+ .snapshot_ctl_off = offsetof(PgStat_Snapshot, wal),
.shared_ctl_off = offsetof(PgStat_ShmemControl, wal),
.shared_data_off = offsetof(PgStatShared_Wal, stats),
.shared_data_len = sizeof(((PgStatShared_Wal *) 0)->stats),
@@ -1371,47 +1377,21 @@ pgstat_write_statsfile(void)
format_id = PGSTAT_FILE_FORMAT_ID;
write_chunk_s(fpout, &format_id);
- /*
- * XXX: The following could now be generalized to just iterate over
- * pgstat_kind_infos instead of knowing about the different kinds of
- * stats.
- */
-
- /*
- * Write archiver stats struct
- */
- pgstat_build_snapshot_fixed(PGSTAT_KIND_ARCHIVER);
- write_chunk_s(fpout, &pgStatLocal.snapshot.archiver);
-
- /*
- * Write bgwriter stats struct
- */
- pgstat_build_snapshot_fixed(PGSTAT_KIND_BGWRITER);
- write_chunk_s(fpout, &pgStatLocal.snapshot.bgwriter);
-
- /*
- * Write checkpointer stats struct
- */
- pgstat_build_snapshot_fixed(PGSTAT_KIND_CHECKPOINTER);
- write_chunk_s(fpout, &pgStatLocal.snapshot.checkpointer);
+ /* Write various stats structs for fixed number of objects */
+ for (int kind = PGSTAT_KIND_FIRST_VALID; kind <= PGSTAT_KIND_LAST; kind++)
+ {
+ char *ptr;
+ const PgStat_KindInfo *info = pgstat_get_kind_info(kind);
- /*
- * Write IO stats struct
- */
- pgstat_build_snapshot_fixed(PGSTAT_KIND_IO);
- write_chunk_s(fpout, &pgStatLocal.snapshot.io);
+ if (!info->fixed_amount)
+ continue;
- /*
- * Write SLRU stats struct
- */
- pgstat_build_snapshot_fixed(PGSTAT_KIND_SLRU);
- write_chunk_s(fpout, &pgStatLocal.snapshot.slru);
+ Assert(info->snapshot_ctl_off != 0);
- /*
- * Write WAL stats struct
- */
- pgstat_build_snapshot_fixed(PGSTAT_KIND_WAL);
- write_chunk_s(fpout, &pgStatLocal.snapshot.wal);
+ pgstat_build_snapshot_fixed(kind);
+ ptr = ((char *) &pgStatLocal.snapshot) + info->snapshot_ctl_off;
+ write_chunk(fpout, ptr, info->shared_data_len);
+ }
/*
* Walk through the stats entries
diff --git a/src/include/utils/pgstat_internal.h b/src/include/utils/pgstat_internal.h
index e21ef4e2c98..43d6deb03cf 100644
--- a/src/include/utils/pgstat_internal.h
+++ b/src/include/utils/pgstat_internal.h
@@ -200,6 +200,12 @@ typedef struct PgStat_KindInfo
uint32 shared_size;
/*
+ * The offset of the statistics struct in the cached statistics snapshot
+ * PgStat_Snapshot, for fixed-numbered statistics.
+ */
+ uint32 snapshot_ctl_off;
+
+ /*
* The offset of the statistics struct in the containing shared memory
* control structure PgStat_ShmemControl, for fixed-numbered statistics.
*/