agora inbox for [email protected]
help / color / mirror / Atom feed[PATCH v4 2/3] Adding XID generation count per backend
238+ messages / 2 participants
[nested] [flat]
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v3 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
The counter is not part of PgStat_BackendPending, because we want to avoid
an extra function call in this code path to increment the counter in
PendingBackendStats. The counter increment here behaves more or less the same as
we do for WAL statistics.
---
src/backend/access/transam/varsup.c | 2 ++
src/backend/utils/activity/pgstat_backend.c | 6 +++++-
src/include/pgstat.h | 3 +++
3 files changed, 10 insertions(+), 1 deletion(-)
10.1% src/backend/access/transam/
69.3% src/backend/utils/activity/
20.5% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index fe895787cb7..26c72cbe091 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -21,6 +21,7 @@
#include "access/xlogutils.h"
#include "commands/dbcommands.h"
#include "miscadmin.h"
+#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
@@ -257,6 +258,7 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ XidGenCount++;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index bf164854c4b..8b530c510b9 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -52,6 +52,8 @@ static WalUsage prevBackendWalUsage;
*/
static bool backend_has_xactstats = false;
+PgStat_Counter XidGenCount = 0;
+
/*
* Utility routines to report I/O stats for backends, kept here to avoid
* exposing PendingBackendStats to the outside world.
@@ -285,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += XidGenCount;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ XidGenCount = 0;
backend_has_xactstats = false;
}
@@ -317,7 +321,7 @@ pgstat_flush_backend(bool nowait, bits32 flags)
has_pending_data = true;
/* Some transaction data pending? */
- if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats)
+ if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && (backend_has_xactstats || XidGenCount > 0))
has_pending_data = true;
if (!has_pending_data)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9efc0e10ebf..94dd24b3eac 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -571,6 +572,8 @@ extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid,
extern bool pgstat_tracks_backend_bktype(BackendType bktype);
extern void pgstat_create_backend(ProcNumber procnum);
+extern PGDLLIMPORT PgStat_Counter XidGenCount;
+
/*
* Functions in pgstat_bgwriter.c
*/
--
2.34.1
--u6+Li7FU79Mt/lVd
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v3-0003-Adding-the-pg_stat_backend-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v4 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index f8c4dada7c9..72c8aa7650b 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -257,6 +258,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 47ce61e5093..5e509153656 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -285,9 +285,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0fdbaf79780..d78633cae44 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -492,6 +492,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -510,6 +511,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--jg9kqX3osLGO+8A7
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v4-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v5 2/3] Adding XID generation count per backend
@ 2025-08-08 15:58 Bertrand Drouvot <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Bertrand Drouvot @ 2025-08-08 15:58 UTC (permalink / raw)
This commit adds a new counter to record the number of XIDs generated per
backend. It will help to detect if a backend is consuming XIDs at a high rate.
Virtual transactions are not taken into account on purpose, we do want to track
only the XID where there is a risk of wraparound.
---
src/backend/access/transam/varsup.c | 4 ++++
src/backend/utils/activity/pgstat_backend.c | 2 ++
src/include/pgstat.h | 2 ++
3 files changed, 8 insertions(+)
43.8% src/backend/access/transam/
36.6% src/backend/utils/activity/
19.4% src/include/
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 1441a051773..fe625d00f7d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -24,6 +24,7 @@
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "utils/lsyscache.h"
+#include "utils/pgstat_internal.h"
#include "utils/syscache.h"
@@ -261,6 +262,9 @@ GetNewTransactionId(bool isSubXact)
/* LWLockRelease acts as barrier */
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
+ PendingBackendStats.pending_xid_count++;
+ backend_has_xactstats = true;
+ pgstat_report_fixed = true;
}
else
{
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 42bfb9cd38f..32ee48eab51 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -287,9 +287,11 @@ pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref)
shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit;
shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback;
+ shbackendent->stats.xid_count += PendingBackendStats.pending_xid_count;
PendingBackendStats.pending_xact_commit = 0;
PendingBackendStats.pending_xact_rollback = 0;
+ PendingBackendStats.pending_xid_count = 0;
backend_has_xactstats = false;
}
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 5d73c4dfbcf..780ca4b3ac0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -525,6 +525,7 @@ typedef struct PgStat_Backend
PgStat_WalCounters wal_counters;
PgStat_Counter xact_commit;
PgStat_Counter xact_rollback;
+ PgStat_Counter xid_count;
} PgStat_Backend;
/* ---------
@@ -543,6 +544,7 @@ typedef struct PgStat_BackendPending
*/
PgStat_Counter pending_xact_commit;
PgStat_Counter pending_xact_rollback;
+ PgStat_Counter pending_xid_count;
} PgStat_BackendPending;
/*
--
2.34.1
--uN5gGi2rtCNSVbpC
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v5-0003-Adding-the-pg_stat_backend_transaction-view.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
* [PATCH v47 6/9] rename cluster.c/h to repack.c/h
@ 2026-03-27 15:40 Álvaro Herrera <[email protected]>
0 siblings, 0 replies; 238+ messages in thread
From: Álvaro Herrera @ 2026-03-27 15:40 UTC (permalink / raw)
---
src/backend/commands/Makefile | 2 +-
src/backend/commands/matview.c | 2 +-
src/backend/commands/meson.build | 2 +-
src/backend/commands/{cluster.c => repack.c} | 6 +++---
src/backend/commands/repack_worker.c | 2 +-
src/backend/commands/tablecmds.c | 2 +-
src/backend/commands/vacuum.c | 2 +-
src/backend/libpq/pqmq.c | 2 +-
src/backend/postmaster/bgworker.c | 2 +-
src/backend/replication/logical/decode.c | 2 +-
src/backend/storage/ipc/procsignal.c | 2 +-
src/backend/tcop/postgres.c | 2 +-
src/backend/tcop/utility.c | 2 +-
src/include/commands/{cluster.h => repack.h} | 12 ++++++------
14 files changed, 21 insertions(+), 21 deletions(-)
rename src/backend/commands/{cluster.c => repack.c} (99%)
rename src/include/commands/{cluster.h => repack.h} (92%)
diff --git a/src/backend/commands/Makefile b/src/backend/commands/Makefile
index 6926bc44818..5b9d084977e 100644
--- a/src/backend/commands/Makefile
+++ b/src/backend/commands/Makefile
@@ -18,7 +18,6 @@ OBJS = \
amcmds.o \
analyze.o \
async.o \
- cluster.o \
collationcmds.o \
comment.o \
constraint.o \
@@ -51,6 +50,7 @@ OBJS = \
proclang.o \
propgraphcmds.o \
publicationcmds.o \
+ repack.o \
repack_worker.o \
schemacmds.o \
seclabel.o \
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index 539969d6eef..146a65dae8d 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -24,8 +24,8 @@
#include "catalog/namespace.h"
#include "catalog/pg_am.h"
#include "catalog/pg_opclass.h"
-#include "commands/cluster.h"
#include "commands/matview.h"
+#include "commands/repack.h"
#include "commands/tablecmds.h"
#include "commands/tablespace.h"
#include "executor/executor.h"
diff --git a/src/backend/commands/meson.build b/src/backend/commands/meson.build
index 4a0e6f0002b..9f258d566eb 100644
--- a/src/backend/commands/meson.build
+++ b/src/backend/commands/meson.build
@@ -6,7 +6,6 @@ backend_sources += files(
'amcmds.c',
'analyze.c',
'async.c',
- 'cluster.c',
'collationcmds.c',
'comment.c',
'constraint.c',
@@ -39,6 +38,7 @@ backend_sources += files(
'proclang.c',
'propgraphcmds.c',
'publicationcmds.c',
+ 'repack.c',
'repack_worker.c',
'schemacmds.c',
'seclabel.c',
diff --git a/src/backend/commands/cluster.c b/src/backend/commands/repack.c
similarity index 99%
rename from src/backend/commands/cluster.c
rename to src/backend/commands/repack.c
index c0220cb3380..9c807f75d71 100644
--- a/src/backend/commands/cluster.c
+++ b/src/backend/commands/repack.c
@@ -1,6 +1,6 @@
/*-------------------------------------------------------------------------
*
- * cluster.c
+ * repack.c
* REPACK a table; formerly known as CLUSTER. VACUUM FULL also uses
* parts of this code.
*
@@ -26,7 +26,7 @@
*
*
* IDENTIFICATION
- * src/backend/commands/cluster.c
+ * src/backend/commands/repack.c
*
*-------------------------------------------------------------------------
*/
@@ -52,9 +52,9 @@
#include "catalog/pg_control.h"
#include "catalog/pg_inherits.h"
#include "catalog/toasting.h"
-#include "commands/cluster.h"
#include "commands/defrem.h"
#include "commands/progress.h"
+#include "commands/repack.h"
#include "commands/repack_internal.h"
#include "commands/tablecmds.h"
#include "commands/vacuum.h"
diff --git a/src/backend/commands/repack_worker.c b/src/backend/commands/repack_worker.c
index 35ab1a25c42..106b2b60441 100644
--- a/src/backend/commands/repack_worker.c
+++ b/src/backend/commands/repack_worker.c
@@ -20,7 +20,7 @@
#include "access/xlog_internal.h"
#include "access/xlogutils.h"
#include "access/xlogwait.h"
-#include "commands/cluster.h"
+#include "commands/repack.h"
#include "commands/repack_internal.h"
#include "libpq/pqmq.h"
#include "replication/snapbuild.h"
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 1f61bc8520d..860d6def3eb 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -57,10 +57,10 @@
#include "catalog/storage.h"
#include "catalog/storage_xlog.h"
#include "catalog/toasting.h"
-#include "commands/cluster.h"
#include "commands/comment.h"
#include "commands/defrem.h"
#include "commands/event_trigger.h"
+#include "commands/repack.h"
#include "commands/sequence.h"
#include "commands/tablecmds.h"
#include "commands/tablespace.h"
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index 4f00c697bfb..b2a3d372631 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -38,9 +38,9 @@
#include "catalog/pg_database.h"
#include "catalog/pg_inherits.h"
#include "commands/async.h"
-#include "commands/cluster.h"
#include "commands/defrem.h"
#include "commands/progress.h"
+#include "commands/repack.h"
#include "commands/vacuum.h"
#include "miscadmin.h"
#include "nodes/makefuncs.h"
diff --git a/src/backend/libpq/pqmq.c b/src/backend/libpq/pqmq.c
index 1000b7bb06e..cbf6c5a004f 100644
--- a/src/backend/libpq/pqmq.c
+++ b/src/backend/libpq/pqmq.c
@@ -14,7 +14,7 @@
#include "postgres.h"
#include "access/parallel.h"
-#include "commands/cluster.h"
+#include "commands/repack.h"
#include "libpq/libpq.h"
#include "libpq/pqformat.h"
#include "libpq/pqmq.h"
diff --git a/src/backend/postmaster/bgworker.c b/src/backend/postmaster/bgworker.c
index 423ce9d8709..bc477361e7a 100644
--- a/src/backend/postmaster/bgworker.c
+++ b/src/backend/postmaster/bgworker.c
@@ -13,7 +13,7 @@
#include "postgres.h"
#include "access/parallel.h"
-#include "commands/cluster.h"
+#include "commands/repack.h"
#include "libpq/pqsignal.h"
#include "miscadmin.h"
#include "pgstat.h"
diff --git a/src/backend/replication/logical/decode.c b/src/backend/replication/logical/decode.c
index f172c0b2b40..8a969ddca41 100644
--- a/src/backend/replication/logical/decode.c
+++ b/src/backend/replication/logical/decode.c
@@ -33,7 +33,7 @@
#include "access/xlogreader.h"
#include "access/xlogrecord.h"
#include "catalog/pg_control.h"
-#include "commands/cluster.h"
+#include "commands/repack.h"
#include "replication/decode.h"
#include "replication/logical.h"
#include "replication/message.h"
diff --git a/src/backend/storage/ipc/procsignal.c b/src/backend/storage/ipc/procsignal.c
index dd980145ced..f02b9eb8312 100644
--- a/src/backend/storage/ipc/procsignal.c
+++ b/src/backend/storage/ipc/procsignal.c
@@ -19,7 +19,7 @@
#include "access/parallel.h"
#include "commands/async.h"
-#include "commands/cluster.h"
+#include "commands/repack.h"
#include "miscadmin.h"
#include "pgstat.h"
#include "port/pg_bitutils.h"
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index b2936d503b6..47a2960a197 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -36,10 +36,10 @@
#include "access/xact.h"
#include "catalog/pg_type.h"
#include "commands/async.h"
-#include "commands/cluster.h"
#include "commands/event_trigger.h"
#include "commands/explain_state.h"
#include "commands/prepare.h"
+#include "commands/repack.h"
#include "common/pg_prng.h"
#include "jit/jit.h"
#include "libpq/libpq.h"
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c
index 2b609bfc824..5f8c766c4be 100644
--- a/src/backend/tcop/utility.c
+++ b/src/backend/tcop/utility.c
@@ -26,7 +26,6 @@
#include "catalog/toasting.h"
#include "commands/alter.h"
#include "commands/async.h"
-#include "commands/cluster.h"
#include "commands/collationcmds.h"
#include "commands/comment.h"
#include "commands/conversioncmds.h"
@@ -46,6 +45,7 @@
#include "commands/proclang.h"
#include "commands/propgraphcmds.h"
#include "commands/publicationcmds.h"
+#include "commands/repack.h"
#include "commands/schemacmds.h"
#include "commands/seclabel.h"
#include "commands/sequence.h"
diff --git a/src/include/commands/cluster.h b/src/include/commands/repack.h
similarity index 92%
rename from src/include/commands/cluster.h
rename to src/include/commands/repack.h
index 81673ffad1a..195b65dfd42 100644
--- a/src/include/commands/cluster.h
+++ b/src/include/commands/repack.h
@@ -1,17 +1,17 @@
/*-------------------------------------------------------------------------
*
- * cluster.h
- * header file for postgres cluster command stuff
+ * repack.h
+ * header file for the REPACK command
*
* Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
* Portions Copyright (c) 1994-5, Regents of the University of California
*
- * src/include/commands/cluster.h
+ * src/include/commands/repack.h
*
*-------------------------------------------------------------------------
*/
-#ifndef CLUSTER_H
-#define CLUSTER_H
+#ifndef REPACK_H
+#define REPACK_H
#include <signal.h>
@@ -66,4 +66,4 @@ extern void RepackWorkerMain(Datum main_arg);
extern bool IsRepackWorker(void);
-#endif /* CLUSTER_H */
+#endif /* REPACK_H */
--
2.47.3
--2fxmamo6mu2qbxgv
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment;
filename="v47-0007-Fix-a-few-problems-in-index-build-progress-repor.patch"
^ permalink raw reply [nested|flat] 238+ messages in thread
end of thread, other threads:[~2026-03-27 15:40 UTC | newest]
Thread overview: 238+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v3 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v4 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2025-08-08 15:58 [PATCH v5 2/3] Adding XID generation count per backend Bertrand Drouvot <[email protected]>
2026-03-27 15:40 [PATCH v47 6/9] rename cluster.c/h to repack.c/h Álvaro Herrera <[email protected]>
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox