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>