You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudberry.apache.org by av...@apache.org on 2025/03/12 02:03:00 UTC

(cloudberry) branch main updated: Fix volatile qualifier discard and ensure safe access to PGPROC in lock.c

This is an automated email from the ASF dual-hosted git repository.

avamingli pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudberry.git


The following commit(s) were added to refs/heads/main by this push:
     new 644b4e3073 Fix volatile qualifier discard and ensure safe access to PGPROC in lock.c
644b4e3073 is described below

commit 644b4e307380954e986f048d0a7910a3063e524e
Author: Jianghua Yang <yj...@gmail.com>
AuthorDate: Wed Feb 26 12:29:37 2025 +0800

    Fix volatile qualifier discard and ensure safe access to PGPROC in lock.c
    
    Fix https://github.com/apache/cloudberry/issues/958
---
 src/backend/storage/ipc/procarray.c | 4 ++--
 src/backend/storage/lmgr/lock.c     | 9 +++++++--
 src/include/storage/procarray.h     | 2 +-
 3 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c
index f16b8f4243..3154caba1b 100644
--- a/src/backend/storage/ipc/procarray.c
+++ b/src/backend/storage/ipc/procarray.c
@@ -5024,7 +5024,7 @@ DisplayXidCache(void)
 }
 #endif							/* XIDCACHE_DEBUG */
 
-PGPROC *
+volatile PGPROC *
 FindProcByGpSessionId(long gp_session_id)
 {
 	/* Find the guy who should manage our locks */
@@ -5037,7 +5037,7 @@ FindProcByGpSessionId(long gp_session_id)
 
 	for (index = 0; index < arrayP->numProcs; index++)
 	{
-		PGPROC	   *proc = &allProcs[arrayP->pgprocnos[index]];
+		volatile PGPROC	   *proc = &allProcs[arrayP->pgprocnos[index]];
 			
 		if (proc->pid == MyProc->pid)
 			continue;
diff --git a/src/backend/storage/lmgr/lock.c b/src/backend/storage/lmgr/lock.c
index 26a52b5859..90ea0a666e 100644
--- a/src/backend/storage/lmgr/lock.c
+++ b/src/backend/storage/lmgr/lock.c
@@ -936,19 +936,24 @@ LockAcquireExtended(const LOCKTAG *locktag,
 			if (lockHolderProcPtr == MyProc)
 			{
 				/* Find the guy who should manage our locks */
-				PGPROC * proc = FindProcByGpSessionId(gp_session_id);
+				volatile PGPROC * proc = FindProcByGpSessionId(gp_session_id);
 				int count = 0;
 				while(proc==NULL && count < 5)
 				{
 					pg_usleep( /* microseconds */ 2000);
 					count++;
 					CHECK_FOR_INTERRUPTS();
+					/*
+					 * The reason for using pg_memory_barrier() is to ensure that
+					 * all CPU cores can see the latest shared memory modifications.
+					 */
+					pg_memory_barrier();
 					proc = FindProcByGpSessionId(gp_session_id);
 				}
 				if (proc != NULL)
 				{
 					elog(DEBUG1,"Found writer proc entry.  My Pid %d, his pid %d", MyProc-> pid, proc->pid);
-					lockHolderProcPtr = proc;
+					lockHolderProcPtr = (PGPROC*) proc;
 				}
 				else
 					ereport(FATAL,
diff --git a/src/include/storage/procarray.h b/src/include/storage/procarray.h
index cecae9371d..607834e46c 100644
--- a/src/include/storage/procarray.h
+++ b/src/include/storage/procarray.h
@@ -99,7 +99,7 @@ extern void XidCacheRemoveRunningXids(TransactionId xid,
 									  int nxids, const TransactionId *xids,
 									  TransactionId latestXid);
 						  
-extern PGPROC *FindProcByGpSessionId(long gp_session_id);
+extern volatile PGPROC *FindProcByGpSessionId(long gp_session_id);
 extern void UpdateCommandIdInSnapshot(CommandId curcid);
 
 extern void updateSharedLocalSnapshot(struct DtxContextInfo *dtxContextInfo,


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cloudberry.apache.org
For additional commands, e-mail: commits-help@cloudberry.apache.org