/*
* 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.tests.integration.cluster.failover;
import java.util.ArrayList;
import java.util.List;
import org.apache.activemq.artemis.api.core.client.ClientConsumer;
import org.apache.activemq.artemis.api.core.client.ClientMessage;
import org.apache.activemq.artemis.api.core.client.ClientProducer;
import org.apache.activemq.artemis.api.core.client.ClientSession;
import org.apache.activemq.artemis.api.core.client.ClientSessionFactory;
import org.apache.activemq.artemis.api.core.client.ServerLocator;
import org.apache.activemq.artemis.core.config.ha.ReplicaPolicyConfiguration;
import org.apache.activemq.artemis.tests.integration.cluster.util.TestableServer;
import org.junit.Test;
public class ReplicatedMultipleServerFailoverExtraBackupsTest extends ReplicatedMultipleServerFailoverTest {
@Override
@Test
public void testStartLiveFirst() throws Exception {
((ReplicaPolicyConfiguration) backupServers.get(2).getServer().getConfiguration().getHAPolicyConfiguration()).setGroupName(getNodeGroupName() + "-0");
((ReplicaPolicyConfiguration) backupServers.get(3).getServer().getConfiguration().getHAPolicyConfiguration()).setGroupName(getNodeGroupName() + "-1");
startServers(liveServers);
backupServers.get(0).start();
backupServers.get(1).start();
waitForRemoteBackupSynchronization(backupServers.get(0).getServer());
waitForRemoteBackupSynchronization(backupServers.get(1).getServer());
// wait to start the other 2 backups so the first 2 can sync with the 2 live servers
backupServers.get(2).start();
backupServers.get(3).start();
sendCrashReceive();
waitForTopology(backupServers.get(0).getServer(), liveServers.size(), 2);
sendCrashBackupReceive();
}
private void waitForBackups() throws InterruptedException {
for (TestableServer backupServer : backupServers) {
waitForComponent(backupServer.getServer(), 5);
}
}
private void startServers(List<TestableServer> servers) throws Exception {
for (TestableServer testableServer : servers) {
testableServer.start();
}
}
@Override
@Test
public void testStartBackupFirst() throws Exception {
((ReplicaPolicyConfiguration) backupServers.get(2).getServer().getConfiguration().getHAPolicyConfiguration()).setGroupName(getNodeGroupName() + "-0");
((ReplicaPolicyConfiguration) backupServers.get(3).getServer().getConfiguration().getHAPolicyConfiguration()).setGroupName(getNodeGroupName() + "-1");
startServers(backupServers);
startServers(liveServers);
waitForBackups();
waitForTopology(liveServers.get(0).getServer(), liveServers.size(), 2);
sendCrashReceive();
}
protected void sendCrashBackupReceive() throws Exception {
ServerLocator locator0 = getBackupServerLocator(0);
ServerLocator locator1 = getBackupServerLocator(1);
ClientSessionFactory factory0 = createSessionFactory(locator0);
ClientSessionFactory factory1 = createSessionFactory(locator1);
ClientSession session0 = factory0.createSession(false, true, true);
ClientSession session1 = factory1.createSession(false, true, true);
ClientProducer producer = session0.createProducer(ADDRESS);
for (int i = 0; i < 200; i++) {
ClientMessage message = session0.createMessage(true);
setBody(i, message);
message.putIntProperty("counter", i);
producer.send(message);
}
producer.close();
waitForDistribution(ADDRESS, backupServers.get(0).getServer(), 100);
waitForDistribution(ADDRESS, backupServers.get(1).getServer(), 100);
List<TestableServer> toCrash = new ArrayList<>();
for (TestableServer backupServer : backupServers) {
if (!backupServer.getServer().getHAPolicy().isBackup()) {
toCrash.add(backupServer);
}
}
for (TestableServer testableServer : toCrash) {
testableServer.crash();
}
ClientConsumer consumer0 = session0.createConsumer(ADDRESS);
ClientConsumer consumer1 = session1.createConsumer(ADDRESS);
session0.start();
session1.start();
for (int i = 0; i < 100; i++) {
ClientMessage message = consumer0.receive(1000);
assertNotNull("expecting durable msg " + i, message);
message.acknowledge();
consumer1.receive(1000);
assertNotNull("expecting durable msg " + i, message);
message.acknowledge();
}
}
@Override
public int getBackupServerCount() {
return 4;
}
}