recentglobalxmin.patch

application/octet-stream

Filename: recentglobalxmin.patch
Type: application/octet-stream
Part: 1
Message: Re: Storing hot members of PGPROC out of the band

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: unified
File+
src/backend/storage/ipc/procarray.c 24 5
diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c
index 19ff524..6986c57 100644
--- a/src/backend/storage/ipc/procarray.c
+++ b/src/backend/storage/ipc/procarray.c
@@ -1241,6 +1241,8 @@ GetSnapshotData(Snapshot snapshot)
 	int			count = 0;
 	int			subcount = 0;
 	bool		suboverflowed = false;
+	static TransactionId *xmins = NULL;
+	int			numProcs;
 
 	Assert(snapshot != NULL);
 
@@ -1276,6 +1278,15 @@ GetSnapshotData(Snapshot snapshot)
 					 errmsg("out of memory")));
 	}
 
+	if (xmins == NULL)
+	{
+		xmins = malloc(procArray->maxProcs * sizeof(TransactionId));
+		if (xmins == NULL)
+			ereport(ERROR,
+					(errcode(ERRCODE_OUT_OF_MEMORY),
+					 errmsg("out of memory")));
+	}
+
 	/*
 	 * It is sufficient to get shared lock on ProcArrayLock, even if we are
 	 * going to set MyProc->xmin.
@@ -1303,7 +1314,6 @@ GetSnapshotData(Snapshot snapshot)
 	if (!snapshot->takenDuringRecovery)
 	{
 		int *pgprocnos = arrayP->pgprocnos;
-		int			numProcs;
 
 		/*
 		 * Spin over procArray checking xid, xmin, and subxids.  The goal is
@@ -1319,13 +1329,13 @@ GetSnapshotData(Snapshot snapshot)
 
 			/* Ignore procs running LAZY VACUUM */
 			if (pgxact->vacuumFlags & PROC_IN_VACUUM)
+			{
+				xmins[index] = InvalidTransactionId;
 				continue;
+			}
 
 			/* Update globalxmin to be the smallest valid xmin */
-			xid = pgxact->xmin;	/* fetch just once */
-			if (TransactionIdIsNormal(xid) &&
-				TransactionIdPrecedes(xid, globalxmin))
-					globalxmin = xid;
+			xmins[index] = pgxact->xmin;	/* fetch just once */
 
 			/* Fetch xid just once - see GetNewTransactionId */
 			xid = pgxact->xid;
@@ -1386,6 +1396,7 @@ GetSnapshotData(Snapshot snapshot)
 	}
 	else
 	{
+		numProcs = 0;
 		/*
 		 * We're in hot standby, so get XIDs from KnownAssignedXids.
 		 *
@@ -1425,6 +1436,14 @@ GetSnapshotData(Snapshot snapshot)
 	 * different way of computing it than GetOldestXmin uses, but should give
 	 * the same result.
 	 */
+	for (index = 0; index < numProcs; index++)
+	{
+		TransactionId xid = xmins[index];
+		if (TransactionIdIsNormal(xid) &&
+			TransactionIdPrecedes(xid, globalxmin))
+			globalxmin = xid;
+	}
+
 	if (TransactionIdPrecedes(xmin, globalxmin))
 		globalxmin = xmin;