diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/utils/activity/pgstat.c | 56 | ||||
-rw-r--r-- | src/include/utils/pgstat_internal.h | 6 |
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. */ |