static bool pgStatRunningInCollector = false;
-static PgStat_SubXactStatus *pgStatXactStack = NULL;
-
/*
* Info about current "snapshot" of stats file
*/
}
-/* ------------------------------------------------------------
- * Transaction integration
- * ------------------------------------------------------------
- */
-
-/*
- * Called from access/transam/xact.c at top-level transaction commit/abort.
- */
-void
-AtEOXact_PgStat(bool isCommit, bool parallel)
-{
- PgStat_SubXactStatus *xact_state;
-
- AtEOXact_PgStat_Database(isCommit, parallel);
-
- /* handle transactional stats information */
- xact_state = pgStatXactStack;
- if (xact_state != NULL)
- {
- Assert(xact_state->nest_level == 1);
- Assert(xact_state->prev == NULL);
-
- AtEOXact_PgStat_Relations(xact_state, isCommit);
- }
- pgStatXactStack = NULL;
-
- /* Make sure any stats snapshot is thrown away */
- pgstat_clear_snapshot();
-}
-
-/*
- * Called from access/transam/xact.c at subtransaction commit/abort.
- */
-void
-AtEOSubXact_PgStat(bool isCommit, int nestDepth)
-{
- PgStat_SubXactStatus *xact_state;
-
- /* merge the sub-transaction's transactional stats into the parent */
- xact_state = pgStatXactStack;
- if (xact_state != NULL &&
- xact_state->nest_level >= nestDepth)
- {
- /* delink xact_state from stack immediately to simplify reuse case */
- pgStatXactStack = xact_state->prev;
-
- AtEOSubXact_PgStat_Relations(xact_state, isCommit, nestDepth);
-
- pfree(xact_state);
- }
-}
-
-/*
- * Save the transactional stats state at 2PC transaction prepare.
- */
-void
-AtPrepare_PgStat(void)
-{
- PgStat_SubXactStatus *xact_state;
-
- xact_state = pgStatXactStack;
- if (xact_state != NULL)
- {
- Assert(xact_state->nest_level == 1);
- Assert(xact_state->prev == NULL);
-
- AtPrepare_PgStat_Relations(xact_state);
- }
-}
-
-/*
- * Clean up after successful PREPARE.
- *
- * Note: AtEOXact_PgStat is not called during PREPARE.
- */
-void
-PostPrepare_PgStat(void)
-{
- PgStat_SubXactStatus *xact_state;
-
- /*
- * We don't bother to free any of the transactional state, since it's all
- * in TopTransactionContext and will go away anyway.
- */
- xact_state = pgStatXactStack;
- if (xact_state != NULL)
- {
- Assert(xact_state->nest_level == 1);
- Assert(xact_state->prev == NULL);
-
- PostPrepare_PgStat_Relations(xact_state);
- }
- pgStatXactStack = NULL;
-
- /* Make sure any stats snapshot is thrown away */
- pgstat_clear_snapshot();
-}
-
-/*
- * Discard any data collected in the current transaction. Any subsequent
- * request will cause new snapshots to be read.
- *
- * This is also invoked during transaction commit or abort to discard
- * the no-longer-wanted snapshot.
- */
-void
-pgstat_clear_snapshot(void)
-{
- pgstat_assert_is_up();
-
- /* Release memory, if any was allocated */
- if (pgStatLocalContext)
- MemoryContextDelete(pgStatLocalContext);
-
- /* Reset variables */
- pgStatLocalContext = NULL;
- pgStatDBHash = NULL;
- replSlotStatHash = NULL;
- subscriptionStatHash = NULL;
-
- /*
- * Historically the backend_status.c facilities lived in this file, and
- * were reset with the same function. For now keep it that way, and
- * forward the reset request.
- */
- pgstat_clear_backend_activity_snapshot();
-}
-
-/*
- * Ensure (sub)transaction stack entry for the given nest_level exists, adding
- * it if needed.
- */
-PgStat_SubXactStatus *
-pgstat_xact_stack_level_get(int nest_level)
-{
- PgStat_SubXactStatus *xact_state;
-
- xact_state = pgStatXactStack;
- if (xact_state == NULL || xact_state->nest_level != nest_level)
- {
- xact_state = (PgStat_SubXactStatus *)
- MemoryContextAlloc(TopTransactionContext,
- sizeof(PgStat_SubXactStatus));
- xact_state->nest_level = nest_level;
- xact_state->prev = pgStatXactStack;
- xact_state->first = NULL;
- pgStatXactStack = xact_state;
- }
- return xact_state;
-}
-
-
/* ------------------------------------------------------------
* Public functions used by backends follow
* ------------------------------------------------------------
pgstat_send(&msg, sizeof(msg));
}
+/*
+ * Discard any data collected in the current transaction. Any subsequent
+ * request will cause new snapshots to be read.
+ *
+ * This is also invoked during transaction commit or abort to discard
+ * the no-longer-wanted snapshot.
+ */
+void
+pgstat_clear_snapshot(void)
+{
+ pgstat_assert_is_up();
+
+ /* Release memory, if any was allocated */
+ if (pgStatLocalContext)
+ MemoryContextDelete(pgStatLocalContext);
+
+ /* Reset variables */
+ pgStatLocalContext = NULL;
+ pgStatDBHash = NULL;
+ replSlotStatHash = NULL;
+ subscriptionStatHash = NULL;
+
+ /*
+ * Historically the backend_status.c facilities lived in this file, and
+ * were reset with the same function. For now keep it that way, and
+ * forward the reset request.
+ */
+ pgstat_clear_backend_activity_snapshot();
+}
+
/*
* Support function for the SQL-callable pgstat* functions. Returns
* the collected statistics for one database or NULL. NULL doesn't mean
--- /dev/null
+/* -------------------------------------------------------------------------
+ *
+ * pgstat_xact.c
+ * Transactional integration for the cumulative statistics system.
+ *
+ * Copyright (c) 2001-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/activity/pgstat_xact.c
+ * -------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "access/transam.h"
+#include "access/xact.h"
+#include "pgstat.h"
+#include "utils/memutils.h"
+#include "utils/pgstat_internal.h"
+
+
+static PgStat_SubXactStatus *pgStatXactStack = NULL;
+
+
+/*
+ * Called from access/transam/xact.c at top-level transaction commit/abort.
+ */
+void
+AtEOXact_PgStat(bool isCommit, bool parallel)
+{
+ PgStat_SubXactStatus *xact_state;
+
+ AtEOXact_PgStat_Database(isCommit, parallel);
+
+ /* handle transactional stats information */
+ xact_state = pgStatXactStack;
+ if (xact_state != NULL)
+ {
+ Assert(xact_state->nest_level == 1);
+ Assert(xact_state->prev == NULL);
+
+ AtEOXact_PgStat_Relations(xact_state, isCommit);
+ }
+ pgStatXactStack = NULL;
+
+ /* Make sure any stats snapshot is thrown away */
+ pgstat_clear_snapshot();
+}
+
+/*
+ * Called from access/transam/xact.c at subtransaction commit/abort.
+ */
+void
+AtEOSubXact_PgStat(bool isCommit, int nestDepth)
+{
+ PgStat_SubXactStatus *xact_state;
+
+ /* merge the sub-transaction's transactional stats into the parent */
+ xact_state = pgStatXactStack;
+ if (xact_state != NULL &&
+ xact_state->nest_level >= nestDepth)
+ {
+ /* delink xact_state from stack immediately to simplify reuse case */
+ pgStatXactStack = xact_state->prev;
+
+ AtEOSubXact_PgStat_Relations(xact_state, isCommit, nestDepth);
+
+ pfree(xact_state);
+ }
+}
+
+/*
+ * Save the transactional stats state at 2PC transaction prepare.
+ */
+void
+AtPrepare_PgStat(void)
+{
+ PgStat_SubXactStatus *xact_state;
+
+ xact_state = pgStatXactStack;
+ if (xact_state != NULL)
+ {
+ Assert(xact_state->nest_level == 1);
+ Assert(xact_state->prev == NULL);
+
+ AtPrepare_PgStat_Relations(xact_state);
+ }
+}
+
+/*
+ * Clean up after successful PREPARE.
+ *
+ * Note: AtEOXact_PgStat is not called during PREPARE.
+ */
+void
+PostPrepare_PgStat(void)
+{
+ PgStat_SubXactStatus *xact_state;
+
+ /*
+ * We don't bother to free any of the transactional state, since it's all
+ * in TopTransactionContext and will go away anyway.
+ */
+ xact_state = pgStatXactStack;
+ if (xact_state != NULL)
+ {
+ Assert(xact_state->nest_level == 1);
+ Assert(xact_state->prev == NULL);
+
+ PostPrepare_PgStat_Relations(xact_state);
+ }
+ pgStatXactStack = NULL;
+
+ /* Make sure any stats snapshot is thrown away */
+ pgstat_clear_snapshot();
+}
+
+/*
+ * Ensure (sub)transaction stack entry for the given nest_level exists, adding
+ * it if needed.
+ */
+PgStat_SubXactStatus *
+pgstat_xact_stack_level_get(int nest_level)
+{
+ PgStat_SubXactStatus *xact_state;
+
+ xact_state = pgStatXactStack;
+ if (xact_state == NULL || xact_state->nest_level != nest_level)
+ {
+ xact_state = (PgStat_SubXactStatus *)
+ MemoryContextAlloc(TopTransactionContext,
+ sizeof(PgStat_SubXactStatus));
+ xact_state->nest_level = nest_level;
+ xact_state->prev = pgStatXactStack;
+ xact_state->first = NULL;
+ pgStatXactStack = xact_state;
+ }
+ return xact_state;
+}
/* Functions for backend initialization */
extern void pgstat_initialize(void);
-/* transactional integration */
-extern void AtEOXact_PgStat(bool isCommit, bool parallel);
-extern void AtEOSubXact_PgStat(bool isCommit, int nestDepth);
-extern void AtPrepare_PgStat(void);
-extern void PostPrepare_PgStat(void);
-extern void pgstat_clear_snapshot(void);
-
/* Functions called from backends */
extern void pgstat_report_stat(bool force);
extern void pgstat_vacuum_stat(void);
extern void pgstat_reset_shared_counters(const char *);
/* stats accessors */
+extern void pgstat_clear_snapshot(void);
extern PgStat_ArchiverStats *pgstat_fetch_stat_archiver(void);
extern PgStat_BgWriterStats *pgstat_fetch_stat_bgwriter(void);
extern PgStat_CheckpointerStats *pgstat_fetch_stat_checkpointer(void);
extern void pgstat_report_subscription_drop(Oid subid);
+/*
+ * Functions in pgstat_xact.c
+ */
+
+extern void AtEOXact_PgStat(bool isCommit, bool parallel);
+extern void AtEOSubXact_PgStat(bool isCommit, int nestDepth);
+extern void AtPrepare_PgStat(void);
+extern void PostPrepare_PgStat(void);
+
+
/*
* Functions in pgstat_wal.c
*/