You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@activemq.apache.org by michaelandrepearce <gi...@git.apache.org> on 2017/12/15 17:36:47 UTC

[GitHub] activemq-artemis pull request #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support...

GitHub user michaelandrepearce opened a pull request:

    https://github.com/apache/activemq-artemis/pull/1722

    (WIP DO NOT MERGE) ARTEMIS-1545 Support JMS 2.0 Completion Listener for Exceptions

    @clebertsuconic id like some feedback on this whilst I'm still developing it, if thats ok.
    
    Some bits i need to sort still (inc tests), and back compatibility where new client connects to old broker (I've put TODO's in code where i can handle this once i know how to do this check).
    
    Could you have a look over and detail bits you spot that need more thought, or need to address.
    
    
    Cheers
    Mike

You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/michaelandrepearce/activemq-artemis ARTEMIS-1545-DEC

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/activemq-artemis/pull/1722.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #1722
    
----
commit 5353ab548937209fb269ffbcc82e55fa8a168b0f
Author: Michael André Pearce <mi...@me.com>
Date:   2017-12-14T07:47:30Z

    ARTEMIS-1545 Support JMS 2.0 Completion Listener for Exceptions

----


---

[GitHub] activemq-artemis pull request #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support...

Posted by michaelandrepearce <gi...@git.apache.org>.
Github user michaelandrepearce commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/1722#discussion_r157749643
  
    --- Diff: artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ResponseCache.java ---
    @@ -0,0 +1,61 @@
    +/*
    + * 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.artemis.core.protocol.core.impl;
    +
    +import java.util.concurrent.atomic.AtomicLong;
    +
    +import org.apache.activemq.artemis.api.core.ActiveMQInterruptedException;
    +import org.apache.activemq.artemis.core.protocol.core.Packet;
    +import org.apache.activemq.artemis.core.protocol.core.ResponseHandler;
    +import org.apache.activemq.artemis.utils.collections.ConcurrentLongHashMap;
    +
    +public class ResponseCache {
    +
    +   private final AtomicLong sequence = new AtomicLong(0);
    +
    +   private final ConcurrentLongHashMap<Packet> store;
    +   private final int size;
    +   private ResponseHandler responseHandler;
    +
    +   public ResponseCache(int size) {
    +      this.store = new ConcurrentLongHashMap<>(size);
    +      this.size = size;
    +   }
    +
    +   public long add(Packet packet) {
    +      if (store.size() + 1 > size) {
    +         throw new ActiveMQInterruptedException("unable to send due to buffer full");
    +      }
    +      long correlationID = sequence.incrementAndGet();
    +      packet.setCorrelationID(correlationID);
    +      this.store.put(correlationID, packet);
    +      return correlationID;
    +   }
    +
    +   public void handleResponse(Packet response) {
    +      long correlationID = response.getCorrelationID();
    +      Packet packet = store.get(correlationID);
    --- End diff --
    
    please do! More hands and eyes == less issues :)


---

[GitHub] activemq-artemis issue #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support JMS 2....

Posted by michaelandrepearce <gi...@git.apache.org>.
Github user michaelandrepearce commented on the issue:

    https://github.com/apache/activemq-artemis/pull/1722
  
    @mtaylor just FYI i actually went with option 2, because after rebasing with @clebertsuconic 's changes for compatibility he had followed this option, as such i follow suit, rather than having two different ways to do it.


---

[GitHub] activemq-artemis pull request #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support...

Posted by michaelandrepearce <gi...@git.apache.org>.
Github user michaelandrepearce commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/1722#discussion_r157336666
  
    --- Diff: tests/jms-tests/src/test/java/org/apache/activemq/artemis/jms/tests/SecurityTest.java ---
    @@ -169,6 +180,71 @@ public void testLoginInvalidUserInvalidPassword() throws Exception {
           }
        }
     
    +   /**
    +    * Login with valid user and password
    +    * But try send to address not authorised - Persistent
    +    * Should not allow and should throw exception
    +    */
    +   @Test
    +   public void testLoginValidUserAndPasswordButNotAuthorisedToSend() throws Exception {
    +      ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
    +      Connection connection = connectionFactory.createConnection("guest", "guest");
    +      Session session = connection.createSession();
    +      Destination destination = session.createQueue("guest.cannot.send");
    +      MessageProducer messageProducer = session.createProducer(destination);
    +      try {
    +         messageProducer.send(session.createTextMessage("hello"));
    +         fail("JMSSecurityException expected as guest is not allowed to send");
    +      } catch (JMSSecurityException activeMQSecurityException) {
    +         //pass
    +      }
    +      connection.close();
    +   }
    +
    +   /**
    +    * Login with valid user and password
    +    * But try send to address not authorised - Non Persistent.
    +    * Should have same behaviour as Persistent with exception on send.
    +    */
    +   @Test
    +   public void testLoginValidUserAndPasswordButNotAuthorisedToSendNonPersistent() throws Exception {
    +      ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
    +      connectionFactory.setConfirmationWindowSize(100);
    +      connectionFactory.setBlockOnDurableSend(false);
    +      connectionFactory.setBlockOnNonDurableSend(false);
    +      Connection connection = connectionFactory.createConnection("guest", "guest");
    +      Session session = connection.createSession();
    +      Destination destination = session.createQueue("guest.cannot.send");
    +      MessageProducer messageProducer = session.createProducer(destination);
    +      messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
    +      try {
    +         AtomicReference<Exception> e = new AtomicReference<>();
    +         //        messageProducer.send(session.createTextMessage("hello"));
    +
    +         CountDownLatch countDownLatch = new CountDownLatch(1);
    +         messageProducer.send(session.createTextMessage("hello"), new CompletionListener() {
    +            @Override
    +            public void onCompletion(Message message) {
    +               countDownLatch.countDown();
    +            }
    +
    +            @Override
    +            public void onException(Message message, Exception exception) {
    +               countDownLatch.countDown();
    +               e.set(exception);
    --- End diff --
    
    good spot, thanks.


---

[GitHub] activemq-artemis pull request #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support...

Posted by franz1981 <gi...@git.apache.org>.
Github user franz1981 commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/1722#discussion_r157496805
  
    --- Diff: artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ResponseCache.java ---
    @@ -0,0 +1,85 @@
    +/*
    + * 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.artemis.core.protocol.core.impl;
    +
    +import java.util.concurrent.atomic.AtomicInteger;
    +
    +import org.apache.activemq.artemis.api.core.ActiveMQInterruptedException;
    +import org.apache.activemq.artemis.core.protocol.core.Packet;
    +import org.apache.activemq.artemis.core.protocol.core.ResponseHandler;
    +
    +public class ResponseCache {
    +
    +   private final AtomicInteger writerPointer = new AtomicInteger(0);
    +   private final AtomicInteger sequence = new AtomicInteger(0);
    +
    +   private final Packet[] store;
    +   private ResponseHandler responseHandler;
    +
    +   public ResponseCache(int size) {
    +      this.store = new Packet[size];
    +   }
    +
    +   public long add(Packet packet) {
    +      int pointer = writerPointer.getAndUpdate(operand -> {
    --- End diff --
    
    It depends on how it is accessed by concurrent writers ie `handleResponse` and `add` could be accessed by different threads concurrently?
    
    Dealing with concurrent accesses here could be dangerous: If multiple threads are accessing concurrently `Packet[]` and the references are not padded by 128 bytes (ie 4 object references between the `Packet` references in the array) the cache won't scale due to false sharing


---

[GitHub] activemq-artemis issue #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support JMS 2....

Posted by mtaylor <gi...@git.apache.org>.
Github user mtaylor commented on the issue:

    https://github.com/apache/activemq-artemis/pull/1722
  
    @michaelandrepearce In general I think this looks good.  
    
    The only thing I am not seeing here is backwards compat between the new client and an old server.  There are two ways you can easily handle this:
    1. Instead of creating new SessionSend V2 Packets, you can just extend the old one and add the extra bits at the end of the buffer.  This would mean the old server can still decode the message.  (It would just ignore the last couple bytes).
    2. Check to see if the server version >= 130 and create the appropriate packets.
    
    @clebertsuconic has just ported/extended a backwards compat framework in another PR.  Once this is merged you should be able to easily test for this.



---

[GitHub] activemq-artemis issue #1722: ARTEMIS-1545 Support JMS 2.0 Completion Listen...

Posted by clebertsuconic <gi...@git.apache.org>.
Github user clebertsuconic commented on the issue:

    https://github.com/apache/activemq-artemis/pull/1722
  
    @michaelandrepearce I'm sending a PR for your review


---

[GitHub] activemq-artemis pull request #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support...

Posted by franz1981 <gi...@git.apache.org>.
Github user franz1981 commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/1722#discussion_r157483149
  
    --- Diff: artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ResponseCache.java ---
    @@ -0,0 +1,85 @@
    +/*
    + * 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.artemis.core.protocol.core.impl;
    +
    +import java.util.concurrent.atomic.AtomicInteger;
    +
    +import org.apache.activemq.artemis.api.core.ActiveMQInterruptedException;
    +import org.apache.activemq.artemis.core.protocol.core.Packet;
    +import org.apache.activemq.artemis.core.protocol.core.ResponseHandler;
    +
    +public class ResponseCache {
    +
    +   private final AtomicInteger writerPointer = new AtomicInteger(0);
    +   private final AtomicInteger sequence = new AtomicInteger(0);
    +
    +   private final Packet[] store;
    +   private ResponseHandler responseHandler;
    +
    +   public ResponseCache(int size) {
    +      this.store = new Packet[size];
    +   }
    +
    +   public long add(Packet packet) {
    +      int pointer = writerPointer.getAndUpdate(operand -> {
    --- End diff --
    
    The `IntUnaryOperator` must be side effect free (it seems not due to `sequence.incrementAndGet` or am I wrong?) because it may be retried due to contention: [AtomicInteger::getAndUpdate](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html#getAndUpdate-java.util.function.IntUnaryOperator-).
    If this `ResponseCache` is (or could be turned into) a `single-writer` cache my suggestion is to avoid complex (and expensive) logic here



---

[GitHub] activemq-artemis pull request #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support...

Posted by michaelandrepearce <gi...@git.apache.org>.
Github user michaelandrepearce commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/1722#discussion_r157485654
  
    --- Diff: artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ResponseCache.java ---
    @@ -0,0 +1,85 @@
    +/*
    + * 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.artemis.core.protocol.core.impl;
    +
    +import java.util.concurrent.atomic.AtomicInteger;
    +
    +import org.apache.activemq.artemis.api.core.ActiveMQInterruptedException;
    +import org.apache.activemq.artemis.core.protocol.core.Packet;
    +import org.apache.activemq.artemis.core.protocol.core.ResponseHandler;
    +
    +public class ResponseCache {
    +
    +   private final AtomicInteger writerPointer = new AtomicInteger(0);
    +   private final AtomicInteger sequence = new AtomicInteger(0);
    +
    +   private final Packet[] store;
    +   private ResponseHandler responseHandler;
    +
    +   public ResponseCache(int size) {
    +      this.store = new Packet[size];
    +   }
    +
    +   public long add(Packet packet) {
    +      int pointer = writerPointer.getAndUpdate(operand -> {
    --- End diff --
    
    I want to avoid having a lock like bad here, thus this. 
    If there is retry done here it would simply set the packet at a new location in the array. And the one that won in the contention would be left set at the other.
    
    Any ideas what to do here instead?


---

[GitHub] activemq-artemis pull request #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support...

Posted by tabish121 <gi...@git.apache.org>.
Github user tabish121 commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/1722#discussion_r157260287
  
    --- Diff: tests/jms-tests/src/test/java/org/apache/activemq/artemis/jms/tests/SecurityTest.java ---
    @@ -169,6 +180,71 @@ public void testLoginInvalidUserInvalidPassword() throws Exception {
           }
        }
     
    +   /**
    +    * Login with valid user and password
    +    * But try send to address not authorised - Persistent
    +    * Should not allow and should throw exception
    +    */
    +   @Test
    +   public void testLoginValidUserAndPasswordButNotAuthorisedToSend() throws Exception {
    +      ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
    +      Connection connection = connectionFactory.createConnection("guest", "guest");
    +      Session session = connection.createSession();
    +      Destination destination = session.createQueue("guest.cannot.send");
    +      MessageProducer messageProducer = session.createProducer(destination);
    +      try {
    +         messageProducer.send(session.createTextMessage("hello"));
    +         fail("JMSSecurityException expected as guest is not allowed to send");
    +      } catch (JMSSecurityException activeMQSecurityException) {
    +         //pass
    +      }
    +      connection.close();
    +   }
    +
    +   /**
    +    * Login with valid user and password
    +    * But try send to address not authorised - Non Persistent.
    +    * Should have same behaviour as Persistent with exception on send.
    +    */
    +   @Test
    +   public void testLoginValidUserAndPasswordButNotAuthorisedToSendNonPersistent() throws Exception {
    +      ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
    +      connectionFactory.setConfirmationWindowSize(100);
    +      connectionFactory.setBlockOnDurableSend(false);
    +      connectionFactory.setBlockOnNonDurableSend(false);
    +      Connection connection = connectionFactory.createConnection("guest", "guest");
    +      Session session = connection.createSession();
    +      Destination destination = session.createQueue("guest.cannot.send");
    +      MessageProducer messageProducer = session.createProducer(destination);
    +      messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
    +      try {
    +         AtomicReference<Exception> e = new AtomicReference<>();
    +         //        messageProducer.send(session.createTextMessage("hello"));
    +
    +         CountDownLatch countDownLatch = new CountDownLatch(1);
    +         messageProducer.send(session.createTextMessage("hello"), new CompletionListener() {
    +            @Override
    +            public void onCompletion(Message message) {
    +               countDownLatch.countDown();
    +            }
    +
    +            @Override
    +            public void onException(Message message, Exception exception) {
    +               countDownLatch.countDown();
    +               e.set(exception);
    --- End diff --
    
    The set here should occur prior to the countDown to avoid potential race on the later check of error state.  


---

[GitHub] activemq-artemis issue #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support JMS 2....

Posted by michaelandrepearce <gi...@git.apache.org>.
Github user michaelandrepearce commented on the issue:

    https://github.com/apache/activemq-artemis/pull/1722
  
    @mtaylor i was thinking on option 2, because i didn't know i could safely do option 1, are you confirming it would be safe to do that then? If so Bingo, I'm doing option 1 :)


---

[GitHub] activemq-artemis pull request #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support...

Posted by franz1981 <gi...@git.apache.org>.
Github user franz1981 commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/1722#discussion_r157459675
  
    --- Diff: artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/Packet.java ---
    @@ -42,6 +42,21 @@ default int expectedEncodeSize() {
           return INITIAL_PACKET_SIZE;
        }
     
    +   default boolean isRequiresResponse() {
    --- End diff --
    
    be careful to use `default` method on hottest paths vs common abstract methods on superclass: they lack CHA AFAIK!
    http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/2015-April/thread.html#17649 and https://stackoverflow.com/questions/30312096/java-default-methods-is-slower-than-the-same-code-but-in-an-abstract-class


---

[GitHub] activemq-artemis issue #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support JMS 2....

Posted by mtaylor <gi...@git.apache.org>.
Github user mtaylor commented on the issue:

    https://github.com/apache/activemq-artemis/pull/1722
  
    1. Should be fine.  Just add an if when you're decoding to check that there's data on the buffer when you're decoding.  If yes, try to decode the rest, if not then set the defaults.  I've done this a lot in the past with journal records, I can't see an issue with doing on it with Packets either.  @clebertsuconic Can you see a problem with this?


---

[GitHub] activemq-artemis pull request #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support...

Posted by michaelandrepearce <gi...@git.apache.org>.
Github user michaelandrepearce commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/1722#discussion_r157488380
  
    --- Diff: artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/ServerPacketDecoder.java ---
    @@ -115,6 +123,8 @@ public Packet decode(final ActiveMQBuffer in) {
           switch (packetType) {
              case SESS_SEND:
                 return decodeSessionSendMessage(in);
    +         case SESS_SEND_V2:
    +            return decodeSessionSendMessageV2(in);
    --- End diff --
    
    Thats fine, any clashes i will sort when i rebase, I'm kinda holding off doing any further work right now until you're merges tbh.


---

[GitHub] activemq-artemis pull request #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support...

Posted by franz1981 <gi...@git.apache.org>.
Github user franz1981 commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/1722#discussion_r157748076
  
    --- Diff: artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ResponseCache.java ---
    @@ -0,0 +1,61 @@
    +/*
    + * 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.artemis.core.protocol.core.impl;
    +
    +import java.util.concurrent.atomic.AtomicLong;
    +
    +import org.apache.activemq.artemis.api.core.ActiveMQInterruptedException;
    +import org.apache.activemq.artemis.core.protocol.core.Packet;
    +import org.apache.activemq.artemis.core.protocol.core.ResponseHandler;
    +import org.apache.activemq.artemis.utils.collections.ConcurrentLongHashMap;
    +
    +public class ResponseCache {
    +
    +   private final AtomicLong sequence = new AtomicLong(0);
    +
    +   private final ConcurrentLongHashMap<Packet> store;
    +   private final int size;
    +   private ResponseHandler responseHandler;
    +
    +   public ResponseCache(int size) {
    +      this.store = new ConcurrentLongHashMap<>(size);
    +      this.size = size;
    +   }
    +
    +   public long add(Packet packet) {
    +      if (store.size() + 1 > size) {
    +         throw new ActiveMQInterruptedException("unable to send due to buffer full");
    +      }
    +      long correlationID = sequence.incrementAndGet();
    +      packet.setCorrelationID(correlationID);
    +      this.store.put(correlationID, packet);
    +      return correlationID;
    +   }
    +
    +   public void handleResponse(Packet response) {
    +      long correlationID = response.getCorrelationID();
    +      Packet packet = store.get(correlationID);
    --- End diff --
    
    Well done, provided that there aren't memory leaks on `Packet` for me is ok: just take some time (I will try for sure) to bench if it can cause any regressions with a scale stress test, just in case!


---

[GitHub] activemq-artemis pull request #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support...

Posted by michaelandrepearce <gi...@git.apache.org>.
Github user michaelandrepearce commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/1722#discussion_r157484746
  
    --- Diff: artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/Packet.java ---
    @@ -42,6 +42,21 @@ default int expectedEncodeSize() {
           return INITIAL_PACKET_SIZE;
        }
     
    +   default boolean isRequiresResponse() {
    --- End diff --
    
    good point, ill move to PacketImpl the default behaviour.


---

[GitHub] activemq-artemis pull request #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support...

Posted by franz1981 <gi...@git.apache.org>.
Github user franz1981 commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/1722#discussion_r157484631
  
    --- Diff: artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ResponseCache.java ---
    @@ -0,0 +1,85 @@
    +/*
    + * 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.artemis.core.protocol.core.impl;
    +
    +import java.util.concurrent.atomic.AtomicInteger;
    +
    +import org.apache.activemq.artemis.api.core.ActiveMQInterruptedException;
    +import org.apache.activemq.artemis.core.protocol.core.Packet;
    +import org.apache.activemq.artemis.core.protocol.core.ResponseHandler;
    +
    +public class ResponseCache {
    +
    +   private final AtomicInteger writerPointer = new AtomicInteger(0);
    +   private final AtomicInteger sequence = new AtomicInteger(0);
    +
    +   private final Packet[] store;
    +   private ResponseHandler responseHandler;
    +
    +   public ResponseCache(int size) {
    +      this.store = new Packet[size];
    +   }
    +
    +   public long add(Packet packet) {
    +      int pointer = writerPointer.getAndUpdate(operand -> {
    +         Packet p = store[operand];
    +         if (p != null) {
    +            return operand;
    +         }
    +         packet.setCorrelationID(correlationID(operand, sequence.incrementAndGet()));
    +         store[operand] = packet;
    +         return operand + 1 == store.length ? 0 : operand + 1;
    +      });
    +
    +      if (pointer(packet.getCorrelationID()) != pointer) {
    +         throw new ActiveMQInterruptedException("unable to send due to buffer full");
    +      }
    +
    +      return packet.getCorrelationID();
    +   }
    +
    +   public void handleResponse(Packet response) {
    +      long correlationID = response.getCorrelationID();
    +      int pointer = pointer(correlationID);
    +      if (pointer > -1 && pointer < store.length) {
    +         Packet p = store[pointer];
    +         if (p != null && p.getCorrelationID() == correlationID) {
    +            store[pointer] = null;
    +         }
    +         if (responseHandler != null) {
    +            responseHandler.responseHandler(p, response);
    +         }
    +      }
    +   }
    +
    +   public long correlationID(int pointer, int sequence) {
    +      long l = (((long)pointer) << 32) | (sequence & 0xffffffffL);
    +      return l;
    +   }
    +
    +   public int pointer(long l) {
    +      return (int)(l >> 32);
    --- End diff --
    
    I would use `>>>` here


---

[GitHub] activemq-artemis pull request #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support...

Posted by clebertsuconic <gi...@git.apache.org>.
Github user clebertsuconic commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/1722#discussion_r157487888
  
    --- Diff: artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/ServerPacketDecoder.java ---
    @@ -115,6 +123,8 @@ public Packet decode(final ActiveMQBuffer in) {
           switch (packetType) {
              case SESS_SEND:
                 return decodeSessionSendMessage(in);
    +         case SESS_SEND_V2:
    +            return decodeSessionSendMessageV2(in);
    --- End diff --
    
    This will clash with my changes...  that's about to be merged today.


---

[GitHub] activemq-artemis issue #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support JMS 2....

Posted by michaelandrepearce <gi...@git.apache.org>.
Github user michaelandrepearce commented on the issue:

    https://github.com/apache/activemq-artemis/pull/1722
  
    @mtaylor also if you get a chance to give any early feedback


---

[GitHub] activemq-artemis pull request #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support...

Posted by franz1981 <gi...@git.apache.org>.
Github user franz1981 commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/1722#discussion_r157484426
  
    --- Diff: artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ResponseCache.java ---
    @@ -0,0 +1,85 @@
    +/*
    + * 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.artemis.core.protocol.core.impl;
    +
    +import java.util.concurrent.atomic.AtomicInteger;
    +
    +import org.apache.activemq.artemis.api.core.ActiveMQInterruptedException;
    +import org.apache.activemq.artemis.core.protocol.core.Packet;
    +import org.apache.activemq.artemis.core.protocol.core.ResponseHandler;
    +
    +public class ResponseCache {
    +
    +   private final AtomicInteger writerPointer = new AtomicInteger(0);
    +   private final AtomicInteger sequence = new AtomicInteger(0);
    +
    +   private final Packet[] store;
    +   private ResponseHandler responseHandler;
    +
    +   public ResponseCache(int size) {
    +      this.store = new Packet[size];
    +   }
    +
    +   public long add(Packet packet) {
    +      int pointer = writerPointer.getAndUpdate(operand -> {
    +         Packet p = store[operand];
    +         if (p != null) {
    +            return operand;
    +         }
    +         packet.setCorrelationID(correlationID(operand, sequence.incrementAndGet()));
    +         store[operand] = packet;
    +         return operand + 1 == store.length ? 0 : operand + 1;
    +      });
    +
    +      if (pointer(packet.getCorrelationID()) != pointer) {
    +         throw new ActiveMQInterruptedException("unable to send due to buffer full");
    +      }
    +
    +      return packet.getCorrelationID();
    +   }
    +
    +   public void handleResponse(Packet response) {
    +      long correlationID = response.getCorrelationID();
    +      int pointer = pointer(correlationID);
    +      if (pointer > -1 && pointer < store.length) {
    +         Packet p = store[pointer];
    +         if (p != null && p.getCorrelationID() == correlationID) {
    +            store[pointer] = null;
    +         }
    +         if (responseHandler != null) {
    +            responseHandler.responseHandler(p, response);
    +         }
    +      }
    +   }
    +
    +   public long correlationID(int pointer, int sequence) {
    --- End diff --
    
    I would make this method static and uses `(pointer & 0xFFFF_FFFFL) << 32` to make explicit what is happing during the upcast


---

[GitHub] activemq-artemis pull request #1722: ARTEMIS-1545 Support JMS 2.0 Completion...

Posted by asfgit <gi...@git.apache.org>.
Github user asfgit closed the pull request at:

    https://github.com/apache/activemq-artemis/pull/1722


---

[GitHub] activemq-artemis issue #1722: ARTEMIS-1545 Support JMS 2.0 Completion Listen...

Posted by clebertsuconic <gi...@git.apache.org>.
Github user clebertsuconic commented on the issue:

    https://github.com/apache/activemq-artemis/pull/1722
  
    @michaelandrepearce I will revert this PR... it's breaking the testsuite really badly..
    
    Can you send it back again, so we work through the issues?


---

[GitHub] activemq-artemis pull request #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support...

Posted by michaelandrepearce <gi...@git.apache.org>.
Github user michaelandrepearce commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/1722#discussion_r157486228
  
    --- Diff: artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/ServerPacketDecoder.java ---
    @@ -115,6 +123,8 @@ public Packet decode(final ActiveMQBuffer in) {
           switch (packetType) {
              case SESS_SEND:
                 return decodeSessionSendMessage(in);
    +         case SESS_SEND_V2:
    +            return decodeSessionSendMessageV2(in);
    --- End diff --
    
    it is common case, it will replace SESS_SEND


---

[GitHub] activemq-artemis pull request #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support...

Posted by michaelandrepearce <gi...@git.apache.org>.
Github user michaelandrepearce commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/1722#discussion_r157746259
  
    --- Diff: artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ResponseCache.java ---
    @@ -0,0 +1,61 @@
    +/*
    + * 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.artemis.core.protocol.core.impl;
    +
    +import java.util.concurrent.atomic.AtomicLong;
    +
    +import org.apache.activemq.artemis.api.core.ActiveMQInterruptedException;
    +import org.apache.activemq.artemis.core.protocol.core.Packet;
    +import org.apache.activemq.artemis.core.protocol.core.ResponseHandler;
    +import org.apache.activemq.artemis.utils.collections.ConcurrentLongHashMap;
    +
    +public class ResponseCache {
    +
    +   private final AtomicLong sequence = new AtomicLong(0);
    +
    +   private final ConcurrentLongHashMap<Packet> store;
    +   private final int size;
    +   private ResponseHandler responseHandler;
    +
    +   public ResponseCache(int size) {
    +      this.store = new ConcurrentLongHashMap<>(size);
    +      this.size = size;
    +   }
    +
    +   public long add(Packet packet) {
    +      if (store.size() + 1 > size) {
    +         throw new ActiveMQInterruptedException("unable to send due to buffer full");
    +      }
    +      long correlationID = sequence.incrementAndGet();
    +      packet.setCorrelationID(correlationID);
    +      this.store.put(correlationID, packet);
    +      return correlationID;
    +   }
    +
    +   public void handleResponse(Packet response) {
    +      long correlationID = response.getCorrelationID();
    +      Packet packet = store.get(correlationID);
    --- End diff --
    
    oops, this was actually what i did originally, i had an issue of correlationID not being set, so added this to debug, but forgot to revert, good spotting it.


---

[GitHub] activemq-artemis pull request #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support...

Posted by franz1981 <gi...@git.apache.org>.
Github user franz1981 commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/1722#discussion_r157743906
  
    --- Diff: artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ResponseCache.java ---
    @@ -0,0 +1,61 @@
    +/*
    + * 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.artemis.core.protocol.core.impl;
    +
    +import java.util.concurrent.atomic.AtomicLong;
    +
    +import org.apache.activemq.artemis.api.core.ActiveMQInterruptedException;
    +import org.apache.activemq.artemis.core.protocol.core.Packet;
    +import org.apache.activemq.artemis.core.protocol.core.ResponseHandler;
    +import org.apache.activemq.artemis.utils.collections.ConcurrentLongHashMap;
    +
    +public class ResponseCache {
    +
    +   private final AtomicLong sequence = new AtomicLong(0);
    +
    +   private final ConcurrentLongHashMap<Packet> store;
    +   private final int size;
    +   private ResponseHandler responseHandler;
    +
    +   public ResponseCache(int size) {
    +      this.store = new ConcurrentLongHashMap<>(size);
    +      this.size = size;
    +   }
    +
    +   public long add(Packet packet) {
    +      if (store.size() + 1 > size) {
    +         throw new ActiveMQInterruptedException("unable to send due to buffer full");
    +      }
    +      long correlationID = sequence.incrementAndGet();
    +      packet.setCorrelationID(correlationID);
    +      this.store.put(correlationID, packet);
    +      return correlationID;
    +   }
    +
    +   public void handleResponse(Packet response) {
    +      long correlationID = response.getCorrelationID();
    +      Packet packet = store.get(correlationID);
    --- End diff --
    
    Would be better to just use `store::remove` that return the current value (if any) of the `correlationID` key


---

[GitHub] activemq-artemis issue #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support JMS 2....

Posted by clebertsuconic <gi...@git.apache.org>.
Github user clebertsuconic commented on the issue:

    https://github.com/apache/activemq-artemis/pull/1722
  
    I would like to see a compatibility test added on the testsuite I’m working on. I can help with that. 


---

[GitHub] activemq-artemis pull request #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support...

Posted by michaelandrepearce <gi...@git.apache.org>.
Github user michaelandrepearce commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/1722#discussion_r157736374
  
    --- Diff: artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ResponseCache.java ---
    @@ -0,0 +1,85 @@
    +/*
    + * 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.artemis.core.protocol.core.impl;
    +
    +import java.util.concurrent.atomic.AtomicInteger;
    +
    +import org.apache.activemq.artemis.api.core.ActiveMQInterruptedException;
    +import org.apache.activemq.artemis.core.protocol.core.Packet;
    +import org.apache.activemq.artemis.core.protocol.core.ResponseHandler;
    +
    +public class ResponseCache {
    +
    +   private final AtomicInteger writerPointer = new AtomicInteger(0);
    +   private final AtomicInteger sequence = new AtomicInteger(0);
    +
    +   private final Packet[] store;
    +   private ResponseHandler responseHandler;
    +
    +   public ResponseCache(int size) {
    +      this.store = new Packet[size];
    +   }
    +
    +   public long add(Packet packet) {
    +      int pointer = writerPointer.getAndUpdate(operand -> {
    --- End diff --
    
    endedup just making a simpler solution using the already existing and tested ConcurrentLongHashMap we have, made all this a lot simpler.


---

[GitHub] activemq-artemis issue #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support JMS 2....

Posted by michaelandrepearce <gi...@git.apache.org>.
Github user michaelandrepearce commented on the issue:

    https://github.com/apache/activemq-artemis/pull/1722
  
    @clebertsuconic agreed, need some more tests, i was waiting a little like @mtaylor and yourself have said for you're PR to merge first, as ill have some conflicts ill need to sort as well when i rebase.


---

[GitHub] activemq-artemis pull request #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support...

Posted by michaelandrepearce <gi...@git.apache.org>.
Github user michaelandrepearce commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/1722#discussion_r157736414
  
    --- Diff: artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/Packet.java ---
    @@ -42,6 +42,21 @@ default int expectedEncodeSize() {
           return INITIAL_PACKET_SIZE;
        }
     
    +   default boolean isRequiresResponse() {
    --- End diff --
    
    done


---

[GitHub] activemq-artemis pull request #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support...

Posted by michaelandrepearce <gi...@git.apache.org>.
Github user michaelandrepearce commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/1722#discussion_r157736217
  
    --- Diff: artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/ServerPacketDecoder.java ---
    @@ -115,6 +123,8 @@ public Packet decode(final ActiveMQBuffer in) {
           switch (packetType) {
              case SESS_SEND:
                 return decodeSessionSendMessage(in);
    +         case SESS_SEND_V2:
    +            return decodeSessionSendMessageV2(in);
    --- End diff --
    
    I have rebased and sorted, was easy to fix, but thanks for the warning @clebertsuconic 


---

[GitHub] activemq-artemis pull request #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support...

Posted by franz1981 <gi...@git.apache.org>.
Github user franz1981 commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/1722#discussion_r157485298
  
    --- Diff: artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/ServerPacketDecoder.java ---
    @@ -115,6 +123,8 @@ public Packet decode(final ActiveMQBuffer in) {
           switch (packetType) {
              case SESS_SEND:
                 return decodeSessionSendMessage(in);
    +         case SESS_SEND_V2:
    +            return decodeSessionSendMessageV2(in);
    --- End diff --
    
    If decodeSessionSendMessageV2 is not supposed to be the common case here, would be better to move it on the `slowPathDecode`  instead


---

[GitHub] activemq-artemis issue #1722: (WIP DO NOT MERGE) ARTEMIS-1545 Support JMS 2....

Posted by michaelandrepearce <gi...@git.apache.org>.
Github user michaelandrepearce commented on the issue:

    https://github.com/apache/activemq-artemis/pull/1722
  
    @clebertsuconic on compatibility test front, i went to check the existing test and it seems for the two new packets the client will send for this (SESS_SEND_V2 and SESS_SEND_CONTINUATION_V2), these flow's are already covered including the ack (also they correctly failed, until i implemented the compatibility change bits i had left outstanding - now implemented)


---

[GitHub] activemq-artemis issue #1722: ARTEMIS-1545 Support JMS 2.0 Completion Listen...

Posted by clebertsuconic <gi...@git.apache.org>.
Github user clebertsuconic commented on the issue:

    https://github.com/apache/activemq-artemis/pull/1722
  
    @michaelandrepearce I merged this.. but I just realized an issue.
    
    
    When you run regular sends.. you don't even need different versions...
    
    you will see this:
    
    ```
    [Thread-6 (ActiveMQ-server-org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl$5@71075444)] 15:12:26,056 WARN  [org.apache.activemq.artemis.core.server] AMQ222165: No Dead Letter Address configured for queue queue in AddressSettings
    [Thread-6 (ActiveMQ-server-org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl$5@71075444)] 15:12:26,056 WARN  [org.apache.activemq.artemis.core.server] AMQ222166: No Expiry Address configured for queue queue in AddressSettings
    Sending messages
    [main] 15:12:26,321 WARN  [org.apache.activemq.artemis.core.client] AMQ212052: Packet PACKET(SuccessResponseMessage)[type=23, channelID=11, packetObject=SuccessResponseMessage, correlationID=16] was answered out of sequence due to a previous server timeout and it's being ignored: java.lang.Exception: trace
    	at org.apache.activemq.artemis.core.protocol.core.impl.ChannelImpl.sendBlocking(ChannelImpl.java:417) [:]
    	at org.apache.activemq.artemis.core.protocol.core.impl.ChannelImpl.sendBlocking(ChannelImpl.java:341) [:]
    	at org.apache.activemq.artemis.core.protocol.core.impl.ActiveMQSessionContext.simpleCommit(ActiveMQSessionContext.java:401) [:]
    	at org.apache.activemq.artemis.core.client.impl.ClientSessionImpl.commit(ClientSessionImpl.java:791) [:]
    	at org.apache.activemq.artemis.core.client.impl.ClientSessionImpl.commit(ClientSessionImpl.java:764) [:]
    	at org.apache.activemq.artemis.jms.client.ActiveMQSession.commit(ActiveMQSession.java:230) [:]
    	at javax.jms.Session$commit$6.call(Unknown Source) [:1.0-alpha-2]
    	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45) [groovy-all-2.4.3.jar:2.4.3]
    	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:110) [groovy-all-2.4.3.jar:2.4.3]
    	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:114) [groovy-all-2.4.3.jar:2.4.3]
    	at meshTest.sendMessages.run(sendMessages.groovy:102)
    	at groovy.lang.GroovyShell.evaluate(GroovyShell.java:589) [groovy-all-2.4.3.jar:2.4.3]
    	at groovy.lang.GroovyShell.evaluate(GroovyShell.java:645) [groovy-all-2.4.3.jar:2.4.3]
    	at org.apache.activemq.artemis.tests.compatibility.GroovyRun.evaluate(GroovyRun.java:66) [:]
    	at org.apache.activemq.artemis.tests.compatibility.GroovyRun.doMain(GroovyRun.java:45) [:]
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.8.0_73]
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) [rt.jar:1.8.0_73]
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.8.0_73]
    	at java.lang.reflect.Method.invoke(Method.java:497) [rt.jar:1.8.0_73]
    	at org.apache.activemq.artemis.tests.compatibility.VersionedBaseTest.lambda$callMain$0(VersionedBaseTest.java:115) [:]
    	at org.apache.activemq.artemis.tests.compatibility.VersionedBaseTest.tclCall(VersionedBaseTest.java:132) [:]
    	at org.apache.activemq.artemis.tests.compatibility.VersionedBaseTest.callMain(VersionedBaseTest.java:112) [:]
    	at org.apache.activemq.artemis.tests.compatibility.MeshTest.testSendReceive(MeshTest.java:74) [:]
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.8.0_73]
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) [rt.jar:1.8.0_73]
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.8.0_73]
    	at java.lang.reflect.Method.invoke(Method.java:497) [rt.jar:1.8.0_73]
    	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) [junit-4.11.jar:]
    	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) [junit-4.11.jar:]
    	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) [junit-4.11.jar:]
    	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) [junit-4.11.jar:]
    	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) [junit-4.11.jar:]
    	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) [junit-4.11.jar:]
    	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) [junit-4.11.jar:]
    	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) [junit-4.11.jar:]
    	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) [junit-4.11.jar:]
    	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) [junit-4.11.jar:]
    	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) [junit-4.11.jar:]
    	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) [junit-4.11.jar:]
    	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) [junit-4.11.jar:]
    	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) [junit-4.11.jar:]
    	at org.junit.runners.ParentRunner.run(ParentRunner.java:309) [junit-4.11.jar:]
    	at org.junit.runners.Suite.runChild(Suite.java:127) [junit-4.11.jar:]
    	at org.junit.runners.Suite.runChild(Suite.java:26) [junit-4.11.jar:]
    	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) [junit-4.11.jar:]
    	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) [junit-4.11.jar:]
    	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) [junit-4.11.jar:]
    	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) [junit-4.11.jar:]
    	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) [junit-4.11.jar:]
    	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) [junit-4.11.jar:]
    	at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:48) [junit-4.11.jar:]
    	at org.junit.rules.RunRules.evaluate(RunRules.java:20) [junit-4.11.jar:]
    	at org.junit.runners.ParentRunner.run(ParentRunner.java:309) [junit-4.11.jar:]
    	at org.junit.runner.JUnitCore.run(JUnitCore.java:160) [junit-4.11.jar:]
    	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) [junit-rt.jar:]
    	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) [junit-rt.jar:]
    	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) [junit-rt.jar:]
    	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) [junit-rt.jar:]
    
    ```
    
    
    which is not the response from the commit.



---