flexlock-v3b.patch

text/plain

Filename: flexlock-v3b.patch
Type: text/plain
Part: 0
Message: Re: FlexLocks

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/lmgr/procarraylock.c 12 6
diff --git a/src/backend/storage/lmgr/procarraylock.c b/src/backend/storage/lmgr/procarraylock.c
index 7cd4b6b..13b51cb 100644
--- a/src/backend/storage/lmgr/procarraylock.c
+++ b/src/backend/storage/lmgr/procarraylock.c
@@ -153,9 +153,10 @@ ProcArrayLockClearTransaction(TransactionId latestXid)
 {
 	volatile ProcArrayLockStruct *lock = ProcArrayLockPointer();
 	PGPROC	   *proc = MyProc;
-	int			extraWaits = 0;
 	bool		mustwait;
 
+	Assert(TransactionIdIsValid(latestXid));
+
 	HOLD_INTERRUPTS();
 
 	/* Acquire mutex.  Time spent holding mutex should be short! */
@@ -186,8 +187,11 @@ ProcArrayLockClearTransaction(TransactionId latestXid)
 		/* Rats, must wait. */
 		proc->flWaitLink = lock->ending;
 		lock->ending = proc;
-		if (!TransactionIdIsValid(lock->latest_ending_xid) ||
-				TransactionIdPrecedes(lock->latest_ending_xid, latestXid)) 
+		/*
+		 * lock->latest_ending_xid may be invalid, but invalid transaction
+		 * IDs always precede valid ones.
+		 */
+		if (TransactionIdPrecedes(lock->latest_ending_xid, latestXid)) 
 			lock->latest_ending_xid = latestXid;
 		mustwait = true;
 	}
@@ -202,7 +206,9 @@ ProcArrayLockClearTransaction(TransactionId latestXid)
 	 */
 	if (mustwait)
 	{
-		extraWaits += FlexLockWait(ProcArrayLock, 2);
+		int			extraWaits;
+
+		extraWaits = FlexLockWait(ProcArrayLock, 2);
 		while (extraWaits-- > 0)
 			PGSemaphoreUnlock(&proc->sem);
 	}
@@ -247,7 +253,7 @@ ProcArrayLockRelease(void)
 		ending = lock->ending;
 		vproc = ending;
 
-		while (vproc != NULL)
+		do
 		{
 			volatile PGXACT *pgxact = &ProcGlobal->allPgXact[vproc->pgprocno];
 
@@ -258,7 +264,7 @@ ProcArrayLockRelease(void)
 			pgxact->nxids = 0;
 			pgxact->overflowed = false;
 			vproc = vproc->flWaitLink;
-		}
+		} while (vproc != NULL);
 
 		/* Also advance global latestCompletedXid */
 		if (TransactionIdPrecedes(ShmemVariableCache->latestCompletedXid,