ARTEMIS-2937 Implementing skip create and skip delete on Mirror Source
This commit is contained in:
parent
7a5f325b72
commit
dff2ed3638
|
@ -348,7 +348,7 @@ public class AMQPBrokerConnection implements ClientConnectionLifeCycleListener,
|
||||||
throw new IllegalAccessException("Cannot start replica");
|
throw new IllegalAccessException("Cannot start replica");
|
||||||
}
|
}
|
||||||
|
|
||||||
AMQPMirrorControllerSource newPartition = new AMQPMirrorControllerSource(snfQueue, server, replicaConfig.isMessageAcknowledgements());
|
AMQPMirrorControllerSource newPartition = new AMQPMirrorControllerSource(snfQueue, server, replicaConfig.isMessageAcknowledgements(), replicaConfig.isQueueCreation(), replicaConfig.isQueueRemoval());
|
||||||
|
|
||||||
server.scanAddresses(newPartition);
|
server.scanAddresses(newPartition);
|
||||||
|
|
||||||
|
|
|
@ -67,6 +67,8 @@ public class AMQPMirrorControllerSource implements MirrorController, ActiveMQCom
|
||||||
final Queue snfQueue;
|
final Queue snfQueue;
|
||||||
final ActiveMQServer server;
|
final ActiveMQServer server;
|
||||||
final boolean acks;
|
final boolean acks;
|
||||||
|
final boolean addQueues;
|
||||||
|
final boolean deleteQueues;
|
||||||
|
|
||||||
boolean started;
|
boolean started;
|
||||||
|
|
||||||
|
@ -83,10 +85,12 @@ public class AMQPMirrorControllerSource implements MirrorController, ActiveMQCom
|
||||||
return started;
|
return started;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AMQPMirrorControllerSource(Queue snfQueue, ActiveMQServer server, boolean acks) {
|
public AMQPMirrorControllerSource(Queue snfQueue, ActiveMQServer server, boolean acks, boolean addQueues, boolean deleteQueues) {
|
||||||
this.snfQueue = snfQueue;
|
this.snfQueue = snfQueue;
|
||||||
this.server = server;
|
this.server = server;
|
||||||
this.acks = acks;
|
this.acks = acks;
|
||||||
|
this.addQueues = addQueues;
|
||||||
|
this.deleteQueues = deleteQueues;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -103,26 +107,34 @@ public class AMQPMirrorControllerSource implements MirrorController, ActiveMQCom
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addAddress(AddressInfo addressInfo) throws Exception {
|
public void addAddress(AddressInfo addressInfo) throws Exception {
|
||||||
Message message = createMessage(addressInfo.getName(), null, ADD_ADDRESS, addressInfo.toJSON());
|
if (addQueues) {
|
||||||
route(server, message);
|
Message message = createMessage(addressInfo.getName(), null, ADD_ADDRESS, addressInfo.toJSON());
|
||||||
|
route(server, message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void deleteAddress(AddressInfo addressInfo) throws Exception {
|
public void deleteAddress(AddressInfo addressInfo) throws Exception {
|
||||||
Message message = createMessage(addressInfo.getName(), null, DELETE_ADDRESS, addressInfo.toJSON());
|
if (deleteQueues) {
|
||||||
route(server, message);
|
Message message = createMessage(addressInfo.getName(), null, DELETE_ADDRESS, addressInfo.toJSON());
|
||||||
|
route(server, message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void createQueue(QueueConfiguration queueConfiguration) throws Exception {
|
public void createQueue(QueueConfiguration queueConfiguration) throws Exception {
|
||||||
Message message = createMessage(queueConfiguration.getAddress(), queueConfiguration.getName(), CREATE_QUEUE, queueConfiguration.toJSON());
|
if (addQueues) {
|
||||||
route(server, message);
|
Message message = createMessage(queueConfiguration.getAddress(), queueConfiguration.getName(), CREATE_QUEUE, queueConfiguration.toJSON());
|
||||||
|
route(server, message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void deleteQueue(SimpleString address, SimpleString queue) throws Exception {
|
public void deleteQueue(SimpleString address, SimpleString queue) throws Exception {
|
||||||
Message message = createMessage(address, queue, DELETE_QUEUE, queue.toString());
|
if (deleteQueues) {
|
||||||
route(server, message);
|
Message message = createMessage(address, queue, DELETE_QUEUE, queue.toString());
|
||||||
|
route(server, message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -32,6 +32,7 @@ import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import org.apache.activemq.artemis.api.core.QueueConfiguration;
|
import org.apache.activemq.artemis.api.core.QueueConfiguration;
|
||||||
import org.apache.activemq.artemis.api.core.RoutingType;
|
import org.apache.activemq.artemis.api.core.RoutingType;
|
||||||
|
import org.apache.activemq.artemis.api.core.SimpleString;
|
||||||
import org.apache.activemq.artemis.core.config.amqpBrokerConnectivity.AMQPBrokerConnectConfiguration;
|
import org.apache.activemq.artemis.core.config.amqpBrokerConnectivity.AMQPBrokerConnectConfiguration;
|
||||||
import org.apache.activemq.artemis.core.config.amqpBrokerConnectivity.AMQPBrokerConnectionAddressType;
|
import org.apache.activemq.artemis.core.config.amqpBrokerConnectivity.AMQPBrokerConnectionAddressType;
|
||||||
import org.apache.activemq.artemis.core.config.amqpBrokerConnectivity.AMQPMirrorBrokerConnectionElement;
|
import org.apache.activemq.artemis.core.config.amqpBrokerConnectivity.AMQPMirrorBrokerConnectionElement;
|
||||||
|
@ -113,6 +114,55 @@ public class AMQPReplicaTest extends AmqpClientTestSupport {
|
||||||
server.stop();
|
server.stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoNotSendDelete() throws Exception {
|
||||||
|
testDoNotSendStuff(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoNotSendCreate() throws Exception {
|
||||||
|
testDoNotSendStuff(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void testDoNotSendStuff(boolean sendCreate) throws Exception {
|
||||||
|
boolean ignoreCreate = false;
|
||||||
|
server.start();
|
||||||
|
|
||||||
|
final SimpleString ADDRESS_NAME = SimpleString.toSimpleString("address");
|
||||||
|
|
||||||
|
server_2 = createServer(AMQP_PORT_2, false);
|
||||||
|
|
||||||
|
AMQPBrokerConnectConfiguration amqpConnection = new AMQPBrokerConnectConfiguration("test", "tcp://localhost:" + AMQP_PORT);
|
||||||
|
AMQPMirrorBrokerConnectionElement mirror = new AMQPMirrorBrokerConnectionElement();
|
||||||
|
if (ignoreCreate) {
|
||||||
|
mirror.setQueueCreation(false);
|
||||||
|
} else {
|
||||||
|
mirror.setQueueCreation(true);
|
||||||
|
mirror.setQueueRemoval(false);
|
||||||
|
}
|
||||||
|
amqpConnection.addElement(mirror);
|
||||||
|
server_2.getConfiguration().addAMQPConnection(amqpConnection);
|
||||||
|
|
||||||
|
server_2.start();
|
||||||
|
Wait.assertTrue(server::isActive);
|
||||||
|
|
||||||
|
server_2.addAddressInfo(new AddressInfo(ADDRESS_NAME).addRoutingType(RoutingType.ANYCAST));
|
||||||
|
server_2.createQueue(new QueueConfiguration(ADDRESS_NAME).setDurable(true).setAddress(ADDRESS_NAME));
|
||||||
|
|
||||||
|
if (!ignoreCreate) {
|
||||||
|
Wait.assertTrue(() -> server.locateQueue(ADDRESS_NAME) != null);
|
||||||
|
Wait.assertTrue(() -> server.getAddressInfo(ADDRESS_NAME) != null);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ignoreCreate) {
|
||||||
|
Thread.sleep(500); // things are asynchronous, I need to wait some time to make sure things are transferred over
|
||||||
|
Assert.assertTrue(server.locateQueue(ADDRESS_NAME) == null);
|
||||||
|
Assert.assertTrue(server.getAddressInfo(ADDRESS_NAME) == null);
|
||||||
|
}
|
||||||
|
server_2.stop();
|
||||||
|
server.stop();
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testReplicaCatchupOnQueueCreatesAndDeletes() throws Exception {
|
public void testReplicaCatchupOnQueueCreatesAndDeletes() throws Exception {
|
||||||
server.start();
|
server.start();
|
||||||
|
|
Loading…
Reference in New Issue