You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by mm...@apache.org on 2019/09/06 16:49:22 UTC

[pulsar] branch master updated: Fix deadlock when resetting cursor (#5139)

This is an automated email from the ASF dual-hosted git repository.

mmerli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar.git


The following commit(s) were added to refs/heads/master by this push:
     new 00fc2e8  Fix deadlock when resetting cursor (#5139)
00fc2e8 is described below

commit 00fc2e8ed90645453115dff733094fef31c2379e
Author: Masahiro Sakamoto <ma...@yahoo-corp.jp>
AuthorDate: Sat Sep 7 01:49:16 2019 +0900

    Fix deadlock when resetting cursor (#5139)
---
 .../broker/service/persistent/PersistentSubscription.java    | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/persistent/PersistentSubscription.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/persistent/PersistentSubscription.java
index 99edfbb..20d64ed 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/persistent/PersistentSubscription.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/persistent/PersistentSubscription.java
@@ -622,10 +622,14 @@ public class PersistentSubscription implements Subscription {
         }
 
         final CompletableFuture<Void> disconnectFuture;
-        if (dispatcher != null && dispatcher.isConsumerConnected()) {
-            disconnectFuture = dispatcher.disconnectAllConsumers();
-        } else {
-            disconnectFuture = CompletableFuture.completedFuture(null);
+
+        // Lock the Subscription object before locking the Dispatcher object to avoid deadlocks
+        synchronized (this) {
+            if (dispatcher != null && dispatcher.isConsumerConnected()) {
+                disconnectFuture = dispatcher.disconnectAllConsumers();
+            } else {
+                disconnectFuture = CompletableFuture.completedFuture(null);
+            }
         }
 
         disconnectFuture.whenComplete((aVoid, throwable) -> {