This is an automated email from the ASF dual-hosted git repository. clebertsuconic pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git
commit 9842f45a49afb81ff81d16fcb51bd0c0bb717b62 Author: Clebert Suconic <[email protected]> AuthorDate: Mon Aug 3 09:12:44 2020 -0400 ARTEMIS-2867 Do not cache IPs on DNS Entries for NetworkHealthCheck In case of a DNS outage, the pinger should still fail If we cache the InetAddress this would not be possible --- .../artemis/core/server/NetworkHealthCheck.java | 66 ++++++--- .../activemq/artemis/utils/NetworkHealthTest.java | 3 +- .../activemq/artemis/utils/network/NetUtil.java | 8 +- .../core/management/impl/AbstractControl.java | 2 +- .../cluster/failover/NetworkIsolationTest.java | 11 +- tests/smoke-tests/pom.xml | 42 ++++++ .../broker.xml | 10 +- .../management.xml | 20 +++ .../servers/dnsswitch-replicated-backup/broker.xml | 6 +- .../broker.xml | 4 +- .../broker.xml | 14 +- .../management.xml | 20 +++ .../servers/dnsswitch-replicated-main/broker.xml | 4 +- .../tests/smoke/dnsswitch/DNSSwitchTest.java | 165 ++++++++++++++------- 14 files changed, 276 insertions(+), 99 deletions(-) diff --git a/artemis-commons/src/main/java/org/apache/activemq/artemis/core/server/NetworkHealthCheck.java b/artemis-commons/src/main/java/org/apache/activemq/artemis/core/server/NetworkHealthCheck.java index 5c8fc82..559ca17 100644 --- a/artemis-commons/src/main/java/org/apache/activemq/artemis/core/server/NetworkHealthCheck.java +++ b/artemis-commons/src/main/java/org/apache/activemq/artemis/core/server/NetworkHealthCheck.java @@ -46,7 +46,7 @@ public class NetworkHealthCheck extends ActiveMQScheduledComponent { private static final Logger logger = Logger.getLogger(NetworkHealthCheck.class); private final Set<ActiveMQComponent> componentList = new ConcurrentHashSet<>(); - private final Set<InetAddress> addresses = new ConcurrentHashSet<>(); + private final Set<String> addresses = new ConcurrentHashSet<>(); private final Set<URL> urls = new ConcurrentHashSet<>(); private NetworkInterface networkInterface; @@ -104,7 +104,7 @@ public class NetworkHealthCheck extends ActiveMQScheduledComponent { return this; } - public Set<InetAddress> getAddresses() { + public Set<String> getAddresses() { return addresses; } @@ -127,7 +127,8 @@ public class NetworkHealthCheck extends ActiveMQScheduledComponent { for (String address : addresses) { if (!address.trim().isEmpty()) { try { - this.addAddress(InetAddress.getByName(address.trim())); + String strAddress = address.trim(); + this.addAddress(strAddress); } catch (Exception e) { ActiveMQUtilLogger.LOGGER.failedToParseAddressList(e, addressList); } @@ -204,22 +205,23 @@ public class NetworkHealthCheck extends ActiveMQScheduledComponent { return this; } - public NetworkHealthCheck addAddress(InetAddress address) { - if (!check(address)) { - ActiveMQUtilLogger.LOGGER.addressWasntReacheable(address.toString()); + public NetworkHealthCheck addAddress(String straddress) { + InetAddress address = internalCheck(straddress); + if (address == null) { + ActiveMQUtilLogger.LOGGER.addressWasntReacheable(straddress); } - if (!ignoreLoopback && address.isLoopbackAddress()) { - ActiveMQUtilLogger.LOGGER.addressloopback(address.toString()); + if (!ignoreLoopback && address != null && address.isLoopbackAddress()) { + ActiveMQUtilLogger.LOGGER.addressloopback(straddress); } else { - addresses.add(address); + addresses.add(straddress); checkStart(); } return this; } - public NetworkHealthCheck removeAddress(InetAddress address) { - addresses.remove(address); + public NetworkHealthCheck removeAddress(String straddress) { + addresses.remove(straddress); return this; } @@ -267,7 +269,11 @@ public class NetworkHealthCheck extends ActiveMQScheduledComponent { private void checkStart() { if (!isStarted() && (!addresses.isEmpty() || !urls.isEmpty()) && !componentList.isEmpty()) { - start(); + try { + this.run(); // run the first check immediately, this is to immediately shutdown the server if there's no net + } finally { + start(); + } } } @@ -311,7 +317,7 @@ public class NetworkHealthCheck extends ActiveMQScheduledComponent { return true; } - for (InetAddress address : addresses) { + for (String address : addresses) { if (check(address)) { return true; } @@ -326,23 +332,37 @@ public class NetworkHealthCheck extends ActiveMQScheduledComponent { return false; } - public boolean check(InetAddress address) { - if (address == null) { + public boolean check(String straddress) { + if (straddress == null) { return false; } + return internalCheck(straddress) != null; + } + + private InetAddress internalCheck(String straddress) { try { - if (!hasCustomPingCommand() && isReachable(address)) { - if (logger.isTraceEnabled()) { - logger.tracef(address + " OK"); - } - return true; + InetAddress address = InetAddress.getByName(straddress); + address = InetAddress.getByName(address.getHostName()); + if (check(address)) { + return address; } else { - return purePing(address); + return null; } } catch (Exception e) { - ActiveMQUtilLogger.LOGGER.failedToCheckAddress(e, address.toString()); - return false; + ActiveMQUtilLogger.LOGGER.failedToCheckAddress(e, straddress); + return null; + } + } + + public boolean check(InetAddress address) throws IOException, InterruptedException { + if (!hasCustomPingCommand() && isReachable(address)) { + if (logger.isTraceEnabled()) { + logger.tracef(address + " OK"); + } + return true; + } else { + return purePing(address); } } diff --git a/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/NetworkHealthTest.java b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/NetworkHealthTest.java index b790173..a1b5b41 100644 --- a/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/NetworkHealthTest.java +++ b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/NetworkHealthTest.java @@ -155,8 +155,7 @@ public class NetworkHealthTest { } }); check.addComponent(component); - InetAddress address = InetAddress.getByName("127.0.0.1"); - check.addAddress(address); + check.addAddress("127.0.0.1"); component.stop(); diff --git a/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/network/NetUtil.java b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/network/NetUtil.java index 489d47b..8731372 100644 --- a/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/network/NetUtil.java +++ b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/network/NetUtil.java @@ -109,6 +109,10 @@ public class NetUtil { public static void netUp(String ip) throws Exception { String deviceID = "lo:" + nextDevice.incrementAndGet(); + netUp(ip, deviceID); + } + + public static void netUp(String ip, String deviceID) throws Exception { if (osUsed == OS.MAC) { if (runCommand("sudo", "-n", "ifconfig", "lo0", "alias", ip) != 0) { Assert.fail("Cannot sudo ifconfig for ip " + ip); @@ -138,7 +142,9 @@ public class NetUtil { netDown(ip, device, force); } - private static void netDown(String ip, String device, boolean force) throws Exception { + public static void netDown(String ip, String device, boolean force) throws Exception { + networks.remove(ip); + if (osUsed == OS.MAC) { if (runCommand("sudo", "-n", "ifconfig", "lo0", "-alias", ip) != 0) { if (!force) { diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/AbstractControl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/AbstractControl.java index 3f8b83a..ad5b81a 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/AbstractControl.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/AbstractControl.java @@ -70,7 +70,7 @@ public abstract class AbstractControl extends StandardMBean { protected void blockOnIO() { // the storage manager could be null on the backup on certain components - if (storageManager != null) { + if (storageManager != null && storageManager.isStarted()) { try { storageManager.waitOnOperations(); storageManager.clearContext(); diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/failover/NetworkIsolationTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/failover/NetworkIsolationTest.java index 95db530..5bfd25c 100644 --- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/failover/NetworkIsolationTest.java +++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/failover/NetworkIsolationTest.java @@ -17,7 +17,6 @@ package org.apache.activemq.artemis.tests.integration.cluster.failover; -import java.net.InetAddress; import java.util.concurrent.TimeUnit; import org.apache.activemq.artemis.api.core.QueueConfiguration; @@ -71,7 +70,7 @@ public class NetworkIsolationTest extends FailoverTestBase { Assert.assertTrue(Wait.waitFor(liveServer::isActive)); - liveServer.getServer().getNetworkHealthCheck().addAddress(InetAddress.getByName(badAddress)); + liveServer.getServer().getNetworkHealthCheck().addAddress(badAddress); Assert.assertTrue(Wait.waitFor(() -> !liveServer.isStarted())); @@ -89,20 +88,20 @@ public class NetworkIsolationTest extends FailoverTestBase { // this block here is just to validate if ignoring loopback addresses logic is in place { - backupServer.getServer().getNetworkHealthCheck().addAddress(InetAddress.getByName("127.0.0.1")); + backupServer.getServer().getNetworkHealthCheck().addAddress("127.0.0.1"); Assert.assertTrue(AssertionLoggerHandler.findText("AMQ202001")); AssertionLoggerHandler.clear(); - backupServer.getServer().getNetworkHealthCheck().setIgnoreLoopback(true).addAddress(InetAddress.getByName("127.0.0.1")); + backupServer.getServer().getNetworkHealthCheck().setIgnoreLoopback(true).addAddress("127.0.0.1"); Assert.assertFalse(AssertionLoggerHandler.findText("AMQ202001")); backupServer.getServer().getNetworkHealthCheck().clearAddresses(); } - backupServer.getServer().getNetworkHealthCheck().addAddress(InetAddress.getByName(badAddress)); + backupServer.getServer().getNetworkHealthCheck().addAddress(badAddress); backupServer.getServer().start(); ClientSessionFactory sf = addSessionFactory(locator.createSessionFactory()); @@ -162,7 +161,7 @@ public class NetworkIsolationTest extends FailoverTestBase { Assert.assertFalse(liveServer.isStarted()); - liveServer.getServer().getNetworkHealthCheck().setIgnoreLoopback(true).addAddress(InetAddress.getByName("127.0.0.1")); + liveServer.getServer().getNetworkHealthCheck().setIgnoreLoopback(true).addAddress("127.0.0.1"); timeout = System.currentTimeMillis() + 30000; while (!liveServer.isStarted() && System.currentTimeMillis() < timeout) { diff --git a/tests/smoke-tests/pom.xml b/tests/smoke-tests/pom.xml index ee0a5a9..d083e8d 100644 --- a/tests/smoke-tests/pom.xml +++ b/tests/smoke-tests/pom.xml @@ -270,6 +270,48 @@ </execution> <execution> <phase>test-compile</phase> + <id>create-dnsswitch-main-withping</id> + <goals> + <goal>create</goal> + </goals> + <configuration> + <configuration>${basedir}/target/classes/servers/dnsswitch-replicated-main-withping</configuration> + <allowAnonymous>true</allowAnonymous> + <user>admin</user> + <password>admin</password> + <noWeb>true</noWeb> + <instance>${basedir}/target/dnsswitch-replicated-main-withping</instance> + <args> + <arg>--java-options</arg> + <!-- notice these files are only available on dnsswitch, so this is not a copy and paste error + where I really meant dnsswitch here --> + <arg>-Djdk.net.hosts.file=${basedir}/target/dnsswitch/etc/hosts.conf -Djava.security.properties=${basedir}/target/dnsswitch/etc/zerocache.security -Djava.rmi.server.hostname=localhost</arg> + </args> + </configuration> + </execution> + <execution> + <phase>test-compile</phase> + <id>create-dnsswitch-backup-withping</id> + <goals> + <goal>create</goal> + </goals> + <configuration> + <configuration>${basedir}/target/classes/servers/dnsswitch-replicated-backup-withping</configuration> + <allowAnonymous>true</allowAnonymous> + <user>admin</user> + <password>admin</password> + <noWeb>true</noWeb> + <instance>${basedir}/target/dnsswitch-replicated-backup-withping</instance> + <args> + <arg>--java-options</arg> + <!-- notice these files are only available on dnsswitch, so this is not a copy and paste error + where I really meant dnsswitch here --> + <arg>-Djdk.net.hosts.file=${basedir}/target/dnsswitch/etc/hosts.conf -Djava.security.properties=${basedir}/target/dnsswitch/etc/zerocache.security -Djava.rmi.server.hostname=localhost</arg> + </args> + </configuration> + </execution> + <execution> + <phase>test-compile</phase> <id>create-dnsswitch-main-noretrydns</id> <goals> <goal>create</goal> diff --git a/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-backup/broker.xml b/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-backup-withping/broker.xml similarity index 94% copy from tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-backup/broker.xml copy to tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-backup-withping/broker.xml index 36a07a6..bb08ea5 100644 --- a/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-backup/broker.xml +++ b/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-backup-withping/broker.xml @@ -30,6 +30,12 @@ under the License. <paging-directory>./data/paging</paging-directory> + <network-check-list>PINGPLACE</network-check-list> + + <network-check-period>1000</network-check-period> + + <network-check-timeout>200</network-check-timeout> + <ha-policy> <replication> <slave> @@ -41,14 +47,14 @@ under the License. <connectors> <!-- Connector used to be announced through cluster connections and notifications --> - <connector name="artemis">tcp://SECOND:61616</connector> + <connector name="artemis">tcp://SECOND:61716</connector> <connector name="main">tcp://FIRST:61616</connector> </connectors> <!-- Acceptors --> <acceptors> - <acceptor name="artemis">tcp://SECOND:61616</acceptor> + <acceptor name="artemis">tcp://0.0.0.0:61716</acceptor> </acceptors> <cluster-user>admin</cluster-user> diff --git a/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-backup-withping/management.xml b/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-backup-withping/management.xml new file mode 100644 index 0000000..14bbaf2 --- /dev/null +++ b/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-backup-withping/management.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<!-- + ~ 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. + --> +<management-context xmlns="http://activemq.org/schema"> + <connector connector-port="10199" connector-host="localhost"/> +</management-context> \ No newline at end of file diff --git a/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-backup/broker.xml b/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-backup/broker.xml index 36a07a6..b24398e 100644 --- a/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-backup/broker.xml +++ b/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-backup/broker.xml @@ -41,14 +41,14 @@ under the License. <connectors> <!-- Connector used to be announced through cluster connections and notifications --> - <connector name="artemis">tcp://SECOND:61616</connector> + <connector name="artemis">tcp://SECOND:61716</connector> <connector name="main">tcp://FIRST:61616</connector> </connectors> <!-- Acceptors --> <acceptors> - <acceptor name="artemis">tcp://SECOND:61616</acceptor> + <acceptor name="artemis">tcp://0.0.0.0:61716</acceptor> </acceptors> <cluster-user>admin</cluster-user> @@ -58,6 +58,8 @@ under the License. <cluster-connections> <cluster-connection name="my-cluster"> <connector-ref>artemis</connector-ref> + <check-period>100</check-period> + <connection-ttl>500</connection-ttl> <message-load-balancing>OFF</message-load-balancing> <max-hops>1</max-hops> <static-connectors> diff --git a/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main-noretrydns/broker.xml b/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main-noretrydns/broker.xml index bb5995e..44029f6 100644 --- a/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main-noretrydns/broker.xml +++ b/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main-noretrydns/broker.xml @@ -43,12 +43,12 @@ under the License. <connectors> <!-- Connector used to be announced through cluster connections and notifications --> <connector name="artemis">tcp://FIRST:61616</connector> - <connector name="backup">tcp://SECOND:61616</connector> + <connector name="backup">tcp://SECOND:61716</connector> </connectors> <!-- Acceptors --> <acceptors> - <acceptor name="artemis">tcp://FIRST:61616</acceptor> + <acceptor name="artemis">tcp://0.0.0.0:61616</acceptor> </acceptors> <cluster-user>admin</cluster-user> diff --git a/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main-noretrydns/broker.xml b/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main-withping/broker.xml similarity index 93% copy from tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main-noretrydns/broker.xml copy to tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main-withping/broker.xml index bb5995e..174e8d3 100644 --- a/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main-noretrydns/broker.xml +++ b/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main-withping/broker.xml @@ -40,15 +40,21 @@ under the License. </replication> </ha-policy> + <network-check-list>PINGPLACE</network-check-list> + + <network-check-period>1000</network-check-period> + + <network-check-timeout>200</network-check-timeout> + <connectors> <!-- Connector used to be announced through cluster connections and notifications --> <connector name="artemis">tcp://FIRST:61616</connector> - <connector name="backup">tcp://SECOND:61616</connector> + <connector name="backup">tcp://SECOND:61716</connector> </connectors> <!-- Acceptors --> <acceptors> - <acceptor name="artemis">tcp://FIRST:61616</acceptor> + <acceptor name="artemis">tcp://0.0.0.0:61616</acceptor> </acceptors> <cluster-user>admin</cluster-user> @@ -60,9 +66,9 @@ under the License. <connector-ref>artemis</connector-ref> <message-load-balancing>OFF</message-load-balancing> <max-hops>1</max-hops> - <static-connectors> + <!--<static-connectors> <connector-ref>backup</connector-ref> - </static-connectors> + </static-connectors> --> </cluster-connection> </cluster-connections> diff --git a/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main-withping/management.xml b/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main-withping/management.xml new file mode 100644 index 0000000..576f1e5 --- /dev/null +++ b/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main-withping/management.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<!-- + ~ 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. + --> +<management-context xmlns="http://activemq.org/schema"> + <connector connector-port="10099" connector-host="localhost"/> +</management-context> \ No newline at end of file diff --git a/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main/broker.xml b/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main/broker.xml index bb5995e..44029f6 100644 --- a/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main/broker.xml +++ b/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main/broker.xml @@ -43,12 +43,12 @@ under the License. <connectors> <!-- Connector used to be announced through cluster connections and notifications --> <connector name="artemis">tcp://FIRST:61616</connector> - <connector name="backup">tcp://SECOND:61616</connector> + <connector name="backup">tcp://SECOND:61716</connector> </connectors> <!-- Acceptors --> <acceptors> - <acceptor name="artemis">tcp://FIRST:61616</acceptor> + <acceptor name="artemis">tcp://0.0.0.0:61616</acceptor> </acceptors> <cluster-user>admin</cluster-user> diff --git a/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/dnsswitch/DNSSwitchTest.java b/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/dnsswitch/DNSSwitchTest.java index 31a76d0..aa51d9b 100644 --- a/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/dnsswitch/DNSSwitchTest.java +++ b/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/dnsswitch/DNSSwitchTest.java @@ -94,12 +94,17 @@ public class DNSSwitchTest extends SmokeTestBase { private static final String SERVER_LIVE_NORETRYDNS = "dnsswitch-replicated-main-noretrydns"; private static final String SERVER_BACKUP = "dnsswitch-replicated-backup"; + private static final String SERVER_LIVE_PING = "dnsswitch-replicated-main-withping"; + private static final String SERVER_BACKUP_PING = "dnsswitch-replicated-backup-withping"; + // 192.0.2.0 is reserved for documentation (and testing on this case). private static final String FIRST_IP = "192.0.2.0"; private static final String SECOND_IP = "192.0.3.0"; private static final String THIRD_IP = "192.0.3.0"; private static final String FOURTH_IP = "192.0.4.0"; + private static final String INVALID_IP = "203.0.113.0"; + private static String serverLocation; @Rule @@ -122,7 +127,6 @@ public class DNSSwitchTest extends SmokeTestBase { serverControl.isActive(); // making one call to make sure it's working return serverControl; } catch (Throwable e) { - System.err.println("Retrying error : " + e.getMessage()); lastException = e; Thread.sleep(500); } @@ -235,24 +239,20 @@ public class DNSSwitchTest extends SmokeTestBase { cleanupData(SERVER_LIVE); cleanupData(SERVER_LIVE_NORETRYDNS); cleanupData(SERVER_BACKUP); + cleanupData(SERVER_LIVE_PING); + cleanupData(SERVER_BACKUP_PING); } @Test public void testBackupRedefinition() throws Throwable { - System.out.println(System.getProperty("java.security.properties")); - spawnRun(serverLocation, "testBackupRedefinition", getServerLocation(SERVER_LIVE), getServerLocation(SERVER_BACKUP)); } public static void testBackupRedefinition(String[] args) throws Throwable { - NetUtil.netUp(FIRST_IP); - NetUtil.netUp(SECOND_IP); - // NetUtil.netUp(THIRD_IP); + NetUtil.netUp(FIRST_IP, "lo:first"); + NetUtil.netUp(SECOND_IP, "lo:second"); saveConf(hostsFile, FIRST_IP, "FIRST", SECOND_IP, "SECOND"); - //System.out.println("Waiting here"); - //Thread.sleep(300_000); - Process serverLive = null; Process serverBackup = null; @@ -263,7 +263,7 @@ public class DNSSwitchTest extends SmokeTestBase { connectAndWaitBackup(); saveConf(hostsFile, FIRST_IP, "FIRST", THIRD_IP, "SECOND"); - NetUtil.netDown(SECOND_IP, true); + NetUtil.netDown(SECOND_IP, "lo:second", true); serverBackup.destroyForcibly(); Thread.sleep(1000); // wait some time at least until a reconnection is in place @@ -280,11 +280,6 @@ public class DNSSwitchTest extends SmokeTestBase { connectAndWaitBackup(); - //waitForTopology(connectionFactory.getServerLocator().getTopology(), 60_000, 1, 1); - - //System.out.println("I'm here!!!"); - //Thread.sleep(300_000); - ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://FIRST:61616?ha=true"); Assert.assertTrue(connectionFactory.getServerLocator().isHA()); Connection connection = connectionFactory.createConnection(); @@ -299,7 +294,7 @@ public class DNSSwitchTest extends SmokeTestBase { producer.send(session.createTextMessage("hello")); session.commit(); - NetUtil.netUp(THIRD_IP); + NetUtil.netUp(THIRD_IP, "lo:third"); serverLive.destroyForcibly(); Wait.assertTrue(backupControl::isActive); @@ -320,7 +315,7 @@ public class DNSSwitchTest extends SmokeTestBase { errors++; Assert.assertTrue(errors < 20); // I would accept one or two errors, but the code must connect itself connection.close(); - connectionFactory = new ActiveMQConnectionFactory("tcp://SECOND:61616?ha=true"); + connectionFactory = new ActiveMQConnectionFactory("tcp://SECOND:61716?ha=true"); connection = connectionFactory.createConnection(); connection.start(); session = connection.createSession(true, Session.SESSION_TRANSACTED); @@ -342,20 +337,15 @@ public class DNSSwitchTest extends SmokeTestBase { @Test public void testBackupRedefinition2() throws Throwable { - System.out.println(System.getProperty("java.security.properties")); - spawnRun(serverLocation, "testBackupRedefinition2", getServerLocation(SERVER_LIVE), getServerLocation(SERVER_BACKUP)); } public static void testBackupRedefinition2(String[] args) throws Throwable { - NetUtil.netUp(FIRST_IP); - NetUtil.netUp(SECOND_IP); - NetUtil.netUp(THIRD_IP); + NetUtil.netUp(FIRST_IP, "lo:first"); + NetUtil.netUp(SECOND_IP, "lo:second"); + NetUtil.netUp(THIRD_IP, "lo:third"); saveConf(hostsFile, FIRST_IP, "FIRST", SECOND_IP, "SECOND"); - //System.out.println("Waiting here"); - //Thread.sleep(300_000); - Process serverLive = null; Process serverBackup = null; @@ -366,7 +356,7 @@ public class DNSSwitchTest extends SmokeTestBase { connectAndWaitBackup(); saveConf(hostsFile, FIRST_IP, "FIRST", THIRD_IP, "SECOND"); - NetUtil.netDown(SECOND_IP, true); + NetUtil.netDown(SECOND_IP, "lo:second", true); serverBackup.destroyForcibly(); Thread.sleep(1000); // wait some time at least until a reconnection is in place @@ -391,11 +381,6 @@ public class DNSSwitchTest extends SmokeTestBase { Wait.assertTrue(backupControl::isStarted); Wait.assertTrue(backupControl::isReplicaSync); - //waitForTopology(connectionFactory.getServerLocator().getTopology(), 60_000, 1, 1); - - //System.out.println("I'm here!!!"); - //Thread.sleep(300_000); - ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://FIRST:61616?ha=true"); Assert.assertTrue(connectionFactory.getServerLocator().isHA()); Connection connection = connectionFactory.createConnection(); @@ -410,7 +395,7 @@ public class DNSSwitchTest extends SmokeTestBase { producer.send(session.createTextMessage("hello")); session.commit(); - NetUtil.netUp(THIRD_IP); + NetUtil.netUp(THIRD_IP, "lo:third"); serverLive.destroyForcibly(); Wait.assertTrue(backupControl::isActive); @@ -431,7 +416,7 @@ public class DNSSwitchTest extends SmokeTestBase { errors++; Assert.assertTrue(errors < 20); // I would accept one or two errors, but the code must connect itself connection.close(); - connectionFactory = new ActiveMQConnectionFactory("tcp://SECOND:61616?ha=true"); + connectionFactory = new ActiveMQConnectionFactory("tcp://SECOND:61716?ha=true"); connection = connectionFactory.createConnection(); connection.start(); session = connection.createSession(true, Session.SESSION_TRANSACTED); @@ -452,20 +437,15 @@ public class DNSSwitchTest extends SmokeTestBase { @Test public void testBackupRedefinition3() throws Throwable { - System.out.println(System.getProperty("java.security.properties")); - spawnRun(serverLocation, "testBackupRedefinition2", getServerLocation(SERVER_LIVE), getServerLocation(SERVER_BACKUP)); } public static void testBackupRedefinition3(String[] args) throws Throwable { - NetUtil.netUp(FIRST_IP); - NetUtil.netUp(SECOND_IP); - NetUtil.netUp(THIRD_IP); + NetUtil.netUp(FIRST_IP, "lo:first"); + NetUtil.netUp(SECOND_IP, "lo:second"); + NetUtil.netUp(THIRD_IP, "lo:third"); saveConf(hostsFile, FIRST_IP, "FIRST", SECOND_IP, "SECOND"); - //System.out.println("Waiting here"); - //Thread.sleep(300_000); - Process serverLive = null; Process serverBackup = null; @@ -476,7 +456,7 @@ public class DNSSwitchTest extends SmokeTestBase { connectAndWaitBackup(); saveConf(hostsFile, FIRST_IP, "FIRST", THIRD_IP, "SECOND"); - NetUtil.netDown(SECOND_IP, true); + NetUtil.netDown(SECOND_IP, "lo:second", true); serverBackup.destroyForcibly(); Thread.sleep(1000); // wait some time at least until a reconnection is in place @@ -501,11 +481,6 @@ public class DNSSwitchTest extends SmokeTestBase { Wait.assertTrue(backupControl::isStarted); Wait.assertTrue(backupControl::isReplicaSync); - //waitForTopology(connectionFactory.getServerLocator().getTopology(), 60_000, 1, 1); - - //System.out.println("I'm here!!!"); - //Thread.sleep(300_000); - ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://FIRST:61616?ha=true"); Assert.assertTrue(connectionFactory.getServerLocator().isHA()); Connection connection = connectionFactory.createConnection(); @@ -520,7 +495,7 @@ public class DNSSwitchTest extends SmokeTestBase { producer.send(session.createTextMessage("hello")); session.commit(); - NetUtil.netUp(THIRD_IP); + NetUtil.netUp(THIRD_IP, "lo:third"); serverLive.destroyForcibly(); Wait.assertTrue(backupControl::isActive); @@ -564,14 +539,12 @@ public class DNSSwitchTest extends SmokeTestBase { @Test public void testCantReachBack() throws Throwable { - System.out.println(System.getProperty("java.security.properties")); - spawnRun(serverLocation, "testCantReachBack", getServerLocation(SERVER_LIVE_NORETRYDNS), getServerLocation(SERVER_BACKUP)); } public static void testCantReachBack(String[] args) throws Throwable { - NetUtil.netUp(FIRST_IP); - NetUtil.netUp(SECOND_IP); + NetUtil.netUp(FIRST_IP, "lo:first"); + NetUtil.netUp(SECOND_IP, "lo:second"); // notice there's no THIRD_IP anywhere saveConf(hostsFile, FIRST_IP, "FIRST", THIRD_IP, "SECOND"); @@ -602,6 +575,90 @@ public class DNSSwitchTest extends SmokeTestBase { if (serverLive != null) { serverLive.destroyForcibly(); } + } + + } + + + @Test + public void testWithPing() throws Throwable { + spawnRun(serverLocation, "testWithPing", getServerLocation(SERVER_LIVE_PING), getServerLocation(SERVER_BACKUP_PING)); + } + + public static void testWithPing(String[] args) throws Throwable { + NetUtil.netUp(FIRST_IP, "lo:first"); + NetUtil.netUp(SECOND_IP, "lo:second"); + NetUtil.netUp(THIRD_IP, "lo:third"); + + // notice there's no THIRD_IP anywhere + saveConf(hostsFile, FIRST_IP, "FIRST", SECOND_IP, "SECOND", THIRD_IP, "PINGPLACE"); + + Process serverLive = null; + Process serverBackup = null; + + try { + serverLive = ServerUtil.startServer(args[1], "live", "tcp://FIRST:61616", 30_000); + ActiveMQServerControl liveControl = getServerControl(liveURI, liveNameBuilder, 20_000); + + Wait.assertTrue(liveControl::isStarted); + + // notice the first server does not know about this server at all + serverBackup = ServerUtil.startServer(args[2], "backup", "tcp://SECOND:61716", 0); + ActiveMQServerControl backupControl = getServerControl(backupURI, backupNameBuilder, 20_000); + + Wait.assertTrue(backupControl::isStarted); + Wait.assertTrue(backupControl::isReplicaSync); + // Removing PINGPLACE from DNS + saveConf(hostsFile, FIRST_IP, "FIRST", SECOND_IP, "SECOND", INVALID_IP, "PINGPLACE"); + + Wait.assertFalse(liveControl::isStarted); + + serverBackup.destroyForcibly(); + + + //Thread.sleep(10_000); + serverLive.destroyForcibly(); + serverLive = ServerUtil.startServer(args[1], "live", "tcp://FIRST:61616", 0); + + Thread.sleep(1_000); + + + logger.debug("going to re-enable ping"); + // Enable the address just for ping now + saveConf(hostsFile, THIRD_IP, "PINGPLACE"); + liveControl = getServerControl(liveURI, liveNameBuilder, 20_000); + Wait.assertTrue(liveControl::isStarted); + + // Waiting some time as to the retry logic to kick in + Thread.sleep(5_000); + + // the backup will know about the live, but live doesn't have a direct DNS to backup.. lets see what happens + saveConf(hostsFile, FIRST_IP, "FIRST", THIRD_IP, "PINGPLACE"); + + boolean ok = false; + for (int i = 0; i < 5; i++) { + serverBackup = ServerUtil.startServer(args[2], "backup", "tcp://SECOND:61716", 0); + backupControl = getServerControl(backupURI, backupNameBuilder, 20_000); + Wait.assertTrue(backupControl::isStarted); + if (!Wait.waitFor(backupControl::isReplicaSync, 5000, 100)) { + serverBackup.destroyForcibly(); + } else { + ok = true; + break; + } + } + + Assert.assertTrue(ok); + + //connectAndWaitBackup(); + + } finally { + if (serverBackup != null) { + serverBackup.destroyForcibly(); + } + if (serverLive != null) { + serverLive.destroyForcibly(); + } } @@ -752,8 +809,8 @@ public class DNSSwitchTest extends SmokeTestBase { String securityProperties = System.getProperty("java.security.properties"); - if (securityProperties != null && securityProperties.equals(location + "/etc/zerocache.security3")) { - System.out.println("No need to spawn a VM, the zerocache is already in place"); + if (securityProperties != null && securityProperties.equals(location + "/etc/zerocache.security")) { + logger.info("No need to spawn a VM, the zerocache is already in place"); System.setProperty("artemis.config.location", location); USING_SPAWN = false; main(args);
