Author: rhs
Date: Thu Jun  5 10:53:32 2008
New Revision: 663677

URL: http://svn.apache.org/viewvc?rev=663677&view=rev
Log:
QPID-1116: fixed a race condition in connection/session close, session close 
now waits for the session to be detached before returning, this guarantees we 
won't have any active sessions when the connection close is attempted

Modified:
    
incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_0_10.java
    
incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_10.java
    
incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/nclient/Client.java
    
incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/nclient/Session.java
    
incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/ChannelDelegate.java
    
incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/Session.java
    incubator/qpid/trunk/qpid/java/log4j-test.xml

Modified: 
incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_0_10.java
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_0_10.java?rev=663677&r1=663676&r2=663677&view=diff
==============================================================================
--- 
incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_0_10.java
 (original)
+++ 
incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_0_10.java
 Thu Jun  5 10:53:32 2008
@@ -152,7 +152,7 @@
     {
         if (_logger.isDebugEnabled())
         {
-            _logger.debug("Received a connection close from the broker: Error 
code : " + errorCode.getCode());
+            _logger.debug("Received a connection close from the broker: Error 
code : " + errorCode.getCode(), t);
         }
         if (_conn._exceptionListener != null)
         {

Modified: 
incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_10.java
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_10.java?rev=663677&r1=663676&r2=663677&view=diff
==============================================================================
--- 
incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_10.java
 (original)
+++ 
incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_10.java
 Thu Jun  5 10:53:32 2008
@@ -210,8 +210,7 @@
     public void sendClose(long timeout) throws AMQException, FailoverException
     {
         getQpidSession().sync();
-        getQpidSession().sessionRequestTimeout(0);
-        getQpidSession().sessionDetach(getQpidSession().getName());
+        getQpidSession().close();
         getCurrentException();
     }
 

Modified: 
incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/nclient/Client.java
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/nclient/Client.java?rev=663677&r1=663676&r2=663677&view=diff
==============================================================================
--- 
incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/nclient/Client.java
 (original)
+++ 
incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/nclient/Client.java
 Thu Jun  5 10:53:32 2008
@@ -21,6 +21,7 @@
 
 import java.util.List;
 import java.util.UUID;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.Lock;
@@ -266,7 +267,7 @@
                     closeOk.await(timeout - elapsed, TimeUnit.MILLISECONDS);
                     elapsed = System.currentTimeMillis() - start;
                 }
-                if(! closed )
+                if(!closed)
                 {
                     throw new QpidException("Timed out when closing 
connection", ErrorCode.CONNECTION_ERROR, null);
                 }

Modified: 
incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/nclient/Session.java
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/nclient/Session.java?rev=663677&r1=663676&r2=663677&view=diff
==============================================================================
--- 
incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/nclient/Session.java
 (original)
+++ 
incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/nclient/Session.java
 Thu Jun  5 10:53:32 2008
@@ -63,6 +63,8 @@
      */
     public void sync();
 
+    public void close();
+
     public void sessionDetach(byte[] name);
 
     public void sessionRequestTimeout(long expiry);

Modified: 
incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/ChannelDelegate.java
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/ChannelDelegate.java?rev=663677&r1=663676&r2=663677&view=diff
==============================================================================
--- 
incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/ChannelDelegate.java
 (original)
+++ 
incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/ChannelDelegate.java
 Thu Jun  5 10:53:32 2008
@@ -42,9 +42,6 @@
     public @Override void sessionDetached(Channel channel, SessionDetached 
closed)
     {
         channel.getSession().closed();
-        // XXX: should we remove the channel from the connection? It
-        // could have an external reference to it. Maybe we need a
-        // weak hash map in connection.
     }
 
     public @Override void sessionDetach(Channel channel, SessionDetach dtc)

Modified: 
incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/Session.java
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/Session.java?rev=663677&r1=663676&r2=663677&view=diff
==============================================================================
--- 
incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/Session.java
 (original)
+++ 
incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/transport/Session.java
 Thu Jun  5 10:53:32 2008
@@ -459,7 +459,23 @@
     {
         sessionRequestTimeout(0);
         sessionDetach(name);
-        // XXX: channel.close();
+        synchronized (commands)
+        {
+            long start = System.currentTimeMillis();
+            long elapsed = 0;
+            try
+            {
+                while (!closed.get() && elapsed < timeout)
+                {
+                    commands.wait(timeout - elapsed);
+                    elapsed = System.currentTimeMillis() - start;
+                }
+            }
+            catch (InterruptedException e)
+            {
+                throw new RuntimeException(e);
+            }
+        }
     }
 
     public void exception(Throwable t)
@@ -484,6 +500,9 @@
                 }
             }
         }
+        channel.close();
+        channel.setSession(null);
+        channel = null;
     }
 
     public String toString()

Modified: incubator/qpid/trunk/qpid/java/log4j-test.xml
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/log4j-test.xml?rev=663677&r1=663676&r2=663677&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/java/log4j-test.xml (original)
+++ incubator/qpid/trunk/qpid/java/log4j-test.xml Thu Jun  5 10:53:32 2008
@@ -35,11 +35,11 @@
   </appender>
 
   <logger name="org.apache.qpid">
-    <level value="warn"/>
+    <level value="debug"/>
   </logger>
 
   <root>
-    <level value="warn"/>
+    <level value="debug"/>
     <appender-ref ref="console" />
   </root>
 </log4j:configuration>


Reply via email to