From 6897f0ec024582a570868939d3f34a6853374723 Mon Sep 17 00:00:00 2001 From: Alexander Korotkov Date: Thu, 4 Jul 2024 02:05:37 +0300 Subject: [PATCH] Optimize memory access in GetRunningTransactionData() e85662df44 made GetRunningTransactionData() calculate the oldest running transaction id within the current database. This commit optimized this calculation by performing a cheap transaction id comparison before fetching the process database id, while the latter could cause extra cache misses. Reported-by: Noah Misch Discussion: https://postgr.es/m/20240630231816.bf.nmisch%40google.com --- src/backend/storage/ipc/procarray.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c index 9fc930e98f8..16b5803d388 100644 --- a/src/backend/storage/ipc/procarray.c +++ b/src/backend/storage/ipc/procarray.c @@ -2753,8 +2753,6 @@ GetRunningTransactionData(void) */ for (index = 0; index < arrayP->numProcs; index++) { - int pgprocno = arrayP->pgprocnos[index]; - PGPROC *proc = &allProcs[pgprocno]; TransactionId xid; /* Fetch xid just once - see GetNewTransactionId */ @@ -2776,11 +2774,18 @@ GetRunningTransactionData(void) oldestRunningXid = xid; /* - * Also, update the oldest running xid within the current database. + * Also, update the oldest running xid within the current database. As + * fetching pgprocno and PGPROC could cause cache misses, we do cheap + * TransactionId comparison first. */ - if (proc->databaseId == MyDatabaseId && - TransactionIdPrecedes(xid, oldestDatabaseRunningXid)) - oldestDatabaseRunningXid = xid; + if (TransactionIdPrecedes(xid, oldestDatabaseRunningXid)) + { + int pgprocno = arrayP->pgprocnos[index]; + PGPROC *proc = &allProcs[pgprocno]; + + if (proc->databaseId == MyDatabaseId) + oldestDatabaseRunningXid = xid; + } if (ProcGlobal->subxidStates[index].overflowed) suboverflowed = true; -- 2.30.2