You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by iv...@apache.org on 2014/05/27 12:52:50 UTC

svn commit: r1597744 - in /zookeeper/bookkeeper/branches/branch-4.2: CHANGES.txt bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/NIOServerFactory.java

Author: ivank
Date: Tue May 27 10:52:49 2014
New Revision: 1597744

URL: http://svn.apache.org/r1597744
Log:
BOOKKEEPER-752: Deadlock on NIOServer shutdown (sijie via ivank)

Modified:
    zookeeper/bookkeeper/branches/branch-4.2/CHANGES.txt
    zookeeper/bookkeeper/branches/branch-4.2/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/NIOServerFactory.java

Modified: zookeeper/bookkeeper/branches/branch-4.2/CHANGES.txt
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/branches/branch-4.2/CHANGES.txt?rev=1597744&r1=1597743&r2=1597744&view=diff
==============================================================================
--- zookeeper/bookkeeper/branches/branch-4.2/CHANGES.txt (original)
+++ zookeeper/bookkeeper/branches/branch-4.2/CHANGES.txt Tue May 27 10:52:49 2014
@@ -28,6 +28,8 @@ Release 4.2.3 - 2013-12-04
 
 	BOOKKEEPER-755: Incorrect number of seconds specified in a day (Joseph Redfern via fpj)
 
+        BOOKKEEPER-752: Deadlock on NIOServer shutdown (sijie via ivank)
+
     IMPROVEMENT:
 
         BOOKKEEPER-747: Implement register/unregister LedgerMetadataListener in MSLedgerManagerFactory (fpj via sijie)

Modified: zookeeper/bookkeeper/branches/branch-4.2/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/NIOServerFactory.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/branches/branch-4.2/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/NIOServerFactory.java?rev=1597744&r1=1597743&r2=1597744&view=diff
==============================================================================
--- zookeeper/bookkeeper/branches/branch-4.2/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/NIOServerFactory.java (original)
+++ zookeeper/bookkeeper/branches/branch-4.2/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/NIOServerFactory.java Tue May 27 10:52:49 2014
@@ -513,17 +513,23 @@ public class NIOServerFactory extends Th
             makeWritable(sk);
         }
 
-        synchronized public void sendResponse(ByteBuffer... bb) {
-            if (closed) {
-                return;
+        public void sendResponse(ByteBuffer... bb) {
+            synchronized (this) {
+                if (closed) {
+                    return;
+                }
+                sendBuffers(bb);
+                outstandingRequests--;
             }
-            sendBuffers(bb);
+            // acquire these monitors in order to avoid deadlock during shutdown
+            // it doesn't matter much whether we do this synchronusly with sendBuffers, as long as it happens
             synchronized (NIOServerFactory.this) {
-                outstandingRequests--;
-                // check throttling
-                if (outstandingRequests < outstandingLimit) {
-                    sk.selector().wakeup();
-                    enableRecv();
+                synchronized (this) {
+                    // check throttling
+                    if (outstandingRequests < outstandingLimit) {
+                        sk.selector().wakeup();
+                        enableRecv();
+                    }
                 }
             }
         }