You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by cu...@apache.org on 2012/03/02 23:09:30 UTC

svn commit: r1296492 - in /avro/trunk: CHANGES.txt lang/java/ipc/src/main/java/org/apache/avro/ipc/NettyTransceiver.java

Author: cutting
Date: Fri Mar  2 22:09:30 2012
New Revision: 1296492

URL: http://svn.apache.org/viewvc?rev=1296492&view=rev
Log:
AVRO-1027. Java: Fix deadlock in NettyTransceiver.  Contributed by jbaldassari.

Modified:
    avro/trunk/CHANGES.txt
    avro/trunk/lang/java/ipc/src/main/java/org/apache/avro/ipc/NettyTransceiver.java

Modified: avro/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/avro/trunk/CHANGES.txt?rev=1296492&r1=1296491&r2=1296492&view=diff
==============================================================================
--- avro/trunk/CHANGES.txt (original)
+++ avro/trunk/CHANGES.txt Fri Mar  2 22:09:30 2012
@@ -32,6 +32,9 @@ Avro 1.6.3 (unreleased)
     AVRO-1041. Java: Fix Utf8 to reuse array in more cases.
     (Dave Irving via cutting)
 
+    AVRO-1027. Java: Fix deadlock in NettyTransceiver.
+    (jbaldassari via cutting)
+
 Avro 1.6.2 (13 February 2012)
 
   NEW FEATURES

Modified: avro/trunk/lang/java/ipc/src/main/java/org/apache/avro/ipc/NettyTransceiver.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/ipc/src/main/java/org/apache/avro/ipc/NettyTransceiver.java?rev=1296492&r1=1296491&r2=1296492&view=diff
==============================================================================
--- avro/trunk/lang/java/ipc/src/main/java/org/apache/avro/ipc/NettyTransceiver.java (original)
+++ avro/trunk/lang/java/ipc/src/main/java/org/apache/avro/ipc/NettyTransceiver.java Fri Mar  2 22:09:30 2012
@@ -28,7 +28,6 @@ import java.util.concurrent.ConcurrentHa
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -81,7 +80,7 @@ public class NettyTransceiver extends Tr
    * Read lock must be acquired whenever using non-final state.
    * Write lock must be acquired whenever modifying state.
    */
-  private final ReadWriteLock stateLock = new ReentrantReadWriteLock();
+  private final ReentrantReadWriteLock stateLock = new ReentrantReadWriteLock();
   private Channel channel;       // Synchronized on stateLock
   private Protocol remote;       // Synchronized on stateLock
 
@@ -280,6 +279,10 @@ public class NettyTransceiver extends Tr
       Throwable cause) {
     Channel channelToClose = null;
     Map<Integer, Callback<List<ByteBuffer>>> requestsToCancel = null;
+    boolean stateReadLockHeld = stateLock.getReadHoldCount() != 0;
+    if (stateReadLockHeld) {
+      stateLock.readLock().unlock();
+    }
     stateLock.writeLock().lock();
     try {
       if (channel != null) {
@@ -301,6 +304,9 @@ public class NettyTransceiver extends Tr
         }
       }
     } finally {
+      if (stateReadLockHeld) {
+        stateLock.readLock().lock();
+      }
       stateLock.writeLock().unlock();
     }