From: Alvaro Herrera Date: Mon, 15 Jan 2024 12:02:03 +0000 (+0100) Subject: Avoid useless ReplicationOriginExitCleanup locking X-Git-Tag: REL_17_BETA1~1111 X-Git-Url: http://git.postgresql.org/gitweb/?a=commitdiff_plain;h=aa817c7496575b37fde6ea5e0cd65b26f29ea532;p=postgresql.git Avoid useless ReplicationOriginExitCleanup locking When session_replication_state is NULL, we can know there's nothing to do with no lock acquisition. Do that. Author: Bharath Rupireddy Discussion: https://postgr.es/m/CALj2ACX+YaeRU5xJqR4C7kLsTO_F7DBRNF8WgeHvJZcKtNuK_A@mail.gmail.com --- diff --git a/src/backend/replication/logical/origin.c b/src/backend/replication/logical/origin.c index 21ed07e3aa3..4ef3385c952 100644 --- a/src/backend/replication/logical/origin.c +++ b/src/backend/replication/logical/origin.c @@ -172,9 +172,10 @@ static ReplicationState *replication_states; static ReplicationStateCtl *replication_states_ctl; /* - * Backend-local, cached element from ReplicationState for use in a backend - * replaying remote commits, so we don't have to search ReplicationState for - * the backends current RepOriginId. + * We keep a pointer to this backend's ReplicationState to avoid having to + * search the replication_states array in replorigin_session_advance for each + * remote commit. (Ownership of a backend's own entry can only be changed by + * that backend.) */ static ReplicationState *session_replication_state = NULL; @@ -1056,10 +1057,12 @@ ReplicationOriginExitCleanup(int code, Datum arg) { ConditionVariable *cv = NULL; + if (session_replication_state == NULL) + return; + LWLockAcquire(ReplicationOriginLock, LW_EXCLUSIVE); - if (session_replication_state != NULL && - session_replication_state->acquired_by == MyProcPid) + if (session_replication_state->acquired_by == MyProcPid) { cv = &session_replication_state->origin_cv;