Prevent lwlock dtrace probes from unnecessary work
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
This commit is contained in:
parent
c285babf8f
commit
b94409a02f
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user