You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by cl...@apache.org on 2017/04/18 01:31:29 UTC

activemq-artemis git commit: ARTEMIS-1111 Fixing deadlock

Repository: activemq-artemis
Updated Branches:
  refs/heads/master ee261e736 -> bfc07a7e0


ARTEMIS-1111 Fixing deadlock

There is a deadlock on flow controlling
the lock is using the wrong method and that is causing some issues under perf load.


Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/bfc07a7e
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/bfc07a7e
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/bfc07a7e

Branch: refs/heads/master
Commit: bfc07a7e01827d663db7ca0901178d20bafb92d5
Parents: ee261e7
Author: Clebert Suconic <cl...@apache.org>
Authored: Mon Apr 17 14:14:12 2017 -0400
Committer: Clebert Suconic <cl...@apache.org>
Committed: Mon Apr 17 21:31:17 2017 -0400

----------------------------------------------------------------------
 .../amqp/broker/AMQPSessionCallback.java         |  9 ++++++---
 .../amqp/proton/AMQPConnectionContext.java       |  9 ++++-----
 .../amqp/proton/ProtonServerSenderContext.java   |  2 +-
 .../amqp/proton/handler/ProtonHandler.java       | 19 +++++++++++++++++--
 4 files changed, 28 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/bfc07a7e/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPSessionCallback.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPSessionCallback.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPSessionCallback.java
index 2682e0f..9e54d41 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPSessionCallback.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPSessionCallback.java
@@ -472,22 +472,25 @@ public class AMQPSessionCallback implements SessionCallback {
             connection.lock();
             try {
                receiver.flow(credits);
-               connection.flush();
             } finally {
                connection.unlock();
             }
+            connection.flush();
             return;
          }
          final PagingStore store = manager.getServer().getPagingManager().getPageStore(new SimpleString(address));
          store.checkMemory(new Runnable() {
             @Override
             public void run() {
-               synchronized (connection.getLock()) {
+               connection.lock();
+               try {
                   if (receiver.getRemoteCredit() <= threshold) {
                      receiver.flow(credits);
-                     connection.flush();
                   }
+               } finally {
+                  connection.unlock();
                }
+               connection.flush();
             }
          });
       } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/bfc07a7e/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPConnectionContext.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPConnectionContext.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPConnectionContext.java
index 2c968c7..0173631 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPConnectionContext.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPConnectionContext.java
@@ -24,7 +24,6 @@ import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
-import java.util.concurrent.locks.ReentrantLock;
 
 import io.netty.buffer.ByteBuf;
 import org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants;
@@ -129,16 +128,16 @@ public class AMQPConnectionContext extends ProtonInitializable implements EventH
       return false;
    }
 
-   public ReentrantLock getLock() {
-      return handler.getLock();
+   public boolean tryLock(long time, TimeUnit timeUnit) {
+      return handler.tryLock(time, timeUnit);
    }
 
    public void lock() {
-      handler.getLock().lock();
+      handler.lock();
    }
 
    public void unlock() {
-      handler.getLock().unlock();
+      handler.unlock();
    }
 
    public int capacity() {

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/bfc07a7e/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonServerSenderContext.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonServerSenderContext.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonServerSenderContext.java
index 4b66b52..ccc93b7 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonServerSenderContext.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonServerSenderContext.java
@@ -630,7 +630,7 @@ public class ProtonServerSenderContext extends ProtonInitializable implements Pr
 
          int size = nettyBuffer.writerIndex();
 
-         while (!connection.getLock().tryLock(1, TimeUnit.SECONDS)) {
+         while (!connection.tryLock(1, TimeUnit.SECONDS)) {
             if (closed || sender.getLocalState() == EndpointState.CLOSED) {
                // If we're waiting on the connection lock, the link might be in the process of closing.  If this happens
                // we return.

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/bfc07a7e/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/handler/ProtonHandler.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/handler/ProtonHandler.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/handler/ProtonHandler.java
index fc6cbf6..f1be934 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/handler/ProtonHandler.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/handler/ProtonHandler.java
@@ -114,8 +114,23 @@ public class ProtonHandler extends ProtonInitializable {
       }
    }
 
-   public ReentrantLock getLock() {
-      return lock;
+   public void lock() {
+      lock.lock();
+   }
+
+   public void unlock() {
+      lock.unlock();
+   }
+
+   public boolean tryLock(long time, TimeUnit timeUnit) {
+      try {
+         return lock.tryLock(time, timeUnit);
+      } catch (InterruptedException e) {
+
+         Thread.currentThread().interrupt();
+         return false;
+      }
+
    }
 
    public Transport getTransport() {