Prevent lwlock dtrace probes from unnecessary work
authorPeter Eisentraut <peter@eisentraut.org>
Mon, 3 May 2021 10:11:33 +0000 (12:11 +0200)
committerPeter Eisentraut <peter@eisentraut.org>
Mon, 3 May 2021 10:18:27 +0000 (12:18 +0200)
If dtrace is compiled in but disabled, the lwlock dtrace probes still
evaluate their arguments.  Since PostgreSQL 13, T_NAME(lock) does
nontrivial work, so it should be avoided if not needed.  To fix, make
these calls conditional on the *_ENABLED() macro corresponding to each
probe.

Reviewed-by: Craig Ringer <craig.ringer@enterprisedb.com>
Discussion: https://www.postgresql.org/message-id/CAGRY4nwxKUS_RvXFW-ugrZBYxPFFM5kjwKT5O+0+Stuga5b4+Q@mail.gmail.com

src/backend/storage/lmgr/lwlock.c

index 975d547f34b1e47baaced44e4ee1246746c82c08..55b9d7970ec387a1f6cb693c8f885e48757bbb4c 100644 (file)
@@ -1318,7 +1318,8 @@ LWLockAcquire(LWLock *lock, LWLockMode mode)
 #endif
 
                LWLockReportWaitStart(lock);
-               TRACE_POSTGRESQL_LWLOCK_WAIT_START(T_NAME(lock), mode);
+               if (TRACE_POSTGRESQL_LWLOCK_WAIT_START_ENABLED())
+                       TRACE_POSTGRESQL_LWLOCK_WAIT_START(T_NAME(lock), mode);
 
                for (;;)
                {
@@ -1340,7 +1341,8 @@ LWLockAcquire(LWLock *lock, LWLockMode mode)
                }
 #endif
 
-               TRACE_POSTGRESQL_LWLOCK_WAIT_DONE(T_NAME(lock), mode);
+               if (TRACE_POSTGRESQL_LWLOCK_WAIT_DONE_ENABLED())
+                       TRACE_POSTGRESQL_LWLOCK_WAIT_DONE(T_NAME(lock), mode);
                LWLockReportWaitEnd();
 
                LOG_LWDEBUG("LWLockAcquire", lock, "awakened");
@@ -1349,7 +1351,8 @@ LWLockAcquire(LWLock *lock, LWLockMode mode)
                result = false;
        }
 
-       TRACE_POSTGRESQL_LWLOCK_ACQUIRE(T_NAME(lock), mode);
+       if (TRACE_POSTGRESQL_LWLOCK_ACQUIRE_ENABLED())
+               TRACE_POSTGRESQL_LWLOCK_ACQUIRE(T_NAME(lock), mode);
 
        /* Add lock to list of locks held by this backend */
        held_lwlocks[num_held_lwlocks].lock = lock;
@@ -1400,14 +1403,16 @@ LWLockConditionalAcquire(LWLock *lock, LWLockMode mode)
                RESUME_INTERRUPTS();
 
                LOG_LWDEBUG("LWLockConditionalAcquire", lock, "failed");
-               TRACE_POSTGRESQL_LWLOCK_CONDACQUIRE_FAIL(T_NAME(lock), mode);
+               if (TRACE_POSTGRESQL_LWLOCK_CONDACQUIRE_FAIL_ENABLED())
+                       TRACE_POSTGRESQL_LWLOCK_CONDACQUIRE_FAIL(T_NAME(lock), mode);
        }
        else
        {
                /* Add lock to list of locks held by this backend */
                held_lwlocks[num_held_lwlocks].lock = lock;
                held_lwlocks[num_held_lwlocks++].mode = mode;
-               TRACE_POSTGRESQL_LWLOCK_CONDACQUIRE(T_NAME(lock), mode);
+               if (TRACE_POSTGRESQL_LWLOCK_CONDACQUIRE_ENABLED())
+                       TRACE_POSTGRESQL_LWLOCK_CONDACQUIRE(T_NAME(lock), mode);
        }
        return !mustwait;
 }
@@ -1479,7 +1484,8 @@ LWLockAcquireOrWait(LWLock *lock, LWLockMode mode)
 #endif
 
                        LWLockReportWaitStart(lock);
