aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/utils/activity/pgstat.c14
-rw-r--r--src/backend/utils/activity/pgstat_wal.c2
-rw-r--r--src/include/utils/pgstat_internal.h8
3 files changed, 20 insertions, 4 deletions
diff --git a/src/backend/utils/activity/pgstat.c b/src/backend/utils/activity/pgstat.c
index 612158f2b96..178b5ef65aa 100644
--- a/src/backend/utils/activity/pgstat.c
+++ b/src/backend/utils/activity/pgstat.c
@@ -441,6 +441,7 @@ static const PgStat_KindInfo pgstat_kind_builtin_infos[PGSTAT_KIND_BUILTIN_SIZE]
.shared_data_off = offsetof(PgStatShared_Wal, stats),
.shared_data_len = sizeof(((PgStatShared_Wal *) 0)->stats),
+ .init_backend_cb = pgstat_wal_init_backend_cb,
.init_shmem_cb = pgstat_wal_init_shmem_cb,
.reset_all_cb = pgstat_wal_reset_all_cb,
.snapshot_cb = pgstat_wal_snapshot_cb,
@@ -604,10 +605,19 @@ pgstat_initialize(void)
pgstat_attach_shmem();
- pgstat_init_wal();
-
pgstat_init_snapshot_fixed();
+ /* Backend initialization callbacks */
+ for (PgStat_Kind kind = PGSTAT_KIND_MIN; kind <= PGSTAT_KIND_MAX; kind++)
+ {
+ const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind);
+
+ if (kind_info == NULL || kind_info->init_backend_cb == NULL)
+ continue;
+
+ kind_info->init_backend_cb();
+ }
+
/* Set up a process-exit hook to clean up */
before_shmem_exit(pgstat_shutdown_hook, 0);
diff --git a/src/backend/utils/activity/pgstat_wal.c b/src/backend/utils/activity/pgstat_wal.c
index e2a3f6b865c..8c19c3f2fd5 100644
--- a/src/backend/utils/activity/pgstat_wal.c
+++ b/src/backend/utils/activity/pgstat_wal.c
@@ -138,7 +138,7 @@ pgstat_flush_wal(bool nowait)
}
void
-pgstat_init_wal(void)
+pgstat_wal_init_backend_cb(void)
{
/*
* Initialize prevWalUsage with pgWalUsage so that pgstat_flush_wal() can
diff --git a/src/include/utils/pgstat_internal.h b/src/include/utils/pgstat_internal.h
index fb132e439dc..25820cbf0a6 100644
--- a/src/include/utils/pgstat_internal.h
+++ b/src/include/utils/pgstat_internal.h
@@ -230,6 +230,12 @@ typedef struct PgStat_KindInfo
uint32 pending_size;
/*
+ * Perform custom actions when initializing a backend (standalone or under
+ * postmaster). Optional.
+ */
+ void (*init_backend_cb) (void);
+
+ /*
* For variable-numbered stats: flush pending stats. Required if pending
* data is used.
*/
@@ -673,9 +679,9 @@ extern void pgstat_slru_snapshot_cb(void);
*/
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_backend_cb(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);