aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/replication/slot.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index f5927b4d1d3..fb95b44ed82 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -351,20 +351,28 @@ retry:
if (s->in_use && strcmp(name, NameStr(s->data.name)) == 0)
{
/*
- * This is the slot we want. We don't know yet if it's active, so
- * get ready to sleep on it in case it is. (We may end up not
- * sleeping, but we don't want to do this while holding the
- * spinlock.)
+ * This is the slot we want; check if it's active under some other
+ * process. In single user mode, we don't need this check.
*/
- ConditionVariablePrepareToSleep(&s->active_cv);
+ if (IsUnderPostmaster)
+ {
+ /*
+ * Get ready to sleep on it in case it is active. (We may end
+ * up not sleeping, but we don't want to do this while holding
+ * the spinlock.)
+ */
+ ConditionVariablePrepareToSleep(&s->active_cv);
- SpinLockAcquire(&s->mutex);
+ SpinLockAcquire(&s->mutex);
- active_pid = s->active_pid;
- if (active_pid == 0)
- active_pid = s->active_pid = MyProcPid;
+ active_pid = s->active_pid;
+ if (active_pid == 0)
+ active_pid = s->active_pid = MyProcPid;
- SpinLockRelease(&s->mutex);
+ SpinLockRelease(&s->mutex);
+ }
+ else
+ active_pid = MyProcPid;
slot = s;
break;