-                       TRACE_POSTGRESQL_LWLOCK_WAIT_START(T_NAME(lock), mode);
+                       if (TRACE_POSTGRESQL_LWLOCK_WAIT_START_ENABLED())
+                               TRACE_POSTGRESQL_LWLOCK_WAIT_START(T_NAME(lock), mode);
 
                        for (;;)
                        {
@@ -1497,7 +1503,8 @@ LWLockAcquireOrWait(LWLock *lock, LWLockMode mode)
                                Assert(nwaiters < MAX_BACKENDS);
                        }
 #endif
-                       TRACE_POSTGRESQL_LWLOCK_WAIT_DONE(T_NAME(lock), mode);
+                       if (TRACE_POSTGRESQL_LWLOCK_WAIT_DONE_ENABLED())
+                               TRACE_POSTGRESQL_LWLOCK_WAIT_DONE(T_NAME(lock), mode);
                        LWLockReportWaitEnd();
 
                        LOG_LWDEBUG("LWLockAcquireOrWait", lock, "awakened");
@@ -1527,7 +1534,8 @@ LWLockAcquireOrWait(LWLock *lock, LWLockMode mode)
                /* Failed to get lock, so release interrupt holdoff */
                RESUME_INTERRUPTS();
                LOG_LWDEBUG("LWLockAcquireOrWait", lock, "failed");
-               TRACE_POSTGRESQL_LWLOCK_ACQUIRE_OR_WAIT_FAIL(T_NAME(lock), mode);
+               if (TRACE_POSTGRESQL_LWLOCK_ACQUIRE_OR_WAIT_FAIL_ENABLED())
+                       TRACE_POSTGRESQL_LWLOCK_ACQUIRE_OR_WAIT_FAIL(T_NAME(lock), mode);
        }
        else
        {
@@ -1535,7 +1543,8 @@ LWLockAcquireOrWait(LWLock *lock, LWLockMode mode)
                /* Add lock to list of locks held by this backend */
                held_lwlocks[num_held_lwlocks].lock = lock;
                held_lwlocks[num_held_lwlocks++].mode = mode;
-               TRACE_POSTGRESQL_LWLOCK_ACQUIRE_OR_WAIT(T_NAME(lock), mode);
+               if (TRACE_POSTGRESQL_LWLOCK_ACQUIRE_OR_WAIT_ENABLED())
+                       TRACE_POSTGRESQL_LWLOCK_ACQUIRE_OR_WAIT(T_NAME(lock), mode);
        }
 
        return !mustwait;
@@ -1695,7 +1704,8 @@ LWLockWaitForVar(LWLock *lock, uint64 *valptr, uint64 oldval, uint64 *newval)
 #endif
 
                LWLockReportWaitStart(lock);
-               TRACE_POSTGRESQL_LWLOCK_WAIT_START(T_NAME(lock), LW_EXCLUSIVE);
+               if (TRACE_POSTGRESQL_LWLOCK_WAIT_START_ENABLED())
+                       TRACE_POSTGRESQL_LWLOCK_WAIT_START(T_NAME(lock), LW_EXCLUSIVE);
 
                for (;;)
                {
@@ -1714,7 +1724,8 @@ LWLockWaitForVar(LWLock *lock, uint64 *valptr, uint64 oldval, uint64 *newval)
                }
 #endif
 
-               TRACE_POSTGRESQL_LWLOCK_WAIT_DONE(T_NAME(lock), LW_EXCLUSIVE);
+               if (TRACE_POSTGRESQL_LWLOCK_WAIT_DONE_ENABLED())
+                       TRACE_POSTGRESQL_LWLOCK_WAIT_DONE(T_NAME(lock), LW_EXCLUSIVE);
                LWLockReportWaitEnd();
 
                LOG_LWDEBUG("LWLockWaitForVar", lock, "awakened");
@@ -1840,7 +1851,8 @@ LWLockRelease(LWLock *lock)
        /* nobody else can have that kind of lock */
        Assert(!(oldstate & LW_VAL_EXCLUSIVE));
 
-       TRACE_POSTGRESQL_LWLOCK_RELEASE(T_NAME(lock));
+       if (TRACE_POSTGRESQL_LWLOCK_RELEASE_ENABLED())
+               TRACE_POSTGRESQL_LWLOCK_RELEASE(T_NAME(lock));
 
        /*
         * We're still waiting for backends to get scheduled, don't wake them up