You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by gt...@apache.org on 2010/01/22 12:01:53 UTC

svn commit: r902057 - in /activemq/branches/activemq-5.3/activemq-core/src: main/java/org/apache/activemq/broker/ main/java/org/apache/activemq/state/ test/java/org/apache/activemq/transport/failover/

Author: gtully
Date: Fri Jan 22 11:01:53 2010
New Revision: 902057

URL: http://svn.apache.org/viewvc?rev=902057&view=rev
Log:
svn merge -c 902056 https://svn.apache.org/repos/asf/activemq/trunk - resolve intermittent failure of org.apache.activemq.bugs.AMQ2149Test as a result of https://issues.apache.org/activemq/browse/AMQ-2573. An new command to indicate when recovery is complete on a sub is needed to gate dispatch on a recovered connection, can do this for 5.4. An outstanding ack transaction is now ignored but an outstand send transaction can still cause a potential hang till we introduce the new recovery complete command

Added:
    activemq/branches/activemq-5.3/activemq-core/src/test/java/org/apache/activemq/transport/failover/FailoverConsumerOutstandingCommitTest.java
      - copied unchanged from r902056, activemq/trunk/activemq-core/src/test/java/org/apache/activemq/transport/failover/FailoverConsumerOutstandingCommitTest.java
Modified:
    activemq/branches/activemq-5.3/activemq-core/src/main/java/org/apache/activemq/broker/BrokerService.java
    activemq/branches/activemq-5.3/activemq-core/src/main/java/org/apache/activemq/state/ConnectionStateTracker.java

Modified: activemq/branches/activemq-5.3/activemq-core/src/main/java/org/apache/activemq/broker/BrokerService.java
URL: http://svn.apache.org/viewvc/activemq/branches/activemq-5.3/activemq-core/src/main/java/org/apache/activemq/broker/BrokerService.java?rev=902057&r1=902056&r2=902057&view=diff
==============================================================================
--- activemq/branches/activemq-5.3/activemq-core/src/main/java/org/apache/activemq/broker/BrokerService.java (original)
+++ activemq/branches/activemq-5.3/activemq-core/src/main/java/org/apache/activemq/broker/BrokerService.java Fri Jan 22 11:01:53 2010
@@ -506,7 +506,7 @@
     }
 
     public void stop() throws Exception {
-        if (!started.compareAndSet(true, false)) {
+        if (!started.get()) {
             return;
         }
         

Modified: activemq/branches/activemq-5.3/activemq-core/src/main/java/org/apache/activemq/state/ConnectionStateTracker.java
URL: http://svn.apache.org/viewvc/activemq/branches/activemq-5.3/activemq-core/src/main/java/org/apache/activemq/state/ConnectionStateTracker.java?rev=902057&r1=902056&r2=902057&view=diff
==============================================================================
--- activemq/branches/activemq-5.3/activemq-core/src/main/java/org/apache/activemq/state/ConnectionStateTracker.java (original)
+++ activemq/branches/activemq-5.3/activemq-core/src/main/java/org/apache/activemq/state/ConnectionStateTracker.java Fri Jan 22 11:01:53 2010
@@ -20,6 +20,7 @@
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.Map;
+import java.util.Vector;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.activemq.command.Command;
@@ -139,11 +140,28 @@
     }
 
     private void restoreTransactions(Transport transport, ConnectionState connectionState) throws IOException {
+        Vector<Command> toIgnore = new Vector<Command>();
         for (TransactionState transactionState : connectionState.getTransactionStates()) {
             if (LOG.isDebugEnabled()) {
                 LOG.debug("tx: " + transactionState.getId());
             }
             
+            // ignore any empty (ack) transaction
+            if (transactionState.getCommands().size() == 2) {
+                Command lastCommand = transactionState.getCommands().get(1);
+                if (lastCommand instanceof TransactionInfo) {
+                    TransactionInfo transactionInfo = (TransactionInfo) lastCommand;
+                    if (transactionInfo.getType() == TransactionInfo.COMMIT_ONE_PHASE) {
+                        if (LOG.isDebugEnabled()) {
+                            LOG.debug("not replaying empty (ack) tx: " + transactionState.getId());
+                        }
+                        toIgnore.add(lastCommand);
+                        continue;
+                    }
+                }
+            }
+            
+            // replay short lived producers that may have been involved in the transaction
             for (ProducerState producerState : transactionState.getProducerStates().values()) {
                 if (LOG.isDebugEnabled()) {
                     LOG.debug("tx replay producer :" + producerState.getInfo());
@@ -165,6 +183,13 @@
                 transport.oneway(producerState.getInfo().createRemoveCommand());
             }
         }
+        
+        for (Command command: toIgnore) {
+            // respond to the outstanding commit
+            Response response = new Response();
+            response.setCorrelationId(command.getCommandId());
+            transport.getTransportListener().onCommand(response);
+        }
     }
 
     /**
@@ -200,6 +225,9 @@
         // Restore the session's consumers
         for (Iterator iter3 = sessionState.getConsumerStates().iterator(); iter3.hasNext();) {
             ConsumerState consumerState = (ConsumerState)iter3.next();
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("restore consumer: " + consumerState.getInfo().getConsumerId());
+            }
             transport.oneway(consumerState.getInfo());
         }
     }