Avoid useless ReplicationOriginExitCleanup locking
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Mon, 15 Jan 2024 12:02:03 +0000 (13:02 +0100)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Mon, 15 Jan 2024 12:02:03 +0000 (13:02 +0100)
When session_replication_state is NULL, we can know there's nothing to
do with no lock acquisition.  Do that.

Author: Bharath Rupireddy <bharath.rupireddyforpostgres@gmail.com>
Discussion: https://postgr.es/m/CALj2ACX+YaeRU5xJqR4C7kLsTO_F7DBRNF8WgeHvJZcKtNuK_A@mail.gmail.com

src/backend/replication/logical/origin.c

index 21ed07e3aa3553e1836ca7830e3d96f0294c53f3..4ef3385c952f7eb33c9321b3bd55537174bde32f 100644 (file)
@@ -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;