ARTEMIS-4254 Improving Transaction test with replication to use 3 nodes

This commit is contained in:
Clebert Suconic 2023-04-26 18:17:12 -04:00 committed by clebertsuconic
parent fb1fa6a95f
commit f733cac08f
9 changed files with 656 additions and 56 deletions

View File

@ -124,7 +124,11 @@ public class ServerUtil {
}
public static boolean waitForServerToStart(int id, String username, String password, int timeout) throws InterruptedException {
return waitForServerToStart("tcp://localhost:" + (61616 + id), username, password, timeout);
return waitForServerToStartOnPort(61616 + id, username, password, timeout);
}
public static boolean waitForServerToStartOnPort(int port, String username, String password, int timeout) throws InterruptedException {
return waitForServerToStart("tcp://localhost:" + port, username, password, timeout);
}
public static boolean waitForServerToStart(String uri, long timeout) throws InterruptedException {

View File

@ -387,15 +387,15 @@
</execution>
<execution>
<phase>test-compile</phase>
<id>created-tx-check-replica0</id>
<id>create-tx-check-backup-zero</id>
<goals>
<goal>create</goal>
</goals>
<configuration>
<!-- this makes it easier in certain envs -->
<javaOptions>-Djava.net.preferIPv4Stack=true</javaOptions>
<instance>${basedir}/target/replica-tx-check/replicated-static0</instance>
<configuration>${basedir}/target/classes/servers/replica-tx-check/replicated-static0</configuration>
<instance>${basedir}/target/replica-tx-check/backup-zero</instance>
<configuration>${basedir}/target/classes/servers/replica-tx-check/backup-zero</configuration>
<args>
<arg>--java-options</arg>
<arg>-ea</arg>
@ -404,15 +404,15 @@
</execution>
<execution>
<phase>test-compile</phase>
<id>create-tx-check-replica1</id>
<id>create-tx-check-live-zero</id>
<goals>
<goal>create</goal>
</goals>
<configuration>
<!-- this makes it easier in certain envs -->
<javaOptions>-Djava.net.preferIPv4Stack=true</javaOptions>
<instance>${basedir}/target/replica-tx-check/replicated-static1</instance>
<configuration>${basedir}/target/classes/servers/replica-tx-check/replicated-static1</configuration>
<instance>${basedir}/target/replica-tx-check/live-zero</instance>
<configuration>${basedir}/target/classes/servers/replica-tx-check/live-zero</configuration>
<args>
<arg>--java-options</arg>
<arg>-ea</arg>
@ -421,15 +421,66 @@
</execution>
<execution>
<phase>test-compile</phase>
<id>create-tx-check-standalone</id>
<id>create-tx-check-backup-one</id>
<goals>
<goal>create</goal>
</goals>
<configuration>
<!-- this makes it easier in certain envs -->
<javaOptions>-Djava.net.preferIPv4Stack=true</javaOptions>
<instance>${basedir}/target/replica-tx-check/standalone</instance>
<configuration>${basedir}/target/classes/servers/replica-tx-check/standalone</configuration>
<instance>${basedir}/target/replica-tx-check/backup-one</instance>
<configuration>${basedir}/target/classes/servers/replica-tx-check/backup-one</configuration>
<args>
<arg>--java-options</arg>
<arg>-ea</arg>
</args>
</configuration>
</execution>
<execution>
<phase>test-compile</phase>
<id>create-tx-check-live-one</id>
<goals>
<goal>create</goal>
</goals>
<configuration>
<!-- this makes it easier in certain envs -->
<javaOptions>-Djava.net.preferIPv4Stack=true</javaOptions>
<instance>${basedir}/target/replica-tx-check/live-one</instance>
<configuration>${basedir}/target/classes/servers/replica-tx-check/live-one</configuration>
<args>
<arg>--java-options</arg>
<arg>-ea</arg>
</args>
</configuration>
</execution>
<execution>
<phase>test-compile</phase>
<id>create-tx-check-backup-two</id>
<goals>
<goal>create</goal>
</goals>
<configuration>
<!-- this makes it easier in certain envs -->
<javaOptions>-Djava.net.preferIPv4Stack=true</javaOptions>
<instance>${basedir}/target/replica-tx-check/backup-two</instance>
<configuration>${basedir}/target/classes/servers/replica-tx-check/backup-two</configuration>
<args>
<arg>--java-options</arg>
<arg>-ea</arg>
</args>
</configuration>
</execution>
<execution>
<phase>test-compile</phase>
<id>create-tx-check-live-two</id>
<goals>
<goal>create</goal>
</goals>
<configuration>
<!-- this makes it easier in certain envs -->
<javaOptions>-Djava.net.preferIPv4Stack=true</javaOptions>
<instance>${basedir}/target/replica-tx-check/live-two</instance>
<configuration>${basedir}/target/classes/servers/replica-tx-check/live-two</configuration>
<args>
<arg>--java-options</arg>
<arg>-ea</arg>

View File

@ -37,29 +37,39 @@ under the License.
<ha-policy>
<replication>
<slave>
<allow-failback>true</allow-failback>
<!-- not needed but tells the backup not to restart after failback as there will be > 0 backups saved -->
<max-saved-replicated-journals-size>0</max-saved-replicated-journals-size>
<group-name>test-pair-one</group-name>
<allow-failback>false</allow-failback>
<quorum-size>2</quorum-size>
</slave>
</replication>
</ha-policy>
<!-- Connectors -->
<connectors>
<connector name="netty-live-connector">tcp://localhost:61616</connector>
<connector name="netty-connector">tcp://localhost:61617</connector>
<connector name="zero-live-connector">tcp://localhost:61000</connector>
<connector name="zero-backup-connector">tcp://localhost:61100</connector>
<connector name="one-live-connector">tcp://localhost:61001</connector>
<connector name="one-backup-connector">tcp://localhost:61101</connector>
<connector name="two-live-connector">tcp://localhost:61002</connector>
<connector name="two-backup-connector">tcp://localhost:61102</connector>
</connectors>
<!-- Acceptors -->
<acceptors>
<acceptor name="netty-acceptor">tcp://localhost:61617</acceptor>
<acceptor name="netty-acceptor">tcp://localhost:61101</acceptor>
</acceptors>
<cluster-connections>
<cluster-connection name="my-cluster">
<connector-ref>netty-connector</connector-ref>
<connector-ref>one-backup-connector</connector-ref>
<message-load-balancing>OFF</message-load-balancing>
<max-hops>1</max-hops>
<static-connectors>
<connector-ref>netty-live-connector</connector-ref>
<connector-ref>zero-live-connector</connector-ref>
<connector-ref>zero-backup-connector</connector-ref>
<connector-ref>one-live-connector</connector-ref>
<connector-ref>two-live-connector</connector-ref>
<connector-ref>two-backup-connector</connector-ref>
</static-connectors>
</cluster-connection>
</cluster-connections>

View File

@ -36,28 +36,40 @@ under the License.
<ha-policy>
<replication>
<master>
<!--we need this for auto failback-->
<check-for-live-server>true</check-for-live-server>
</master>
<slave>
<group-name>test-pair-two</group-name>
<allow-failback>false</allow-failback>
<quorum-size>2</quorum-size>
</slave>
</replication>
</ha-policy>
<!-- Connectors -->
<connectors>
<connector name="netty-connector">tcp://localhost:61616</connector>
<connector name="netty-backup-connector">tcp://localhost:61617</connector>
<connector name="zero-live-connector">tcp://localhost:61000</connector>
<connector name="zero-backup-connector">tcp://localhost:61100</connector>
<connector name="one-live-connector">tcp://localhost:61001</connector>
<connector name="one-backup-connector">tcp://localhost:61101</connector>
<connector name="two-live-connector">tcp://localhost:61002</connector>
<connector name="two-backup-connector">tcp://localhost:61102</connector>
</connectors>
<!-- Acceptors -->
<acceptors>
<acceptor name="netty-acceptor">tcp://localhost:61616</acceptor>
<acceptor name="netty-acceptor">tcp://localhost:61102</acceptor>
</acceptors>
<cluster-connections>
<cluster-connection name="my-cluster">
<connector-ref>netty-connector</connector-ref>
<connector-ref>two-backup-connector</connector-ref>
<message-load-balancing>OFF</message-load-balancing>
<max-hops>1</max-hops>
<static-connectors>
<connector-ref>netty-backup-connector</connector-ref>
<connector-ref>zero-live-connector</connector-ref>
<connector-ref>zero-backup-connector</connector-ref>
<connector-ref>one-live-connector</connector-ref>
<connector-ref>one-backup-connector</connector-ref>
<connector-ref>two-live-connector</connector-ref>
</static-connectors>
</cluster-connection>
</cluster-connections>
@ -100,7 +112,6 @@ under the License.
<!-- with -1 only the global-max-size is in use for limiting -->
<max-size-bytes>10MB</max-size-bytes>
<page-size-bytes>1MB</page-size-bytes>
<max-read-page-messages>-1</max-read-page-messages>
<max-read-page-bytes>-1</max-read-page-bytes>

View File

@ -30,16 +30,51 @@ under the License.
<paging-directory>./data/paging</paging-directory>
<cluster-user>exampleUser</cluster-user>
<cluster-password>secret</cluster-password>
<ha-policy>
<replication>
<slave>
<group-name>test-pair-zero</group-name>
<allow-failback>false</allow-failback>
<quorum-size>2</quorum-size>
</slave>
</replication>
</ha-policy>
<!-- Connectors -->
<connectors>
<connector name="netty-connector">tcp://localhost:61615</connector>
<connector name="zero-live-connector">tcp://localhost:61000</connector>
<connector name="zero-backup-connector">tcp://localhost:61100</connector>
<connector name="one-live-connector">tcp://localhost:61001</connector>
<connector name="one-backup-connector">tcp://localhost:61101</connector>
<connector name="two-live-connector">tcp://localhost:61002</connector>
<connector name="two-backup-connector">tcp://localhost:61102</connector>
</connectors>
<!-- Acceptors -->
<acceptors>
<acceptor name="netty-acceptor">tcp://localhost:61615</acceptor>
<acceptor name="netty-acceptor">tcp://localhost:61100</acceptor>
</acceptors>
<cluster-connections>
<cluster-connection name="my-cluster">
<connector-ref>zero-backup-connector</connector-ref>
<message-load-balancing>OFF</message-load-balancing>
<max-hops>1</max-hops>
<static-connectors>
<connector-ref>zero-live-connector</connector-ref>
<connector-ref>one-live-connector</connector-ref>
<connector-ref>one-backup-connector</connector-ref>
<connector-ref>two-live-connector</connector-ref>
<connector-ref>two-backup-connector</connector-ref>
</static-connectors>
</cluster-connection>
</cluster-connections>
<!-- Other config -->
<security-settings>
<!--security for example queue-->
<security-setting match="#">

View File

@ -0,0 +1,144 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
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.
--><configuration xmlns="urn:activemq" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:activemq /schema/artemis-server.xsd">
<core xmlns="urn:activemq:core">
<bindings-directory>./data/bindings</bindings-directory>
<journal-directory>./data/journal</journal-directory>
<large-messages-directory>./data/largemessages</large-messages-directory>
<paging-directory>./data/paging</paging-directory>
<cluster-user>exampleUser</cluster-user>
<cluster-password>secret</cluster-password>
<ha-policy>
<replication>
<master>
<group-name>test-pair-one</group-name>
<check-for-live-server>false</check-for-live-server>
<vote-on-replication-failure>false</vote-on-replication-failure>
<quorum-size>2</quorum-size>
</master>
</replication>
</ha-policy>
<!-- Connectors -->
<connectors>
<connector name="zero-live-connector">tcp://localhost:61000</connector>
<connector name="zero-backup-connector">tcp://localhost:61100</connector>
<connector name="one-live-connector">tcp://localhost:61001</connector>
<connector name="one-backup-connector">tcp://localhost:61101</connector>
<connector name="two-live-connector">tcp://localhost:61002</connector>
<connector name="two-backup-connector">tcp://localhost:61102</connector>
</connectors>
<!-- Acceptors -->
<acceptors>
<acceptor name="netty-acceptor">tcp://localhost:61001</acceptor>
</acceptors>
<cluster-connections>
<cluster-connection name="my-cluster">
<connector-ref>one-live-connector</connector-ref>
<message-load-balancing>OFF</message-load-balancing>
<max-hops>1</max-hops>
<static-connectors>
<connector-ref>zero-live-connector</connector-ref>
<connector-ref>zero-backup-connector</connector-ref>
<connector-ref>one-backup-connector</connector-ref>
<connector-ref>two-live-connector</connector-ref>
<connector-ref>two-backup-connector</connector-ref>
</static-connectors>
</cluster-connection>
</cluster-connections>
<!-- Other config -->
<security-settings>
<!--security for example queue-->
<security-setting match="#">
<permission type="createNonDurableQueue" roles="amq, guest"/>
<permission type="deleteNonDurableQueue" roles="amq, guest"/>
<permission type="createDurableQueue" roles="amq, guest"/>
<permission type="deleteDurableQueue" roles="amq, guest"/>
<permission type="createAddress" roles="amq, guest"/>
<permission type="deleteAddress" roles="amq, guest"/>
<permission type="consume" roles="amq, guest"/>
<permission type="browse" roles="amq, guest"/>
<permission type="send" roles="amq, guest"/>
<!-- we need this otherwise ./artemis data imp wouldn't work -->
<permission type="manage" roles="amq"/>
</security-setting>
</security-settings>
<address-settings>
<!-- if you define auto-create on certain queues, management has to be auto-create -->
<address-setting match="activemq.management#">
<dead-letter-address>DLQ</dead-letter-address>
<expiry-address>ExpiryQueue</expiry-address>
<redelivery-delay>0</redelivery-delay>
<!-- with -1 only the global-max-size is in use for limiting -->
<max-size-bytes>-1</max-size-bytes>
<message-counter-history-day-limit>10</message-counter-history-day-limit>
<address-full-policy>PAGE</address-full-policy>
<auto-create-queues>true</auto-create-queues>
<auto-create-addresses>true</auto-create-addresses>
</address-setting>
<!--default for catch all-->
<address-setting match="#">
<dead-letter-address>DLQ</dead-letter-address>
<expiry-address>ExpiryQueue</expiry-address>
<redelivery-delay>0</redelivery-delay>
<!-- with -1 only the global-max-size is in use for limiting -->
<max-size-bytes>10MB</max-size-bytes>
<page-size-bytes>1MB</page-size-bytes>
<max-read-page-messages>-1</max-read-page-messages>
<max-read-page-bytes>-1</max-read-page-bytes>
<message-counter-history-day-limit>10</message-counter-history-day-limit>
<address-full-policy>PAGE</address-full-policy>
<auto-create-queues>true</auto-create-queues>
<auto-create-addresses>true</auto-create-addresses>
</address-setting>
</address-settings>
<addresses>
<address name="exampleTopic">
<multicast>
</multicast>
</address>
<address name="DLQ">
<anycast>
<queue name="DLQ"/>
</anycast>
</address>
<address name="exampleQueue">
<anycast>
<queue name="exampleQueue"/>
</anycast>
</address>
</addresses>
</core>
</configuration>

View File

@ -0,0 +1,144 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
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.
--><configuration xmlns="urn:activemq" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:activemq /schema/artemis-server.xsd">
<core xmlns="urn:activemq:core">
<bindings-directory>./data/bindings</bindings-directory>
<journal-directory>./data/journal</journal-directory>
<large-messages-directory>./data/largemessages</large-messages-directory>
<paging-directory>./data/paging</paging-directory>
<cluster-user>exampleUser</cluster-user>
<cluster-password>secret</cluster-password>
<ha-policy>
<replication>
<master>
<group-name>test-pair-one</group-name>
<check-for-live-server>false</check-for-live-server>
<vote-on-replication-failure>false</vote-on-replication-failure>
<quorum-size>2</quorum-size>
</master>
</replication>
</ha-policy>
<!-- Connectors -->
<connectors>
<connector name="zero-live-connector">tcp://localhost:61000</connector>
<connector name="zero-backup-connector">tcp://localhost:61100</connector>
<connector name="one-live-connector">tcp://localhost:61001</connector>
<connector name="one-backup-connector">tcp://localhost:61101</connector>
<connector name="two-live-connector">tcp://localhost:61002</connector>
<connector name="two-backup-connector">tcp://localhost:61102</connector>
</connectors>
<!-- Acceptors -->
<acceptors>
<acceptor name="netty-acceptor">tcp://localhost:61002</acceptor>
</acceptors>
<cluster-connections>
<cluster-connection name="my-cluster">
<connector-ref>two-live-connector</connector-ref>
<message-load-balancing>OFF</message-load-balancing>
<max-hops>1</max-hops>
<static-connectors>
<connector-ref>zero-live-connector</connector-ref>
<connector-ref>zero-backup-connector</connector-ref>
<connector-ref>one-backup-connector</connector-ref>
<connector-ref>one-live-connector</connector-ref>
<connector-ref>two-backup-connector</connector-ref>
</static-connectors>
</cluster-connection>
</cluster-connections>
<!-- Other config -->
<security-settings>
<!--security for example queue-->
<security-setting match="#">
<permission type="createNonDurableQueue" roles="amq, guest"/>
<permission type="deleteNonDurableQueue" roles="amq, guest"/>
<permission type="createDurableQueue" roles="amq, guest"/>
<permission type="deleteDurableQueue" roles="amq, guest"/>
<permission type="createAddress" roles="amq, guest"/>
<permission type="deleteAddress" roles="amq, guest"/>
<permission type="consume" roles="amq, guest"/>
<permission type="browse" roles="amq, guest"/>
<permission type="send" roles="amq, guest"/>
<!-- we need this otherwise ./artemis data imp wouldn't work -->
<permission type="manage" roles="amq"/>
</security-setting>
</security-settings>
<address-settings>
<!-- if you define auto-create on certain queues, management has to be auto-create -->
<address-setting match="activemq.management#">
<dead-letter-address>DLQ</dead-letter-address>
<expiry-address>ExpiryQueue</expiry-address>
<redelivery-delay>0</redelivery-delay>
<!-- with -1 only the global-max-size is in use for limiting -->
<max-size-bytes>-1</max-size-bytes>
<message-counter-history-day-limit>10</message-counter-history-day-limit>
<address-full-policy>PAGE</address-full-policy>
<auto-create-queues>true</auto-create-queues>
<auto-create-addresses>true</auto-create-addresses>
</address-setting>
<!--default for catch all-->
<address-setting match="#">
<dead-letter-address>DLQ</dead-letter-address>
<expiry-address>ExpiryQueue</expiry-address>
<redelivery-delay>0</redelivery-delay>
<!-- with -1 only the global-max-size is in use for limiting -->
<max-size-bytes>10MB</max-size-bytes>
<page-size-bytes>1MB</page-size-bytes>
<max-read-page-messages>-1</max-read-page-messages>
<max-read-page-bytes>-1</max-read-page-bytes>
<message-counter-history-day-limit>10</message-counter-history-day-limit>
<address-full-policy>PAGE</address-full-policy>
<auto-create-queues>true</auto-create-queues>
<auto-create-addresses>true</auto-create-addresses>
</address-setting>
</address-settings>
<addresses>
<address name="exampleTopic">
<multicast>
</multicast>
</address>
<address name="DLQ">
<anycast>
<queue name="DLQ"/>
</anycast>
</address>
<address name="exampleQueue">
<anycast>
<queue name="exampleQueue"/>
</anycast>
</address>
</addresses>
</core>
</configuration>

View File

@ -0,0 +1,144 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
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.
--><configuration xmlns="urn:activemq" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:activemq /schema/artemis-server.xsd">
<core xmlns="urn:activemq:core">
<bindings-directory>./data/bindings</bindings-directory>
<journal-directory>./data/journal</journal-directory>
<large-messages-directory>./data/largemessages</large-messages-directory>
<paging-directory>./data/paging</paging-directory>
<cluster-user>exampleUser</cluster-user>
<cluster-password>secret</cluster-password>
<ha-policy>
<replication>
<master>
<group-name>test-pair-zero</group-name>
<check-for-live-server>false</check-for-live-server>
<vote-on-replication-failure>false</vote-on-replication-failure>
<quorum-size>2</quorum-size>
</master>
</replication>
</ha-policy>
<!-- Connectors -->
<connectors>
<connector name="zero-live-connector">tcp://localhost:61000</connector>
<connector name="zero-backup-connector">tcp://localhost:61100</connector>
<connector name="one-live-connector">tcp://localhost:61001</connector>
<connector name="one-backup-connector">tcp://localhost:61101</connector>
<connector name="two-live-connector">tcp://localhost:61002</connector>
<connector name="two-backup-connector">tcp://localhost:61102</connector>
</connectors>
<!-- Acceptors -->
<acceptors>
<acceptor name="netty-acceptor">tcp://localhost:61000</acceptor>
</acceptors>
<cluster-connections>
<cluster-connection name="my-cluster">
<connector-ref>zero-live-connector</connector-ref>
<message-load-balancing>OFF</message-load-balancing>
<max-hops>1</max-hops>
<static-connectors>
<connector-ref>zero-live-connector</connector-ref>
<connector-ref>one-live-connector</connector-ref>
<connector-ref>one-backup-connector</connector-ref>
<connector-ref>two-live-connector</connector-ref>
<connector-ref>two-backup-connector</connector-ref>
</static-connectors>
</cluster-connection>
</cluster-connections>
<!-- Other config -->
<security-settings>
<!--security for example queue-->
<security-setting match="#">
<permission type="createNonDurableQueue" roles="amq, guest"/>
<permission type="deleteNonDurableQueue" roles="amq, guest"/>
<permission type="createDurableQueue" roles="amq, guest"/>
<permission type="deleteDurableQueue" roles="amq, guest"/>
<permission type="createAddress" roles="amq, guest"/>
<permission type="deleteAddress" roles="amq, guest"/>
<permission type="consume" roles="amq, guest"/>
<permission type="browse" roles="amq, guest"/>
<permission type="send" roles="amq, guest"/>
<!-- we need this otherwise ./artemis data imp wouldn't work -->
<permission type="manage" roles="amq"/>
</security-setting>
</security-settings>
<address-settings>
<!-- if you define auto-create on certain queues, management has to be auto-create -->
<address-setting match="activemq.management#">
<dead-letter-address>DLQ</dead-letter-address>
<expiry-address>ExpiryQueue</expiry-address>
<redelivery-delay>0</redelivery-delay>
<!-- with -1 only the global-max-size is in use for limiting -->
<max-size-bytes>-1</max-size-bytes>
<message-counter-history-day-limit>10</message-counter-history-day-limit>
<address-full-policy>PAGE</address-full-policy>
<auto-create-queues>true</auto-create-queues>
<auto-create-addresses>true</auto-create-addresses>
</address-setting>
<!--default for catch all-->
<address-setting match="#">
<dead-letter-address>DLQ</dead-letter-address>
<expiry-address>ExpiryQueue</expiry-address>
<redelivery-delay>0</redelivery-delay>
<!-- with -1 only the global-max-size is in use for limiting -->
<max-size-bytes>10MB</max-size-bytes>
<page-size-bytes>1MB</page-size-bytes>
<max-read-page-messages>-1</max-read-page-messages>
<max-read-page-bytes>-1</max-read-page-bytes>
<message-counter-history-day-limit>10</message-counter-history-day-limit>
<address-full-policy>PAGE</address-full-policy>
<auto-create-queues>true</auto-create-queues>
<auto-create-addresses>true</auto-create-addresses>
</address-setting>
</address-settings>
<addresses>
<address name="exampleTopic">
<multicast>
</multicast>
</address>
<address name="DLQ">
<anycast>
<queue name="DLQ"/>
</anycast>
</address>
<address name="exampleQueue">
<anycast>
<queue name="exampleQueue"/>
</anycast>
</address>
</addresses>
</core>
</configuration>

View File

@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.apache.activemq.artemis.tests.soak.replicationflow;
package org.apache.activemq.artemis.tests.soak.replicaTxCheck;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
@ -26,11 +26,11 @@ import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import java.lang.invoke.MethodHandles;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
import java.util.HashSet;
import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
import org.apache.activemq.artemis.tests.soak.SoakTestBase;
import org.apache.activemq.artemis.util.ServerUtil;
import org.apache.qpid.jms.JmsConnectionFactory;
import org.junit.After;
import org.junit.Assert;
@ -43,16 +43,21 @@ public class ReplicaTXCheckTest extends SoakTestBase {
private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
public static final String SERVER_NAME_0 = "replica-tx-check/replicated-static0";
public static final String SERVER_NAME_1 = "replica-tx-check/replicated-static1";
public static final String SERVER_NAME_2 = "replica-tx-check/standalone";
public static final String SERVER_NAME_0 = "replica-tx-check/backup-zero";
public static final String SERVER_NAME_1 = "replica-tx-check/live-zero";
public static final String SERVER_NAME_2 = "replica-tx-check/backup-one";
public static final String SERVER_NAME_3 = "replica-tx-check/live-one";
public static final String SERVER_NAME_4 = "replica-tx-check/backup-two";
public static final String SERVER_NAME_5 = "replica-tx-check/live-two";
ArrayList<ReplicationFlowControlTest.Consumer> consumers = new ArrayList<>();
private static Process server0;
private static Process server1;
private static Process server2;
private static Process server3;
private static Process server4;
private static Process server5;
int NUMBER_OF_MESSAGES = 300;
int NUMBER_OF_MESSAGES = 1000;
int KILL_AT = 100;
@Before
@ -60,11 +65,22 @@ public class ReplicaTXCheckTest extends SoakTestBase {
cleanupData(SERVER_NAME_0);
cleanupData(SERVER_NAME_1);
cleanupData(SERVER_NAME_2);
cleanupData(SERVER_NAME_3);
cleanupData(SERVER_NAME_4);
cleanupData(SERVER_NAME_5);
disableCheckThread();
server0 = startServer(SERVER_NAME_0, 0, 30000);
server1 = startServer(SERVER_NAME_1, 1, 0);
server2 = startServer(SERVER_NAME_2, -1, 30000);
server0 = startServer(SERVER_NAME_0, 0, 0);
server1 = startServer(SERVER_NAME_1, 0, 0);
Assert.assertTrue(ServerUtil.waitForServerToStartOnPort(61000, null, null, 15000));
server2 = startServer(SERVER_NAME_2, 0, 0);
server3 = startServer(SERVER_NAME_3, 0, 0);
Assert.assertTrue(ServerUtil.waitForServerToStartOnPort(61001, null, null, 15000));
server4 = startServer(SERVER_NAME_4, 0, 0);
server4 = startServer(SERVER_NAME_5, 0, 0);
Assert.assertTrue(ServerUtil.waitForServerToStartOnPort(61002, null, null, 15000));
}
@After
@ -75,43 +91,75 @@ public class ReplicaTXCheckTest extends SoakTestBase {
@Test
public void testTXCheckAMQP() throws Exception {
testTXCheck("AMQP");
testTXCheck("AMQP", true, true);
}
@Test
public void testTXCheckCORE() throws Exception {
testTXCheck("CORE");
testTXCheck("CORE", true, true);
}
void testTXCheck(String protocol) throws Exception {
// a second variation of the test will invert the servers used and use a hard kill (halt) instead of stop
@Test
public void testTXCheckAMQP_2() throws Exception {
testTXCheck("AMQP", false, false);
}
ConnectionFactory replicaPairCF;
ConnectionFactory standaloneSource;
// a second variation of the test will invert the servers used and use a hard kill (halt) instead of stop
@Test
public void testTXCheckCORE_2() throws Exception {
testTXCheck("CORE", false, false);
}
/**
* this test is using three pairs of servers.
* It will send messages to one pair, then it consumes from that pair and sends to a second pair
* if killTarget==true the target pair is the one that's being killed, otherwise is the one with the consumers
* if useStop==true then the server is stopped with a regular stop call, otherwise it's halted
*/
void testTXCheck(String protocol, boolean killTarget, boolean useStop) throws Exception {
ConnectionFactory pair0;
ConnectionFactory pair1;
switch(protocol) {
case "AMQP":
replicaPairCF = new JmsConnectionFactory("failover:(amqp://localhost:61616,amqp://localhost:61617)");
standaloneSource = new JmsConnectionFactory("amqp://localhost:61615");
pair0 = new JmsConnectionFactory("failover:(amqp://localhost:61000,amqp://localhost:61100)");
pair1 = new JmsConnectionFactory("amqp://localhost:61001");
break;
case "CORE":
default:
replicaPairCF = new ActiveMQConnectionFactory("tcp://localhost:61616?ha=true&reconnectAttempts=-1");
standaloneSource = new ActiveMQConnectionFactory("tcp://localhost:61615");
pair0 = new ActiveMQConnectionFactory("tcp://localhost:61000?ha=true&reconnectAttempts=-1");
pair1 = new ActiveMQConnectionFactory("tcp://localhost:61001");
}
try (Connection sourceConnetion = standaloneSource.createConnection()) {
ConnectionFactory sourceCF;
ConnectionFactory targetCF;
if (killTarget) {
sourceCF = pair1;
targetCF = pair0;
} else {
sourceCF = pair0;
targetCF = pair1;
}
try (Connection sourceConnetion = sourceCF.createConnection()) {
Session session = sourceConnetion.createSession(true, Session.SESSION_TRANSACTED);
Queue queue = session.createQueue("exampleQueue");
MessageProducer producer = session.createProducer(queue);
for (int i = 0; i < NUMBER_OF_MESSAGES; i++) {
producer.send(session.createTextMessage("hello " + i));
TextMessage message = session.createTextMessage("hello " + i);
message.setIntProperty("i", i);
producer.send(message);
}
session.commit();
}
try (Connection sourceConnection = standaloneSource.createConnection();
try (Connection sourceConnection = sourceCF.createConnection();
Session sourceSession = sourceConnection.createSession(true, Session.SESSION_TRANSACTED);
Connection targetConnection = replicaPairCF.createConnection();
Connection targetConnection = targetCF.createConnection();
Session targetSession = targetConnection.createSession(true, Session.SESSION_TRANSACTED)) {
sourceConnection.start();
@ -139,8 +187,11 @@ public class ReplicaTXCheckTest extends SoakTestBase {
sourceSession.commit();
}
if (i == KILL_AT) {
server0.destroyForcibly();
server0.waitFor(10, TimeUnit.SECONDS);
if (useStop) {
stopServerWithFile(getServerLocation(SERVER_NAME_1));
} else {
server1.destroyForcibly();
}
}
if (message.getText().equals("hello " + (NUMBER_OF_MESSAGES - 1))) {
logger.info("got to the end");
@ -153,6 +204,7 @@ public class ReplicaTXCheckTest extends SoakTestBase {
}
}
HashSet<Integer> received = new HashSet<>();
int rec = 0;
while (true) {
TextMessage message = (TextMessage) subscription.receive(100);
@ -160,9 +212,14 @@ public class ReplicaTXCheckTest extends SoakTestBase {
logger.info("Received {} messages", rec);
break;
}
received.add(message.getIntProperty("i"));
rec++;
}
targetSession.commit();
for (i = 0; i < NUMBER_OF_MESSAGES; i++) {
Assert.assertTrue(received.contains(i));
}
// we could receive duplicates, but not lose messages
Assert.assertTrue(rec >= NUMBER_OF_MESSAGES);
}