Author: tabish
Date: Tue Aug  7 22:02:28 2012
New Revision: 1370559

URL: http://svn.apache.org/viewvc?rev=1370559&view=rev
Log:
Refine the fix for: https://issues.apache.org/jira/browse/AMQ-3939 

The unit test was failing on slower hardware, some backups could be missed if 
the transport was processing the ConnectionControl command during the stop 
since the buildBackups method runs from there outside the reconnectMutex and 
not in the thread of the taskRunner. 

Modified:
    
activemq/trunk/activemq-core/src/main/java/org/apache/activemq/transport/failover/FailoverTransport.java
    
activemq/trunk/activemq-core/src/test/java/org/apache/activemq/transport/failover/FailoverBackupLeakTest.java

Modified: 
activemq/trunk/activemq-core/src/main/java/org/apache/activemq/transport/failover/FailoverTransport.java
URL: 
http://svn.apache.org/viewvc/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/transport/failover/FailoverTransport.java?rev=1370559&r1=1370558&r2=1370559&view=diff
==============================================================================
--- 
activemq/trunk/activemq-core/src/main/java/org/apache/activemq/transport/failover/FailoverTransport.java
 (original)
+++ 
activemq/trunk/activemq-core/src/main/java/org/apache/activemq/transport/failover/FailoverTransport.java
 Tue Aug  7 22:02:28 2012
@@ -355,15 +355,6 @@ public class FailoverTransport implement
             started = false;
             disposed = true;
             connected = false;
-            for (BackupTransport backup : backups) {
-                backup.setDisposed(true);
-                Transport transport = backup.getTransport();
-                if (transport != null) {
-                    transport.setTransportListener(disposedListener);
-                    backupsToStop.add(transport);
-                }
-            }
-            backups.clear();
 
             if (connectedTransport.get() != null) {
                 transportToStop = connectedTransport.getAndSet(null);
@@ -374,15 +365,29 @@ public class FailoverTransport implement
             sleepMutex.notifyAll();
         }
         reconnectTask.shutdown();
-        if (transportToStop != null) {
-            transportToStop.stop();
+        synchronized(backupMutex) {
+            for (BackupTransport backup : backups) {
+                backup.setDisposed(true);
+                Transport transport = backup.getTransport();
+                if (transport != null) {
+                    transport.setTransportListener(disposedListener);
+                    backupsToStop.add(transport);
+                }
+            }
+            backups.clear();
         }
         for (Transport transport : backupsToStop) {
             try {
+                if (LOG.isTraceEnabled()) {
+                    LOG.trace("Stopped backup: " + transport);
+                }
                 disposeTransport(transport);
             } catch (Exception e) {
             }
         }
+        if (transportToStop != null) {
+            transportToStop.stop();
+        }
     }
 
     public long getInitialReconnectDelay() {

Modified: 
activemq/trunk/activemq-core/src/test/java/org/apache/activemq/transport/failover/FailoverBackupLeakTest.java
URL: 
http://svn.apache.org/viewvc/activemq/trunk/activemq-core/src/test/java/org/apache/activemq/transport/failover/FailoverBackupLeakTest.java?rev=1370559&r1=1370558&r2=1370559&view=diff
==============================================================================
--- 
activemq/trunk/activemq-core/src/test/java/org/apache/activemq/transport/failover/FailoverBackupLeakTest.java
 (original)
+++ 
activemq/trunk/activemq-core/src/test/java/org/apache/activemq/transport/failover/FailoverBackupLeakTest.java
 Tue Aug  7 22:02:28 2012
@@ -92,7 +92,7 @@ public class FailoverBackupLeakTest {
             buildConnection(factory);
         }
 
-        assertTrue(connectionProperties +  " broker1 connection count not 
zero", Wait.waitFor(new Wait.Condition() {
+        assertTrue(connectionProperties +  " broker1 connection count not 
zero: was["+getConnectionCount(s1)+"]", Wait.waitFor(new Wait.Condition() {
 
             @Override
             public boolean isSatisified() throws Exception {
@@ -100,7 +100,7 @@ public class FailoverBackupLeakTest {
             }
         }));
 
-        assertTrue(connectionProperties +  " broker2 connection count not 
zero", Wait.waitFor(new Wait.Condition() {
+        assertTrue(connectionProperties +  " broker2 connection count not 
zero: was["+getConnectionCount(s2)+"]", Wait.waitFor(new Wait.Condition() {
 
             @Override
             public boolean isSatisified() throws Exception {


Reply via email to