You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ha...@apache.org on 2015/02/13 00:22:20 UTC

[1/6] activemq git commit: https://issues.apache.org/jira/browse/AMQ-5378 - document shell script configuration and enable using environment variables

Repository: activemq
Updated Branches:
  refs/heads/activemq-5.11.x 666f6f3b3 -> e5c5a821c


https://issues.apache.org/jira/browse/AMQ-5378 - document shell script configuration and enable using environment variables


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/b997bd48
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/b997bd48
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/b997bd48

Branch: refs/heads/activemq-5.11.x
Commit: b997bd480deb9d14c492a0eb7a2cf2eff2021c14
Parents: 666f6f3
Author: Dejan Bosanac <de...@nighttale.net>
Authored: Mon Feb 2 11:14:09 2015 +0100
Committer: Hadrian Zbarcea <ha...@apache.org>
Committed: Thu Feb 12 18:18:13 2015 -0500

----------------------------------------------------------------------
 assembly/src/release/bin/activemq |  6 ++++++
 assembly/src/release/bin/env      | 18 ++++++++++++------
 2 files changed, 18 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/b997bd48/assembly/src/release/bin/activemq
----------------------------------------------------------------------
diff --git a/assembly/src/release/bin/activemq b/assembly/src/release/bin/activemq
index ce94aef..100e0cd 100755
--- a/assembly/src/release/bin/activemq
+++ b/assembly/src/release/bin/activemq
@@ -24,6 +24,12 @@
 # See also http://activemq.apache.org/activemq-command-line-tools-reference.html
 # for additional commandline arguments
 #
+# System variables for this script, like ACTIVEMQ_OPTS and ACTIVEMQ_OPTS_MEMORY,
+# can be configured in 'env' script located in this directory.
+#
+# For more information on configuring the script, see http://activemq.apache.org/unix-shell-script.html
+#
+#
 # Authors:
 # Marc Schoechlin <ms...@256bit.org>
 

http://git-wip-us.apache.org/repos/asf/activemq/blob/b997bd48/assembly/src/release/bin/env
----------------------------------------------------------------------
diff --git a/assembly/src/release/bin/env b/assembly/src/release/bin/env
index 74c5de1..4369293 100644
--- a/assembly/src/release/bin/env
+++ b/assembly/src/release/bin/env
@@ -16,14 +16,16 @@
 # limitations under the License.
 # ------------------------------------------------------------------------
 # Configuration file for running Apache Active MQ as standalone provider
-#
-# This file overwrites the predefined settings of the sysv init-script
 
 
 # Set jvm memory configuration
-ACTIVEMQ_OPTS_MEMORY="-Xms1G -Xmx1G"
+if [ -z "$ACTIVEMQ_OPTS_MEMORY" ] ; then
+    ACTIVEMQ_OPTS_MEMORY="-Xms1G -Xmx1G"
+fi
 
-ACTIVEMQ_OPTS="$ACTIVEMQ_OPTS_MEMORY -Djava.util.logging.config.file=logging.properties -Djava.security.auth.login.config=$ACTIVEMQ_CONF/login.config"
+if [ -z "$ACTIVEMQ_OPTS" ] ; then
+    ACTIVEMQ_OPTS="$ACTIVEMQ_OPTS_MEMORY -Djava.util.logging.config.file=logging.properties -Djava.security.auth.login.config=$ACTIVEMQ_CONF/login.config"
+fi
 
 # Uncomment to enable audit logging
 #ACTIVEMQ_OPTS="$ACTIVEMQ_OPTS -Dorg.apache.activemq.audit=true"
@@ -65,7 +67,9 @@ ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote"
 ACTIVEMQ_SUNJMX_CONTROL=""
 
 # Specify the queue manager URL for using "browse" option of sysv initscript
-ACTIVEMQ_QUEUEMANAGERURL="--amqurl tcp://localhost:61616"
+if [ -z "$ACTIVEMQ_QUEUEMANAGERURL" ]; then
+    ACTIVEMQ_QUEUEMANAGERURL="--amqurl tcp://localhost:61616"
+fi
 
 # Set additional JSE arguments
 ACTIVEMQ_SSL_OPTS=""
@@ -75,7 +79,9 @@ ACTIVEMQ_SSL_OPTS=""
 
 # ActiveMQ tries to shutdown the broker by jmx,
 # after a specified number of seconds send SIGKILL
-ACTIVEMQ_KILL_MAXSECONDS=90
+if [ -z "$ACTIVEMQ_KILL_MAXSECONDS" ]; then
+    ACTIVEMQ_KILL_MAXSECONDS=30
+fi
 
 # Active MQ installation dirs
 # ACTIVEMQ_HOME="<Installationdir>/"


[3/6] activemq git commit: https://issues.apache.org/jira/browse/AMQ-5567 - fix and test - issue was eager dispatch with concurrent sends, recovery and outcome delivery now assign a new sequence id to message additions which sorts sequence order in the x

Posted by ha...@apache.org.
https://issues.apache.org/jira/browse/AMQ-5567 - fix and test - issue was eager dispatch with concurrent sends, recovery and outcome delivery now assign a new sequence id to message additions which sorts sequence order in the xa case


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/9b2a6dcb
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/9b2a6dcb
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/9b2a6dcb

Branch: refs/heads/activemq-5.11.x
Commit: 9b2a6dcbb1a83591a89b4eb836577d0035757acc
Parents: e828dc7
Author: gtully <ga...@gmail.com>
Authored: Fri Feb 6 12:55:43 2015 +0000
Committer: Hadrian Zbarcea <ha...@apache.org>
Committed: Thu Feb 12 18:19:41 2015 -0500

----------------------------------------------------------------------
 .../activemq/store/AbstractMessageStore.java    |   4 +
 .../apache/activemq/store/jdbc/JDBCAdapter.java |   2 +-
 .../activemq/store/jdbc/JDBCMessageStore.java   |  68 +++---
 .../store/jdbc/JDBCPersistenceAdapter.java      |   6 +-
 .../store/jdbc/JDBCTopicMessageStore.java       |   2 +-
 .../store/jdbc/JdbcMemoryTransactionStore.java  | 111 ++++-----
 .../apache/activemq/store/jdbc/Statements.java  |   2 +-
 .../store/jdbc/adapter/DefaultJDBCAdapter.java  |   3 +-
 activemq-unit-tests/pom.xml                     |   2 +-
 .../store/RecoverExpiredMessagesTest.java       |  12 +-
 .../org/apache/activemq/bugs/AMQ5567Test.java   | 228 +++++++++++++++++++
 11 files changed, 339 insertions(+), 101 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/9b2a6dcb/activemq-broker/src/main/java/org/apache/activemq/store/AbstractMessageStore.java
