Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitab62a64

Browse files
committed
pgstat: move transactional code into pgstat_xact.c.
The transactional integration code is largely independent from the rest ofpgstat.c. Subsequent commits will add more related code.Author: Andres Freund <andres@anarazel.de>Reviewed-By: Thomas Munro <thomas.munro@gmail.com>Discussion:https://postgr.es/m/20220404041516.cctrvpadhuriawlq@alap3.anarazel.de
1 parentc3e9b07 commitab62a64

File tree

5 files changed

+189
-163
lines changed

5 files changed

+189
-163
lines changed

‎src/backend/postmaster/pgstat.c

Lines changed: 30 additions & 154 deletions
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,6 @@ static time_t last_pgstat_start_time;
198198

199199
staticboolpgStatRunningInCollector= false;
200200

201-
staticPgStat_SubXactStatus*pgStatXactStack=NULL;
202-
203201
/*
204202
* Info about current "snapshot" of stats file
205203
*/
@@ -740,158 +738,6 @@ pgstat_initialize(void)
740738
}
741739

742740

743-
/* ------------------------------------------------------------
744-
* Transaction integration
745-
* ------------------------------------------------------------
746-
*/
747-
748-
/*
749-
* Called from access/transam/xact.c at top-level transaction commit/abort.
750-
*/
751-
void
752-
AtEOXact_PgStat(boolisCommit,boolparallel)
753-
{
754-
PgStat_SubXactStatus*xact_state;
755-
756-
AtEOXact_PgStat_Database(isCommit,parallel);
757-
758-
/* handle transactional stats information */
759-
xact_state=pgStatXactStack;
760-
if (xact_state!=NULL)
761-
{
762-
Assert(xact_state->nest_level==1);
763-
Assert(xact_state->prev==NULL);
764-
765-
AtEOXact_PgStat_Relations(xact_state,isCommit);
766-
}
767-
pgStatXactStack=NULL;
768-
769-
/* Make sure any stats snapshot is thrown away */
770-
pgstat_clear_snapshot();
771-
}
772-
773-
/*
774-
* Called from access/transam/xact.c at subtransaction commit/abort.
775-
*/
776-
void
777-
AtEOSubXact_PgStat(boolisCommit,intnestDepth)
778-
{
779-
PgStat_SubXactStatus*xact_state;
780-
781-
/* merge the sub-transaction's transactional stats into the parent */
782-
xact_state=pgStatXactStack;
783-
if (xact_state!=NULL&&
784-
xact_state->nest_level >=nestDepth)
785-
{
786-
/* delink xact_state from stack immediately to simplify reuse case */
787-
pgStatXactStack=xact_state->prev;
788-
789-
AtEOSubXact_PgStat_Relations(xact_state,isCommit,nestDepth);
790-
791-
pfree(xact_state);
792-
}
793-
}
794-
795-
/*
796-
* Save the transactional stats state at 2PC transaction prepare.
797-
*/
798-
void
799-
AtPrepare_PgStat(void)
800-
{
801-
PgStat_SubXactStatus*xact_state;
802-
803-
xact_state=pgStatXactStack;
804-
if (xact_state!=NULL)
805-
{
806-
Assert(xact_state->nest_level==1);
807-
Assert(xact_state->prev==NULL);
808-
809-
AtPrepare_PgStat_Relations(xact_state);
810-
}
811-
}
812-
813-
/*
814-
* Clean up after successful PREPARE.
815-
*
816-
* Note: AtEOXact_PgStat is not called during PREPARE.
817-
*/
818-
void
819-
PostPrepare_PgStat(void)
820-
{
821-
PgStat_SubXactStatus*xact_state;
822-
823-
/*
824-
* We don't bother to free any of the transactional state, since it's all
825-
* in TopTransactionContext and will go away anyway.
826-
*/
827-
xact_state=pgStatXactStack;
828-
if (xact_state!=NULL)
829-
{
830-
Assert(xact_state->nest_level==1);
831-
Assert(xact_state->prev==NULL);
832-
833-
PostPrepare_PgStat_Relations(xact_state);
834-
}
835-
pgStatXactStack=NULL;
836-
837-
/* Make sure any stats snapshot is thrown away */
838-
pgstat_clear_snapshot();
839-
}
840-
841-
/*
842-
* Discard any data collected in the current transaction. Any subsequent
843-
* request will cause new snapshots to be read.
844-
*
845-
* This is also invoked during transaction commit or abort to discard
846-
* the no-longer-wanted snapshot.
847-
*/
848-
void
849-
pgstat_clear_snapshot(void)
850-
{
851-
pgstat_assert_is_up();
852-
853-
/* Release memory, if any was allocated */
854-
if (pgStatLocalContext)
855-
MemoryContextDelete(pgStatLocalContext);
856-
857-
/* Reset variables */
858-
pgStatLocalContext=NULL;
859-
pgStatDBHash=NULL;
860-
replSlotStatHash=NULL;
861-
subscriptionStatHash=NULL;
862-
863-
/*
864-
* Historically the backend_status.c facilities lived in this file, and
865-
* were reset with the same function. For now keep it that way, and
866-
* forward the reset request.
867-
*/
868-
pgstat_clear_backend_activity_snapshot();
869-
}
870-
871-
/*
872-
* Ensure (sub)transaction stack entry for the given nest_level exists, adding
873-
* it if needed.
874-
*/
875-
PgStat_SubXactStatus*
876-
pgstat_xact_stack_level_get(intnest_level)
877-
{
878-
PgStat_SubXactStatus*xact_state;
879-
880-
xact_state=pgStatXactStack;
881-
if (xact_state==NULL||xact_state->nest_level!=nest_level)
882-
{
883-
xact_state= (PgStat_SubXactStatus*)
884-
MemoryContextAlloc(TopTransactionContext,
885-
sizeof(PgStat_SubXactStatus));
886-
xact_state->nest_level=nest_level;
887-
xact_state->prev=pgStatXactStack;
888-
xact_state->first=NULL;
889-
pgStatXactStack=xact_state;
890-
}
891-
returnxact_state;
892-
}
893-
894-
895741
/* ------------------------------------------------------------
896742
* Public functions used by backends follow
897743
* ------------------------------------------------------------
@@ -1319,6 +1165,36 @@ pgstat_send_inquiry(TimestampTz clock_time, TimestampTz cutoff_time, Oid databas
13191165
pgstat_send(&msg,sizeof(msg));
13201166
}
13211167

1168+
/*
1169+
* Discard any data collected in the current transaction. Any subsequent
1170+
* request will cause new snapshots to be read.
1171+
*
1172+
* This is also invoked during transaction commit or abort to discard
1173+
* the no-longer-wanted snapshot.
1174+
*/
1175+
void
1176+
pgstat_clear_snapshot(void)
1177+
{
1178+
pgstat_assert_is_up();
1179+
1180+
/* Release memory, if any was allocated */
1181+
if (pgStatLocalContext)
1182+
MemoryContextDelete(pgStatLocalContext);
1183+
1184+
/* Reset variables */
1185+
pgStatLocalContext=NULL;
1186+
pgStatDBHash=NULL;
1187+
replSlotStatHash=NULL;
1188+
subscriptionStatHash=NULL;
1189+
1190+
/*
1191+
* Historically the backend_status.c facilities lived in this file, and
1192+
* were reset with the same function. For now keep it that way, and
1193+
* forward the reset request.
1194+
*/
1195+
pgstat_clear_backend_activity_snapshot();
1196+
}
1197+
13221198
/*
13231199
* Support function for the SQL-callable pgstat* functions. Returns
13241200
* the collected statistics for one database or NULL. NULL doesn't mean

‎src/backend/utils/activity/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@ OBJS = \
2323
pgstat_function.o\
2424
pgstat_relation.o\
2525
pgstat_replslot.o\
26+
pgstat_slru.o\
2627
pgstat_subscription.o\
2728
pgstat_wal.o\
28-
pgstat_slru.o\
29+
pgstat_xact.o\
2930
wait_event.o
3031

3132
include$(top_srcdir)/src/backend/common.mk
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
/* -------------------------------------------------------------------------
2+
*
3+
* pgstat_xact.c
4+
* Transactional integration for the cumulative statistics system.
5+
*
6+
* Copyright (c) 2001-2022, PostgreSQL Global Development Group
7+
*
8+
* IDENTIFICATION
9+
* src/backend/utils/activity/pgstat_xact.c
10+
* -------------------------------------------------------------------------
11+
*/
12+
13+
#include"postgres.h"
14+
15+
#include"access/transam.h"
16+
#include"access/xact.h"
17+
#include"pgstat.h"
18+
#include"utils/memutils.h"
19+
#include"utils/pgstat_internal.h"
20+
21+
22+
staticPgStat_SubXactStatus*pgStatXactStack=NULL;
23+
24+
25+
/*
26+
* Called from access/transam/xact.c at top-level transaction commit/abort.
27+
*/
28+
void
29+
AtEOXact_PgStat(boolisCommit,boolparallel)
30+
{
31+
PgStat_SubXactStatus*xact_state;
32+
33+
AtEOXact_PgStat_Database(isCommit,parallel);
34+
35+
/* handle transactional stats information */
36+
xact_state=pgStatXactStack;
37+
if (xact_state!=NULL)
38+
{
39+
Assert(xact_state->nest_level==1);
40+
Assert(xact_state->prev==NULL);
41+
42+
AtEOXact_PgStat_Relations(xact_state,isCommit);
43+
}
44+
pgStatXactStack=NULL;
45+
46+
/* Make sure any stats snapshot is thrown away */
47+
pgstat_clear_snapshot();
48+
}
49+
50+
/*
51+
* Called from access/transam/xact.c at subtransaction commit/abort.
52+
*/
53+
void
54+
AtEOSubXact_PgStat(boolisCommit,intnestDepth)
55+
{
56+
PgStat_SubXactStatus*xact_state;
57+
58+
/* merge the sub-transaction's transactional stats into the parent */
59+
xact_state=pgStatXactStack;
60+
if (xact_state!=NULL&&
61+
xact_state->nest_level >=nestDepth)
62+
{
63+
/* delink xact_state from stack immediately to simplify reuse case */
64+
pgStatXactStack=xact_state->prev;
65+
66+
AtEOSubXact_PgStat_Relations(xact_state,isCommit,nestDepth);
67+
68+
pfree(xact_state);
69+
}
70+
}
71+
72+
/*
73+
* Save the transactional stats state at 2PC transaction prepare.
74+
*/
75+
void
76+
AtPrepare_PgStat(void)
77+
{
78+
PgStat_SubXactStatus*xact_state;
79+
80+
xact_state=pgStatXactStack;
81+
if (xact_state!=NULL)
82+
{
83+
Assert(xact_state->nest_level==1);
84+
Assert(xact_state->prev==NULL);
85+
86+
AtPrepare_PgStat_Relations(xact_state);
87+
}
88+
}
89+
90+
/*
91+
* Clean up after successful PREPARE.
92+
*
93+
* Note: AtEOXact_PgStat is not called during PREPARE.
94+
*/
95+
void
96+
PostPrepare_PgStat(void)
97+
{
98+
PgStat_SubXactStatus*xact_state;
99+
100+
/*
101+
* We don't bother to free any of the transactional state, since it's all
102+
* in TopTransactionContext and will go away anyway.
103+
*/
104+
xact_state=pgStatXactStack;
105+
if (xact_state!=NULL)
106+
{
107+
Assert(xact_state->nest_level==1);
108+
Assert(xact_state->prev==NULL);
109+
110+
PostPrepare_PgStat_Relations(xact_state);
111+
}
112+
pgStatXactStack=NULL;
113+
114+
/* Make sure any stats snapshot is thrown away */
115+
pgstat_clear_snapshot();
116+
}
117+
118+
/*
119+
* Ensure (sub)transaction stack entry for the given nest_level exists, adding
120+
* it if needed.
121+
*/
122+
PgStat_SubXactStatus*
123+
pgstat_xact_stack_level_get(intnest_level)
124+
{
125+
PgStat_SubXactStatus*xact_state;
126+
127+
xact_state=pgStatXactStack;
128+
if (xact_state==NULL||xact_state->nest_level!=nest_level)
129+
{
130+
xact_state= (PgStat_SubXactStatus*)
131+
MemoryContextAlloc(TopTransactionContext,
132+
sizeof(PgStat_SubXactStatus));
133+
xact_state->nest_level=nest_level;
134+
xact_state->prev=pgStatXactStack;
135+
xact_state->first=NULL;
136+
pgStatXactStack=xact_state;
137+
}
138+
returnxact_state;
139+
}

