Reduce more the number of calls to GetMaxBackends()
authorMichael Paquier <michael@paquier.xyz>
Thu, 10 Feb 2022 01:27:29 +0000 (10:27 +0900)
committerMichael Paquier <michael@paquier.xyz>
Thu, 10 Feb 2022 01:27:29 +0000 (10:27 +0900)
Some of the code paths changed by aa64f23 can reduce the number of times
GetMaxBackends() is called.  The performance gain is marginal, but most
of the code changed by this commit already did that.  Hence, let's be
clean and apply the same rule everywhere, for consistency.

Some of the code paths, like in deadlock.c, involve only assertions.
These are left unchanged.

Reviewed-by: Nathan Bossart, Robert Haas
Discussion: https://postgr.es/m/YgMpGZhPOjNfS7er@paquier.xyz

src/backend/commands/async.c
src/backend/storage/lmgr/lock.c
src/backend/utils/adt/lockfuncs.c

index d44001a49f37a3975437529424ad90a35c9af2a9..455d895a44a7c670c4b1955d5a742b088e54ed4e 100644 (file)
@@ -1633,6 +1633,7 @@ SignalBackends(void)
        int32      *pids;
        BackendId  *ids;
        int                     count;
+       int                     max_backends = GetMaxBackends();
 
        /*
         * Identify backends that we need to signal.  We don't want to send
@@ -1642,8 +1643,8 @@ SignalBackends(void)
         * XXX in principle these pallocs could fail, which would be bad. Maybe
         * preallocate the arrays?  They're not that large, though.
         */
-       pids = (int32 *) palloc(GetMaxBackends() * sizeof(int32));
-       ids = (BackendId *) palloc(GetMaxBackends() * sizeof(BackendId));
+       pids = (int32 *) palloc(max_backends * sizeof(int32));
+       ids = (BackendId *) palloc(max_backends * sizeof(BackendId));
        count = 0;
 
        LWLockAcquire(NotifyQueueLock, LW_EXCLUSIVE);
index 1528d788d0a70f04dd45d4466f5609223b7954e7..ee2e15c17e9cedff84427b50796a79b767f91157 100644 (file)
@@ -2924,6 +2924,7 @@ GetLockConflicts(const LOCKTAG *locktag, LOCKMODE lockmode, int *countp)
        LWLock     *partitionLock;
        int                     count = 0;
        int                     fast_count = 0;
+       int                     max_backends = GetMaxBackends();
 
        if (lockmethodid <= 0 || lockmethodid >= lengthof(LockMethods))
                elog(ERROR, "unrecognized lock method: %d", lockmethodid);
@@ -2942,12 +2943,12 @@ GetLockConflicts(const LOCKTAG *locktag, LOCKMODE lockmode, int *countp)
                        vxids = (VirtualTransactionId *)
                                MemoryContextAlloc(TopMemoryContext,
                                                                   sizeof(VirtualTransactionId) *
-                                                                  (GetMaxBackends() + max_prepared_xacts + 1));
+                                                                  (max_backends + max_prepared_xacts + 1));
        }
        else
                vxids = (VirtualTransactionId *)
                        palloc0(sizeof(VirtualTransactionId) *
-                                       (GetMaxBackends() + max_prepared_xacts + 1));
+                                       (max_backends + max_prepared_xacts + 1));
 
        /* Compute hash code and partition lock, and look up conflicting modes. */
        hashcode = LockTagHashCode(locktag);
@@ -3104,7 +3105,7 @@ GetLockConflicts(const LOCKTAG *locktag, LOCKMODE lockmode, int *countp)
 
        LWLockRelease(partitionLock);
 
-       if (count > GetMaxBackends() + max_prepared_xacts)      /* should never happen */
+       if (count > max_backends + max_prepared_xacts)  /* should never happen */
                elog(PANIC, "too many conflicting locks found");
 
        vxids[count].backendId = InvalidBackendId;
index 4e517b28e1779c98d42d63805d103145ebb57ec2..944cd6df03fafe43001715480109aab39448c00b 100644 (file)
@@ -559,13 +559,14 @@ pg_safe_snapshot_blocking_pids(PG_FUNCTION_ARGS)
        int                *blockers;
        int                     num_blockers;
        Datum      *blocker_datums;
+       int                     max_backends = GetMaxBackends();
 
        /* A buffer big enough for any possible blocker list without truncation */
-       blockers = (int *) palloc(GetMaxBackends() * sizeof(int));
+       blockers = (int *) palloc(max_backends * sizeof(int));
 
        /* Collect a snapshot of processes waited for by GetSafeSnapshot */
        num_blockers =
-               GetSafeSnapshotBlockingPids(blocked_pid, blockers, GetMaxBackends());
+               GetSafeSnapshotBlockingPids(blocked_pid, blockers, max_backends);
 
        /* Convert int array to Datum array */
        if (num_blockers > 0)