----------------------------------------------------------------------
diff --git a/activemq-broker/src/main/java/org/apache/activemq/store/AbstractMessageStore.java b/activemq-broker/src/main/java/org/apache/activemq/store/AbstractMessageStore.java
index 43713e6..faa6c1f 100644
--- a/activemq-broker/src/main/java/org/apache/activemq/store/AbstractMessageStore.java
+++ b/activemq-broker/src/main/java/org/apache/activemq/store/AbstractMessageStore.java
@@ -125,6 +125,10 @@ abstract public class AbstractMessageStore implements MessageStore {
         this.indexListener = indexListener;
     }
 
+    public IndexListener getIndexListener() {
+        return indexListener;
+    }
+
     static {
        FUTURE = new InlineListenableFuture();
     }

http://git-wip-us.apache.org/repos/asf/activemq/blob/9b2a6dcb/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/JDBCAdapter.java
----------------------------------------------------------------------
diff --git a/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/JDBCAdapter.java b/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/JDBCAdapter.java
index 1d368b6..df4fcf3 100755
--- a/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/JDBCAdapter.java
+++ b/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/JDBCAdapter.java
@@ -105,7 +105,7 @@ public interface JDBCAdapter {
 
     void doRecoverPreparedOps(TransactionContext c, JdbcMemoryTransactionStore jdbcMemoryTransactionStore) throws SQLException, IOException;
 
-    void doCommitAddOp(TransactionContext c, long storeSequenceIdForMessageId) throws SQLException, IOException;
+    void doCommitAddOp(TransactionContext c, long preparedSequence, long sequence) throws SQLException, IOException;
 
     void doClearLastAck(TransactionContext c, ActiveMQDestination destination, byte priority, String subId, String subName) throws SQLException, IOException;
 

http://git-wip-us.apache.org/repos/asf/activemq/blob/9b2a6dcb/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/JDBCMessageStore.java
----------------------------------------------------------------------
diff --git a/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/JDBCMessageStore.java b/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/JDBCMessageStore.java
index 75a68c7..923f3f1 100755
--- a/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/JDBCMessageStore.java
+++ b/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/JDBCMessageStore.java
@@ -30,6 +30,7 @@ import org.apache.activemq.command.ActiveMQDestination;
 import org.apache.activemq.command.Message;
 import org.apache.activemq.command.MessageAck;
 import org.apache.activemq.command.MessageId;
+import org.apache.activemq.command.XATransactionId;
 import org.apache.activemq.store.AbstractMessageStore;
 import org.apache.activemq.store.IndexListener;
 import org.apache.activemq.store.MessageRecoveryListener;
@@ -70,7 +71,6 @@ public class JDBCMessageStore extends AbstractMessageStore {
     protected final JDBCPersistenceAdapter persistenceAdapter;
     protected AtomicLong lastRecoveredSequenceId = new AtomicLong(-1);
     protected AtomicLong lastRecoveredPriority = new AtomicLong(Byte.MAX_VALUE -1);
-    final Set<Long> recoveredAdditions = new LinkedHashSet<Long>();
     protected ActiveMQMessageAudit audit;
     protected final LinkedList<Long> pendingAdditions = new LinkedList<Long>();
     
@@ -112,6 +112,9 @@ public class JDBCMessageStore extends AbstractMessageStore {
             return;
         }
 
+        // if xaXid present - this is a prepare - so we don't yet have an outcome
+        final XATransactionId xaXid =  context != null ? context.getXid() : null;
+
         // Serialize the Message..
         byte data[];
         try {
@@ -127,38 +130,44 @@ public class JDBCMessageStore extends AbstractMessageStore {
         synchronized (pendingAdditions) {
             sequenceId = persistenceAdapter.getNextSequenceId();
             final long sequence = sequenceId;
-            pendingAdditions.add(sequence);
-            c.onCompletion(new Runnable() {
-                public void run() {
-                    // jdbc close or jms commit - while futureOrSequenceLong==null ordered
-                    // work will remain pending on the Queue
-                    message.getMessageId().setFutureOrSequenceLong(sequence);
-                    message.getMessageId().setEntryLocator(sequence);
-                }
-            });
+            message.getMessageId().setEntryLocator(sequence);
+
+            if (xaXid == null) {
+                pendingAdditions.add(sequence);
 
-            if (indexListener != null) {
-                indexListener.onAdd(new IndexListener.MessageContext(context, message, new Runnable() {
-                    @Override
+                c.onCompletion(new Runnable() {
                     public void run() {
-                        // cursor add complete
-                        synchronized (pendingAdditions) { pendingAdditions.remove(sequence); }
+                        // jdbc close or jms commit - while futureOrSequenceLong==null ordered
+                        // work will remain pending on the Queue
+                        message.getMessageId().setFutureOrSequenceLong(sequence);
                     }
-                }));
-            } else {
-                pendingAdditions.remove(sequence);
+                });
+
+                if (indexListener != null) {
+                    indexListener.onAdd(new IndexListener.MessageContext(context, message, new Runnable() {
+                        @Override
+                        public void run() {
+                            // cursor add complete
+                            synchronized (pendingAdditions) { pendingAdditions.remove(sequence); }
+                        }
+                    }));
+                } else {
+                    pendingAdditions.remove(sequence);
+                }
             }
         }
         try {
             adapter.doAddMessage(c, sequenceId, messageId, destination, data, message.getExpiration(),
-                    this.isPrioritizedMessages() ? message.getPriority() : 0, context != null ? context.getXid() : null);
+                    this.isPrioritizedMessages() ? message.getPriority() : 0, xaXid);
         } catch (SQLException e) {
             JDBCPersistenceAdapter.log("JDBC Failure: ", e);
             throw IOExceptionSupport.create("Failed to broker message: " + messageId + " in container: " + e, e);
         } finally {
             c.close();
         }
-        onAdd(message, sequenceId, message.getPriority());
+        if (xaXid == null) {
+            onAdd(message, sequenceId, message.getPriority());
+        }
     }
 
     // jdbc commit order is random with concurrent connections - limit scan to lowest pending
@@ -186,12 +195,7 @@ public class JDBCMessageStore extends AbstractMessageStore {
         }
     }
 
-    protected void onAdd(Message message, long sequenceId, byte priority) {
-        if (message.getTransactionId() != null && message.getTransactionId().isXATransaction()
-                && lastRecoveredSequenceId.get() > 0 && sequenceId < lastRecoveredSequenceId.get()) {
-            recoveredAdditions.add(sequenceId);
-        }
-    }
+    protected void onAdd(Message message, long sequenceId, byte priority) {}
 
     public void addMessageReference(ConnectionContext context, MessageId messageId, long expirationTime, String messageRef) throws IOException {
         // Get a connection and insert the message into the DB.
@@ -329,18 +333,6 @@ public class JDBCMessageStore extends AbstractMessageStore {
     public void recoverNextMessages(int maxReturned, final MessageRecoveryListener listener) throws Exception {
         TransactionContext c = persistenceAdapter.getTransactionContext();
         try {
-            if (!recoveredAdditions.isEmpty()) {
-                for (Iterator<Long> iterator = recoveredAdditions.iterator(); iterator.hasNext(); )  {
-                    Long sequenceId = iterator.next();
-                    iterator.remove();
-                    maxReturned--;
-                    if (sequenceId <= lastRecoveredSequenceId.get()) {
-                        Message msg = (Message)wireFormat.unmarshal(new ByteSequence(adapter.doGetMessageById(c, sequenceId)));
-                        LOG.trace("recovered add {} {}", this, msg.getMessageId());
-                        listener.recoverMessage(msg);
-                    }
-                }
-            }
             if (LOG.isTraceEnabled()) {
                 LOG.trace(this + " recoverNext lastRecovered:" + lastRecoveredSequenceId.get() + ", minPending:" + minPendingSequeunceId());
             }

http://git-wip-us.apache.org/repos/asf/activemq/blob/9b2a6dcb/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/JDBCPersistenceAdapter.java
----------------------------------------------------------------------
diff --git a/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/JDBCPersistenceAdapter.java b/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/JDBCPersistenceAdapter.java
index e335926..4236e9d 100755
--- a/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/JDBCPersistenceAdapter.java
+++ b/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/JDBCPersistenceAdapter.java
@@ -766,11 +766,11 @@ public class JDBCPersistenceAdapter extends DataSourceServiceSupport implements
         }
     }
 
-    public void commitAdd(ConnectionContext context, MessageId messageId) throws IOException {
+    public void commitAdd(ConnectionContext context, MessageId messageId, long preparedSequenceId) throws IOException {
         TransactionContext c = getTransactionContext(context);
         try {
-            long sequence = (Long)messageId.getFutureOrSequenceLong();
-            getAdapter().doCommitAddOp(c, sequence);
+            long sequence = (Long)messageId.getEntryLocator();
+            getAdapter().doCommitAddOp(c, preparedSequenceId, sequence);
         } catch (SQLException e) {
             JDBCPersistenceAdapter.log("JDBC Failure: ", e);
             throw IOExceptionSupport.create("Failed to commit add: " + messageId + ". Reason: " + e, e);

http://git-wip-us.apache.org/repos/asf/activemq/blob/9b2a6dcb/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/JDBCTopicMessageStore.java
----------------------------------------------------------------------
diff --git a/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/JDBCTopicMessageStore.java b/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/JDBCTopicMessageStore.java
index 1841f11..a0cb133 100755
--- a/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/JDBCTopicMessageStore.java
+++ b/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/JDBCTopicMessageStore.java
@@ -316,6 +316,7 @@ public class JDBCTopicMessageStore extends JDBCMessageStore implements TopicMess
         LOG.trace(this + ", completion for: " + getSubscriptionKey(clientId, subscriptionName));
     }
 
+    @Override
     protected void onAdd(Message message, long sequenceId, byte priority) {
         // update last recovered state
         for (LastRecovered last : subscriberLastRecoveredMap.values()) {
@@ -329,7 +330,6 @@ public class JDBCTopicMessageStore extends JDBCMessageStore implements TopicMess
         }
     }
 
-
     public void addSubscription(SubscriptionInfo subscriptionInfo, boolean retroactive) throws IOException {
         TransactionContext c = persistenceAdapter.getTransactionContext();
         try {

http://git-wip-us.apache.org/repos/asf/activemq/blob/9b2a6dcb/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/JdbcMemoryTransactionStore.java
----------------------------------------------------------------------
diff --git a/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/JdbcMemoryTransactionStore.java b/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/JdbcMemoryTransactionStore.java
index b2fedf7..7f42c7f 100644
--- a/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/JdbcMemoryTransactionStore.java
+++ b/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/JdbcMemoryTransactionStore.java
@@ -27,6 +27,7 @@ import org.apache.activemq.command.MessageAck;
 import org.apache.activemq.command.MessageId;
 import org.apache.activemq.command.TransactionId;
 import org.apache.activemq.command.XATransactionId;
+import org.apache.activemq.store.IndexListener;
 import org.apache.activemq.store.MessageStore;
 import org.apache.activemq.store.ProxyMessageStore;
 import org.apache.activemq.store.ProxyTopicMessageStore;
@@ -90,41 +91,68 @@ public class JdbcMemoryTransactionStore extends MemoryTransactionStore {
         ArrayList<AddMessageCommand> updateFromPreparedStateCommands = new ArrayList<AddMessageCommand>();
         for (Iterator<AddMessageCommand> iter = tx.messages.iterator(); iter.hasNext();) {
             final AddMessageCommand addMessageCommand = iter.next();
-            updateFromPreparedStateCommands.add(new AddMessageCommand() {
-                @Override
-                public Message getMessage() {
-                    return addMessageCommand.getMessage();
-                }
+            updateFromPreparedStateCommands.add(new CommitAddOutcome(addMessageCommand));
+        }
+        tx.messages = updateFromPreparedStateCommands;
+        preparedTransactions.put(txid, tx);
 
-                @Override
-                public MessageStore getMessageStore() {
-                    return addMessageCommand.getMessageStore();
-                }
+    }
 
-                @Override
-                public void run(ConnectionContext context) throws IOException {
-                    JDBCPersistenceAdapter jdbcPersistenceAdapter = (JDBCPersistenceAdapter) persistenceAdapter;
-                    Message message = addMessageCommand.getMessage();
-                    jdbcPersistenceAdapter.commitAdd(context, message.getMessageId());
-                    ((JDBCMessageStore)addMessageCommand.getMessageStore()).onAdd(
-                            message,
-                            (Long)message.getMessageId().getFutureOrSequenceLong(),
-                            message.getPriority());
 
-                }
+    class CommitAddOutcome implements AddMessageCommand {
+        final Message message;
+        JDBCMessageStore jdbcMessageStore;
 
-                @Override
-                public void setMessageStore(MessageStore messageStore) {
-                    throw new RuntimeException("MessageStore already known");
+        public CommitAddOutcome(JDBCMessageStore jdbcMessageStore, Message message) {
+            this.jdbcMessageStore = jdbcMessageStore;
+            this.message = message;
+        }
+
+        public CommitAddOutcome(AddMessageCommand addMessageCommand) {
+            this((JDBCMessageStore)addMessageCommand.getMessageStore(), addMessageCommand.getMessage());
+        }
+
+        @Override
+        public Message getMessage() {
+            return message;
+        }
+
+        @Override
+        public MessageStore getMessageStore() {
+            return jdbcMessageStore;
+        }
+
+        @Override
+        public void run(final ConnectionContext context) throws IOException {
+            JDBCPersistenceAdapter jdbcPersistenceAdapter = (JDBCPersistenceAdapter) persistenceAdapter;
+            final Long preparedEntrySequence = (Long) message.getMessageId().getEntryLocator();
+            TransactionContext c = jdbcPersistenceAdapter.getTransactionContext(context);
+
+            synchronized (jdbcMessageStore.pendingAdditions) {
+                message.getMessageId().setEntryLocator(jdbcPersistenceAdapter.getNextSequenceId());
+
+                c.onCompletion(new Runnable() {
+                    @Override
+                    public void run() {
+                        message.getMessageId().setFutureOrSequenceLong(message.getMessageId().getEntryLocator());
+                    }
+                });
+
+                if (jdbcMessageStore.getIndexListener() != null) {
+                    jdbcMessageStore.getIndexListener().onAdd(new IndexListener.MessageContext(context, message, null));
                 }
-            });
+            }
+
+            jdbcPersistenceAdapter.commitAdd(context, message.getMessageId(), preparedEntrySequence);
+            jdbcMessageStore.onAdd(message, (Long)message.getMessageId().getEntryLocator(), message.getPriority());
         }
-        tx.messages = updateFromPreparedStateCommands;
-        preparedTransactions.put(txid, tx);
 
+        @Override
+        public void setMessageStore(MessageStore messageStore) {
+            jdbcMessageStore = (JDBCMessageStore) messageStore;
+        }
     }
 
-
     @Override
     public void rollback(TransactionId txid) throws IOException {
 
@@ -148,9 +176,9 @@ public class JdbcMemoryTransactionStore extends MemoryTransactionStore {
                         if (removeMessageCommand instanceof LastAckCommand ) {
                             ((LastAckCommand)removeMessageCommand).rollback(ctx);
                         } else {
+                            MessageId messageId = removeMessageCommand.getMessageAck().getLastMessageId();
                             // need to unset the txid flag on the existing row
-                            ((JDBCPersistenceAdapter) persistenceAdapter).commitAdd(ctx,
-                                    removeMessageCommand.getMessageAck().getLastMessageId());
+                            ((JDBCPersistenceAdapter) persistenceAdapter).commitAdd(ctx, messageId, (Long)messageId.getEntryLocator());
                         }
                     }
                 } catch (IOException e) {
@@ -171,36 +199,15 @@ public class JdbcMemoryTransactionStore extends MemoryTransactionStore {
     public void recoverAdd(long id, byte[] messageBytes) throws IOException {
         final Message message = (Message) ((JDBCPersistenceAdapter)persistenceAdapter).getWireFormat().unmarshal(new ByteSequence(messageBytes));
         message.getMessageId().setFutureOrSequenceLong(id);
+        message.getMessageId().setEntryLocator(id);
         Tx tx = getPreparedTx(message.getTransactionId());
-        tx.add(new AddMessageCommand() {
-            MessageStore messageStore;
-            @Override
-            public Message getMessage() {
-                return message;
-            }
-
-            @Override
-            public MessageStore getMessageStore() {
-                return messageStore;
-            }
-
-            @Override
-            public void run(ConnectionContext context) throws IOException {
-                ((JDBCPersistenceAdapter)persistenceAdapter).commitAdd(null, message.getMessageId());
-                ((JDBCMessageStore)messageStore).onAdd(message, ((Long)message.getMessageId().getFutureOrSequenceLong()).longValue(), message.getPriority());
-            }
-
-            @Override
-            public void setMessageStore(MessageStore messageStore) {
-                this.messageStore = messageStore;
-            }
-
-        });
+        tx.add(new CommitAddOutcome(null, message));
     }
 
     public void recoverAck(long id, byte[] xid, byte[] message) throws IOException {
         Message msg = (Message) ((JDBCPersistenceAdapter)persistenceAdapter).getWireFormat().unmarshal(new ByteSequence(message));
         msg.getMessageId().setFutureOrSequenceLong(id);
+        msg.getMessageId().setEntryLocator(id);
         Tx tx = getPreparedTx(new XATransactionId(xid));
         final MessageAck ack = new MessageAck(msg, MessageAck.STANDARD_ACK_TYPE, 1);
         tx.add(new RemoveMessageCommand() {

http://git-wip-us.apache.org/repos/asf/activemq/blob/9b2a6dcb/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/Statements.java
----------------------------------------------------------------------
diff --git a/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/Statements.java b/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/Statements.java
index a595f33..8ee3123 100755
--- a/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/Statements.java
+++ b/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/Statements.java
@@ -617,7 +617,7 @@ public class Statements {
     public String getClearXidFlagStatement() {
         if (clearXidFlagStatement == null) {
             clearXidFlagStatement = "UPDATE "  + getFullMessageTableName()
-                    + " SET XID = NULL WHERE ID = ?";
+                    + " SET XID = NULL, ID = ? WHERE ID = ?";
         }
         return clearXidFlagStatement;
     }

http://git-wip-us.apache.org/repos/asf/activemq/blob/9b2a6dcb/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/adapter/DefaultJDBCAdapter.java
----------------------------------------------------------------------
diff --git a/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/adapter/DefaultJDBCAdapter.java b/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/adapter/DefaultJDBCAdapter.java
index 970e0f8..a94abdf 100755
--- a/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/adapter/DefaultJDBCAdapter.java
+++ b/activemq-jdbc-store/src/main/java/org/apache/activemq/store/jdbc/adapter/DefaultJDBCAdapter.java
@@ -1048,12 +1048,13 @@ public class DefaultJDBCAdapter implements JDBCAdapter {
     }
 
     @Override
-    public void doCommitAddOp(TransactionContext c, long sequence) throws SQLException, IOException {
+    public void doCommitAddOp(TransactionContext c, long preparedSequence, long sequence) throws SQLException, IOException {
         PreparedStatement s = null;
         cleanupExclusiveLock.readLock().lock();
         try {
             s = c.getConnection().prepareStatement(this.statements.getClearXidFlagStatement());
             s.setLong(1, sequence);
+            s.setLong(2, preparedSequence);
             if (s.executeUpdate() != 1) {
                 throw new IOException("Could not remove prepared transaction state from message add for sequenceId: " + sequence);
             }

http://git-wip-us.apache.org/repos/asf/activemq/blob/9b2a6dcb/activemq-unit-tests/pom.xml
----------------------------------------------------------------------
diff --git a/activemq-unit-tests/pom.xml b/activemq-unit-tests/pom.xml
index 1c003ad..dfc51d0 100755
--- a/activemq-unit-tests/pom.xml
+++ b/activemq-unit-tests/pom.xml
@@ -443,7 +443,7 @@
           </excludes>
           <systemPropertyVariables>
             <java.net.preferIPv4Stack>true</java.net.preferIPv4Stack>
-            <org.apache.activemq.default.directory.prefix>target</org.apache.activemq.default.directory.prefix>
+            <org.apache.activemq.default.directory.prefix>target/</org.apache.activemq.default.directory.prefix>
             <org.apache.activemq.AutoFailTestSupport.disableSystemExit>true</org.apache.activemq.AutoFailTestSupport.disableSystemExit>
           </systemPropertyVariables>
           <includes>

http://git-wip-us.apache.org/repos/asf/activemq/blob/9b2a6dcb/activemq-unit-tests/src/test/java/org/apache/activemq/broker/store/RecoverExpiredMessagesTest.java
----------------------------------------------------------------------
diff --git a/activemq-unit-tests/src/test/java/org/apache/activemq/broker/store/RecoverExpiredMessagesTest.java b/activemq-unit-tests/src/test/java/org/apache/activemq/broker/store/RecoverExpiredMessagesTest.java
index 38e8ee7..fb0296c 100644
--- a/activemq-unit-tests/src/test/java/org/apache/activemq/broker/store/RecoverExpiredMessagesTest.java
+++ b/activemq-unit-tests/src/test/java/org/apache/activemq/broker/store/RecoverExpiredMessagesTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.activemq.broker.store;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.concurrent.TimeUnit;
 import junit.framework.Test;
@@ -53,9 +54,14 @@ public class RecoverExpiredMessagesTest extends BrokerRestartTestSupport {
 
     public void initCombosForTestRecovery() throws Exception {
         addCombinationValues("queuePendingPolicy", new PendingQueueMessageStoragePolicy[] {new FilePendingQueueMessageStoragePolicy(), new VMPendingQueueMessageStoragePolicy()});
-        addCombinationValues("persistenceAdapter", new PersistenceAdapter[] {new KahaDBPersistenceAdapter(),
-                // need to supply the dataSource as it is used in parameter matching via the toString
-                new JDBCPersistenceAdapter(JDBCPersistenceAdapter.createDataSource(IOHelper.getDefaultDataDirectory()), new OpenWireFormat())});
+        PersistenceAdapter[] persistenceAdapters = new PersistenceAdapter[] {
+                new KahaDBPersistenceAdapter(),
+                new JDBCPersistenceAdapter(JDBCPersistenceAdapter.createDataSource(IOHelper.getDefaultDataDirectory()), new OpenWireFormat())
+        };
+        for (PersistenceAdapter adapter : persistenceAdapters) {
+            adapter.setDirectory(new File(IOHelper.getDefaultDataDirectory()));
+        }
+        addCombinationValues("persistenceAdapter", persistenceAdapters);
     }
 
     public void testRecovery() throws Exception {

http://git-wip-us.apache.org/repos/asf/activemq/blob/9b2a6dcb/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/AMQ5567Test.java
----------------------------------------------------------------------
diff --git a/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/AMQ5567Test.java b/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/AMQ5567Test.java
new file mode 100755
index 0000000..a8739ae
--- /dev/null
+++ b/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/AMQ5567Test.java
@@ -0,0 +1,228 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.activemq.bugs;
+
+import java.io.File;
+import java.util.concurrent.TimeUnit;
+import javax.jms.JMSException;
+import javax.jms.TextMessage;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import junit.framework.Test;
+import org.apache.activemq.broker.BrokerRestartTestSupport;
+import org.apache.activemq.broker.BrokerService;
+import org.apache.activemq.broker.StubConnection;
+import org.apache.activemq.broker.jmx.QueueViewMBean;
+import org.apache.activemq.broker.region.policy.PolicyEntry;
+import org.apache.activemq.command.ActiveMQDestination;
+import org.apache.activemq.command.ActiveMQQueue;
+import org.apache.activemq.command.ConnectionInfo;
+import org.apache.activemq.command.ConsumerInfo;
+import org.apache.activemq.command.Message;
+import org.apache.activemq.command.MessageAck;
+import org.apache.activemq.command.ProducerInfo;
+import org.apache.activemq.command.SessionInfo;
+import org.apache.activemq.command.XATransactionId;
+import org.apache.activemq.openwire.OpenWireFormat;
+import org.apache.activemq.store.PersistenceAdapter;
+import org.apache.activemq.store.jdbc.JDBCPersistenceAdapter;
+import org.apache.activemq.store.kahadb.KahaDBPersistenceAdapter;
+import org.apache.activemq.store.leveldb.LevelDBPersistenceAdapter;
+import org.apache.activemq.util.IOHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class AMQ5567Test extends BrokerRestartTestSupport {
+    protected static final Logger LOG = LoggerFactory.getLogger(AMQ5567Test.class);
+    ActiveMQQueue destination = new ActiveMQQueue("Q");
+
+    @Override
+    protected void configureBroker(BrokerService broker) throws Exception {
+        super.configureBroker(broker);
+        broker.setPersistenceAdapter(persistenceAdapter);
+    }
+
+    protected PolicyEntry getDefaultPolicy() {
+        PolicyEntry policy = new PolicyEntry();
+        policy.setMemoryLimit(60*1024);
+        return policy;
+    }
+
+    public void initCombosForTestPreparedTransactionNotDispatched() throws Exception {
+        PersistenceAdapter[] persistenceAdapters = new PersistenceAdapter[]{
+                new KahaDBPersistenceAdapter(),
+                new LevelDBPersistenceAdapter(),
+                new JDBCPersistenceAdapter(JDBCPersistenceAdapter.createDataSource(IOHelper.getDefaultDataDirectory()), new OpenWireFormat())
+        };
+        for (PersistenceAdapter adapter : persistenceAdapters) {
+            adapter.setDirectory(new File(IOHelper.getDefaultDataDirectory()));
+        }
+        addCombinationValues("persistenceAdapter", persistenceAdapters);
+    }
+
+    public void testPreparedTransactionNotDispatched() throws Exception {
+
+        ActiveMQDestination destination = new ActiveMQQueue("Q");
+
+        StubConnection connection = createConnection();
+        ConnectionInfo connectionInfo = createConnectionInfo();
+        SessionInfo sessionInfo = createSessionInfo(connectionInfo);
+        ProducerInfo producerInfo = createProducerInfo(sessionInfo);
+        connection.send(connectionInfo);
+        connection.send(sessionInfo);
+        connection.send(producerInfo);
+
+
+        XATransactionId txid = createXATransaction(sessionInfo);
+        connection.send(createBeginTransaction(connectionInfo, txid));
+        Message message = createMessage(producerInfo, destination);
+        message.setPersistent(true);
+        message.setTransactionId(txid);
+        connection.send(message);
+
+        connection.send(createPrepareTransaction(connectionInfo, txid));
+
+
+        // send another non tx, will poke dispatch
+        message = createMessage(producerInfo, destination);
+        message.setPersistent(true);
+        connection.send(message);
+
+
+        // Since prepared but not committed.. only one should get delivered
+        StubConnection connectionC = createConnection();
+        ConnectionInfo connectionInfoC = createConnectionInfo();
+        SessionInfo sessionInfoC = createSessionInfo(connectionInfoC);
+        ConsumerInfo consumerInfo = createConsumerInfo(sessionInfoC, destination);
+        connectionC.send(connectionInfoC);
+        connectionC.send(sessionInfoC);
+        connectionC.send(consumerInfo);
+
+        Message m = receiveMessage(connectionC, TimeUnit.SECONDS.toMillis(10));
+        LOG.info("received: " + m);
+        assertNotNull("Got message", m);
+        assertNull("Got non tx message", m.getTransactionId());
+
+        // cannot get the prepared message till commit
+        assertNull(receiveMessage(connectionC));
+        assertNoMessagesLeft(connectionC);
+
+        LOG.info("commit: " + txid);
+        connection.request(createCommitTransaction2Phase(connectionInfo, txid));
+
+        m = receiveMessage(connectionC, TimeUnit.SECONDS.toMillis(10));
+        LOG.info("received: " + m);
+        assertNotNull("Got non null message", m);
+
+    }
+
+    public void initCombosForTestCursorStoreSync() throws Exception {
+        PersistenceAdapter[] persistenceAdapters = new PersistenceAdapter[]{
+                new KahaDBPersistenceAdapter(),
+                new LevelDBPersistenceAdapter(),
+                new JDBCPersistenceAdapter(JDBCPersistenceAdapter.createDataSource(IOHelper.getDefaultDataDirectory()), new OpenWireFormat())
+        };
+        for (PersistenceAdapter adapter : persistenceAdapters) {
+            adapter.setDirectory(new File(IOHelper.getDefaultDataDirectory()));
+        }
+        addCombinationValues("persistenceAdapter", persistenceAdapters);
+    }
+
+    public void testCursorStoreSync() throws Exception {
+
+        StubConnection connection = createConnection();
+        ConnectionInfo connectionInfo = createConnectionInfo();
+        SessionInfo sessionInfo = createSessionInfo(connectionInfo);
+        ProducerInfo producerInfo = createProducerInfo(sessionInfo);
+        connection.send(connectionInfo);
+        connection.send(sessionInfo);
+        connection.send(producerInfo);
+
+
+        XATransactionId txid = createXATransaction(sessionInfo);
+        connection.send(createBeginTransaction(connectionInfo, txid));
+        Message message = createMessage(producerInfo, destination);
+        message.setPersistent(true);
+        message.setTransactionId(txid);
+        connection.request(message);
+
+        connection.request(createPrepareTransaction(connectionInfo, txid));
+
+        QueueViewMBean proxy = getProxyToQueueViewMBean();
+        assertTrue("cache is enabled", proxy.isCacheEnabled());
+
+        // send another non tx, will fill cursor
+        String payload = new String(new byte[10*1024]);
+        for (int i=0; i<6; i++) {
+            message = createMessage(producerInfo, destination);
+            message.setPersistent(true);
+            ((TextMessage)message).setText(payload);
+            connection.request(message);
+        }
+
+        assertTrue("cache is disabled", !proxy.isCacheEnabled());
+
+        StubConnection connectionC = createConnection();
+        ConnectionInfo connectionInfoC = createConnectionInfo();
+        SessionInfo sessionInfoC = createSessionInfo(connectionInfoC);
+        ConsumerInfo consumerInfo = createConsumerInfo(sessionInfoC, destination);
+        connectionC.send(connectionInfoC);
+        connectionC.send(sessionInfoC);
+        connectionC.send(consumerInfo);
+
+        Message m = null;
+        for (int i=0; i<3; i++) {
+            m = receiveMessage(connectionC, TimeUnit.SECONDS.toMillis(10));
+            LOG.info("received: " + m);
+            assertNotNull("Got message", m);
+            assertNull("Got non tx message", m.getTransactionId());
+            connectionC.request(createAck(consumerInfo, m, 1, MessageAck.STANDARD_ACK_TYPE));
+        }
+
+        LOG.info("commit: " + txid);
+        connection.request(createCommitTransaction2Phase(connectionInfo, txid));
+        // consume the rest including the 2pc send in TX
+
+        for (int i=0; i<4; i++) {
+            m = receiveMessage(connectionC, TimeUnit.SECONDS.toMillis(10));
+            LOG.info("received[" + i + "] " + m);
+            assertNotNull("Got message", m);
+            if (i==3 ) {
+                assertNotNull("Got  tx message", m.getTransactionId());
+            } else {
+                assertNull("Got non tx message", m.getTransactionId());
+            }
+            connectionC.request(createAck(consumerInfo, m, 1, MessageAck.STANDARD_ACK_TYPE));
+        }
+    }
+
+    private QueueViewMBean getProxyToQueueViewMBean()
+            throws MalformedObjectNameException, JMSException {
+        ObjectName queueViewMBeanName = new ObjectName("org.apache.activemq"
+                + ":destinationType=Queue,destinationName=" + destination.getQueueName()
+                + ",type=Broker,brokerName=localhost");
+        QueueViewMBean proxy = (QueueViewMBean) broker.getManagementContext()
+                .newProxyInstance(queueViewMBeanName,
+                        QueueViewMBean.class, true);
+        return proxy;
+    }
+
+    public static Test suite() {
+        return suite(AMQ5567Test.class);
+    }
+
+}


[2/6] activemq git commit: https://issues.apache.org/jira/browse/AMQ-5542 fix (via revert below) and test case applied with thanks.

Posted by ha...@apache.org.
https://issues.apache.org/jira/browse/AMQ-5542 fix (via revert below) and test case applied with thanks.

Revert "resolve https://issues.apache.org/activemq/browse/AMQ-2736, logic issue in code that keeps data files with acks around pending message file gc. thanks jgenender - test case to follow"

This reverts commit dd68c61e65f24b7dc498b36e34960a4bc46ded4b.

resolves: https://issues.apache.org/jira/browse/AMQ-5542 and applies test case that nicely demonstrates the defect, thanks


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/e828dc79
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/e828dc79
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/e828dc79

Branch: refs/heads/activemq-5.11.x
Commit: e828dc791f59691d2d0ba2ce169082e4c1984139
Parents: b997bd4
Author: gtully <ga...@gmail.com>
Authored: Fri Jan 30 14:45:26 2015 +0000
Committer: Hadrian Zbarcea <ha...@apache.org>
Committed: Thu Feb 12 18:18:29 2015 -0500

----------------------------------------------------------------------
 .../activemq/store/kahadb/MessageDatabase.java  |  3 +-
 .../org/apache/activemq/bugs/AMQ2832Test.java   | 51 ++++++++++++++++++++
 2 files changed, 52 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/e828dc79/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/MessageDatabase.java
----------------------------------------------------------------------
diff --git a/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/MessageDatabase.java b/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/MessageDatabase.java
index 35a59ce..477f42c 100644
--- a/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/MessageDatabase.java
+++ b/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/MessageDatabase.java
@@ -1672,14 +1672,13 @@ public abstract class MessageDatabase extends ServiceSupport implements BrokerSe
             if (LOG.isTraceEnabled()) {
                 LOG.trace("gc candidates: " + gcCandidateSet);
             }
-            final TreeSet<Integer> gcCandidates = new TreeSet<Integer>(gcCandidateSet);
             Iterator<Integer> candidates = gcCandidateSet.iterator();
             while (candidates.hasNext()) {
                 Integer candidate = candidates.next();
                 Set<Integer> referencedFileIds = metadata.ackMessageFileMap.get(candidate);
                 if (referencedFileIds != null) {
                     for (Integer referencedFileId : referencedFileIds) {
-                        if (completeFileSet.contains(referencedFileId) && !gcCandidates.contains(referencedFileId)) {
+                        if (completeFileSet.contains(referencedFileId) && !gcCandidateSet.contains(referencedFileId)) {
                             // active file that is not targeted for deletion is referenced so don't delete
                             candidates.remove();
                             break;

http://git-wip-us.apache.org/repos/asf/activemq/blob/e828dc79/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/AMQ2832Test.java
----------------------------------------------------------------------
diff --git a/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/AMQ2832Test.java b/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/AMQ2832Test.java
index 319fcc2..22ad6ab 100644
--- a/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/AMQ2832Test.java
+++ b/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/AMQ2832Test.java
@@ -17,6 +17,7 @@
 package org.apache.activemq.bugs;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
@@ -117,7 +118,57 @@ public class AMQ2832Test {
         }
     }
 
+   /**
+    * Scenario:
+    * db-1.log has an unacknowledged message,
+    * db-2.log contains acks for the messages from db-1.log,
+    * db-3.log contains acks for the messages from db-2.log
+    *
+    * Expected behavior: since db-1.log is blocked, db-2.log and db-3.log should not be removed during the cleanup.
+    * Current situation on 5.10.0, 5.10.1 is that db-3.log is removed causing all messages from db-2.log, whose acks were in db-3.log, to be replayed.
+    *
+    * @throws Exception
+    */
     @Test
+    public void testAckChain() throws Exception {
+       startBroker();
+
+       StagedConsumer consumer = new StagedConsumer();
+       // file #1
+       produceMessagesToConsumeMultipleDataFiles(5);
+       // acknowledge first 2 messages and leave the 3rd one unacknowledged blocking db-1.log
+       consumer.receive(3);
+
+       // send messages by consuming and acknowledging every message right after sent in order to get KahadbAdd and Remove command to be saved together
+       // this is necessary in order to get KahaAddMessageCommand to be saved in one db file and the corresponding KahaRemoveMessageCommand in the next one
+       produceAndConsumeImmediately(20, consumer);
+       consumer.receive(2).acknowledge(); // consume and ack the last 2 unconsumed
+
+       // now we have 3 files written and started with #4
+       consumer.close();
+
+       broker.stop();
+       broker.waitUntilStopped();
+
+       recoverBroker();
+
+       consumer = new StagedConsumer();
+       Message message = consumer.receive(1);
+       assertNotNull("One message stays unacked from db-1.log", message);
+       message.acknowledge();
+       message = consumer.receive(1);
+       assertNull("There should not be any unconsumed messages any more", message);
+       consumer.close();
+   }
+
+   private void produceAndConsumeImmediately(int numOfMsgs, StagedConsumer consumer) throws Exception {
+      for (int i = 0; i < numOfMsgs; i++) {
+         produceMessagesToConsumeMultipleDataFiles(1);
+         consumer.receive(1).acknowledge();
+      }
+   }
+
+   @Test
     public void testAckRemovedMessageReplayedAfterRecovery() throws Exception {
 
         startBroker();


[6/6] activemq git commit: https://issues.apache.org/jira/browse/AMQ-5580

Posted by ha...@apache.org.
https://issues.apache.org/jira/browse/AMQ-5580

Use a CopyOnWriteArrayList to ensure that traversals of the adapters
list do not generate ConcurrentModificationException if a new adapter is
added during that time.


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/e5c5a821
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/e5c5a821
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/e5c5a821

Branch: refs/heads/activemq-5.11.x
Commit: e5c5a821c7f7a651a37fe97a65181401eb7cfb1e
Parents: bd1226b
Author: Timothy Bish <ta...@gmail.com>
Authored: Wed Feb 11 17:22:26 2015 -0500
Committer: Hadrian Zbarcea <ha...@apache.org>
Committed: Thu Feb 12 18:22:10 2015 -0500

----------------------------------------------------------------------
 .../store/kahadb/MultiKahaDBPersistenceAdapter.java       | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/e5c5a821/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/MultiKahaDBPersistenceAdapter.java
----------------------------------------------------------------------
diff --git a/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/MultiKahaDBPersistenceAdapter.java b/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/MultiKahaDBPersistenceAdapter.java
index f22e544..286931e 100644
--- a/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/MultiKahaDBPersistenceAdapter.java
+++ b/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/MultiKahaDBPersistenceAdapter.java
@@ -20,7 +20,13 @@ import java.io.File;
 import java.io.FileFilter;
 import java.io.IOException;
 import java.nio.charset.Charset;
-import java.util.*;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 import javax.transaction.xa.Xid;
 
@@ -78,7 +84,7 @@ public class MultiKahaDBPersistenceAdapter extends LockableServiceSupport implem
     final DelegateDestinationMap destinationMap = new DelegateDestinationMap();
 
     BrokerService brokerService;
-    List<PersistenceAdapter> adapters = new LinkedList<PersistenceAdapter>();
+    List<PersistenceAdapter> adapters = new CopyOnWriteArrayList<PersistenceAdapter>();
     private File directory = new File(IOHelper.getDefaultDataDirectory() + File.separator + "mKahaDB");
 
     MultiKahaDBTransactionStore transactionStore = new MultiKahaDBTransactionStore(this);


[4/6] activemq git commit: reduce test duration, relax derbydb durability - AMQ5266SingleDestTest

Posted by ha...@apache.org.
reduce test duration, relax derbydb durability - AMQ5266SingleDestTest

Conflicts:
	activemq-unit-tests/src/test/java/org/apache/activemq/TestSupport.java


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/b4e6cb6a
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/b4e6cb6a
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/b4e6cb6a

Branch: refs/heads/activemq-5.11.x
Commit: b4e6cb6af53a1f264314ebfdd6ee771097d0e5c2
Parents: 9b2a6dc
Author: gtully <ga...@gmail.com>
Authored: Wed Feb 11 15:27:45 2015 +0000
Committer: Hadrian Zbarcea <ha...@apache.org>
Committed: Thu Feb 12 18:21:43 2015 -0500

----------------------------------------------------------------------
 .../src/test/java/org/apache/activemq/TestSupport.java         | 5 ++++-
 .../java/org/apache/activemq/bugs/AMQ5266SingleDestTest.java   | 6 ++++++
 2 files changed, 10 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/b4e6cb6a/activemq-unit-tests/src/test/java/org/apache/activemq/TestSupport.java
----------------------------------------------------------------------
diff --git a/activemq-unit-tests/src/test/java/org/apache/activemq/TestSupport.java b/activemq-unit-tests/src/test/java/org/apache/activemq/TestSupport.java
index 80aac14..a762f89 100755
--- a/activemq-unit-tests/src/test/java/org/apache/activemq/TestSupport.java
+++ b/activemq-unit-tests/src/test/java/org/apache/activemq/TestSupport.java
@@ -183,7 +183,9 @@ public abstract class TestSupport extends CombinationTestSupport {
         PersistenceAdapter adapter = null;
         switch (choice) {
         case JDBC:
-            adapter = new JDBCPersistenceAdapter();
+            JDBCPersistenceAdapter jdbcPersistenceAdapter = new JDBCPersistenceAdapter();
+            jdbcPersistenceAdapter.setUseLock(false); // rollback (at shutdown) on derby can take a long time with file io etc
+            adapter = jdbcPersistenceAdapter;
             break;
         case KahaDB:
             adapter = new KahaDBPersistenceAdapter();
@@ -196,6 +198,7 @@ public abstract class TestSupport extends CombinationTestSupport {
             break;
         }
         broker.setPersistenceAdapter(adapter);
+        adapter.setDirectory(new File(broker.getBrokerDataDirectory(), choice.name()));
         return adapter;
     }
 

http://git-wip-us.apache.org/repos/asf/activemq/blob/b4e6cb6a/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/AMQ5266SingleDestTest.java
----------------------------------------------------------------------
diff --git a/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/AMQ5266SingleDestTest.java b/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/AMQ5266SingleDestTest.java
index cfd6534..0d7f44b 100644
--- a/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/AMQ5266SingleDestTest.java
+++ b/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/AMQ5266SingleDestTest.java
@@ -44,6 +44,7 @@ import org.apache.activemq.broker.region.policy.PolicyMap;
 import org.apache.activemq.command.ActiveMQQueue;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -97,6 +98,11 @@ public class AMQ5266SingleDestTest {
 
     public int consumerBatchSize = 25;
 
+    @BeforeClass
+    public static void derbyTestMode() throws Exception {
+        System.setProperty("derby.system.durability","test");
+    }
+
     @Before
     public void startBroker() throws Exception {
         brokerService = new BrokerService();


[5/6] activemq git commit: https://issues.apache.org/jira/browse/AMQ-5520 - fix org.apache.activemq.spring.SpringTest.testSenderWithSpringXmlEmbeddedPooledBrokerConfiguredViaXml regression

Posted by ha...@apache.org.
https://issues.apache.org/jira/browse/AMQ-5520 - fix org.apache.activemq.spring.SpringTest.testSenderWithSpringXmlEmbeddedPooledBrokerConfiguredViaXml regression


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/bd1226b6
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/bd1226b6
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/bd1226b6

Branch: refs/heads/activemq-5.11.x
Commit: bd1226b60c399b01f1960af4ee6c296d921dd5e0
Parents: b4e6cb6
Author: gtully <ga...@gmail.com>
Authored: Wed Feb 11 15:51:55 2015 +0000
Committer: Hadrian Zbarcea <ha...@apache.org>
Committed: Thu Feb 12 18:22:00 2015 -0500

----------------------------------------------------------------------
 .../multicast/MulticastDiscoveryAgent.java        | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/bd1226b6/activemq-client/src/main/java/org/apache/activemq/transport/discovery/multicast/MulticastDiscoveryAgent.java
----------------------------------------------------------------------
diff --git a/activemq-client/src/main/java/org/apache/activemq/transport/discovery/multicast/MulticastDiscoveryAgent.java b/activemq-client/src/main/java/org/apache/activemq/transport/discovery/multicast/MulticastDiscoveryAgent.java
index 345ffdb..48b15e2 100755
--- a/activemq-client/src/main/java/org/apache/activemq/transport/discovery/multicast/MulticastDiscoveryAgent.java
+++ b/activemq-client/src/main/java/org/apache/activemq/transport/discovery/multicast/MulticastDiscoveryAgent.java
@@ -344,16 +344,18 @@ public class MulticastDiscoveryAgent implements DiscoveryAgent, Runnable {
         List<NetworkInterface> possibles = new ArrayList<NetworkInterface>();
         while (ifcs.hasMoreElements()) {
             NetworkInterface ni = ifcs.nextElement();
-            if (ni.supportsMulticast()
-                && ni.isUp()) {
-                for (InterfaceAddress ia : ni.getInterfaceAddresses()) {
-                    if (ia.getAddress() instanceof java.net.Inet4Address
-                        && !ia.getAddress().isLoopbackAddress()
-                        && !ni.getDisplayName().startsWith("vnic")) {
-                        possibles.add(ni);
+            try {
+                if (ni.supportsMulticast()
+                        && ni.isUp()) {
+                    for (InterfaceAddress ia : ni.getInterfaceAddresses()) {
+                        if (ia.getAddress() instanceof java.net.Inet4Address
+                                && !ia.getAddress().isLoopbackAddress()
+                                && !ni.getDisplayName().startsWith("vnic")) {
+                            possibles.add(ni);
+                        }
                     }
                 }
-            }
+            } catch (SocketException ignored) {}
         }
         return possibles.isEmpty() ? null : possibles.get(possibles.size() - 1);
     }