‎src/include/pgstat.h

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -969,13 +969,6 @@ extern void PgstatCollectorMain(int argc, char *argv[]) pg_attribute_noreturn();
969969
/* Functions for backend initialization */
970970
externvoidpgstat_initialize(void);
971971

972-
/* transactional integration */
973-
externvoidAtEOXact_PgStat(boolisCommit,boolparallel);
974-
externvoidAtEOSubXact_PgStat(boolisCommit,intnestDepth);
975-
externvoidAtPrepare_PgStat(void);
976-
externvoidPostPrepare_PgStat(void);
977-
externvoidpgstat_clear_snapshot(void);
978-
979972
/* Functions called from backends */
980973
externvoidpgstat_report_stat(boolforce);
981974
externvoidpgstat_vacuum_stat(void);
@@ -986,6 +979,7 @@ extern void pgstat_reset_single_counter(Oid objectid, PgStat_Single_Reset_Type t
986979
externvoidpgstat_reset_shared_counters(constchar*);
987980

988981
/* stats accessors */
982+
externvoidpgstat_clear_snapshot(void);
989983
externPgStat_ArchiverStats*pgstat_fetch_stat_archiver(void);
990984
externPgStat_BgWriterStats*pgstat_fetch_stat_bgwriter(void);
991985
externPgStat_CheckpointerStats*pgstat_fetch_stat_checkpointer(void);
@@ -1157,6 +1151,16 @@ extern void pgstat_report_subscription_error(Oid subid, bool is_apply_error);
11571151
externvoidpgstat_report_subscription_drop(Oidsubid);
11581152

11591153

1154+
/*
1155+
* Functions in pgstat_xact.c
1156+
*/
1157+
1158+
externvoidAtEOXact_PgStat(boolisCommit,boolparallel);
1159+
externvoidAtEOSubXact_PgStat(boolisCommit,intnestDepth);
1160+
externvoidAtPrepare_PgStat(void);
1161+
externvoidPostPrepare_PgStat(void);
1162+
1163+
11601164
/*
11611165
* Functions in pgstat_wal.c
11621166
*/

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp