Browse Source

SONAR-12041 Display warning at startup if list of hosts is not consistent across all cluster nodes

tags/7.8
Duarte Meneses 5 years ago
parent
commit
6975fba191

+ 13
- 7
server/sonar-main/src/main/java/org/sonar/application/cluster/AppNodesClusterHostsConsistency.java View File

@@ -97,17 +97,13 @@ public class AppNodesClusterHostsConsistency {
if (anyDifference) {
StringBuilder builder = new StringBuilder().append("The configuration of the current node doesn't match the list of hosts configured in "
+ "the application nodes that have already joined the cluster:\n");
logMemberSetting(builder, hzMember.getCluster().getLocalMember(), currentConfiguredHosts);

for (Map.Entry<Member, List<String>> e : hostsPerMember.entrySet()) {
if (e.getValue().isEmpty()) {
continue;
}
builder.append(toString(e.getKey().getAddress()));
builder.append(" : ");
builder.append(e.getValue());
if (e.getKey().localMember()) {
builder.append(" (current)");
}
builder.append("\n");
logMemberSetting(builder, e.getKey(), e.getValue());
}
builder.append("Make sure the configuration is consistent among all application nodes before you restart any node");
logger.accept(builder.toString());
@@ -117,6 +113,16 @@ public class AppNodesClusterHostsConsistency {
private String toString(Address address) {
return address.getHost() + ":" + address.getPort();
}

private void logMemberSetting(StringBuilder builder, Member member, List<String> configuredHosts) {
builder.append(toString(member.getAddress()));
builder.append(" : ");
builder.append(configuredHosts);
if (member.localMember()) {
builder.append(" (current)");
}
builder.append("\n");
}
}

private static List<String> getConfiguredClusterHosts() {

+ 18
- 19
server/sonar-main/src/test/java/org/sonar/application/cluster/AppNodesClusterHostsConsistencyTest.java View File

@@ -27,6 +27,7 @@ import com.hazelcast.nio.Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -69,13 +70,12 @@ public class AppNodesClusterHostsConsistencyTest {
Member m2 = newLocalHostMember(2);
Member m3 = newLocalHostMember(3);

hostsPerMember.put(m1, Arrays.asList("1.1.1.1:1000", "1.1.1.1:2000", "1.1.1.2:1000"));
hostsPerMember.put(m2, Arrays.asList("1.1.1.1:1000", "1.1.1.1:2000"));
hostsPerMember.put(m3, Arrays.asList("1.1.1.1:1000", "1.1.1.2:1000"));

settings.set(CLUSTER_HZ_HOSTS.getKey(), "1.1.1.1:1000,1.1.1.1:2000,1.1.1.2:1000");

TestHazelcastMember member = new TestHazelcastMember(hostsPerMember);
TestHazelcastMember member = new TestHazelcastMember(hostsPerMember, m1);
AppNodesClusterHostsConsistency underTest = AppNodesClusterHostsConsistency.setInstance(member, settings, logger);
underTest.check();

@@ -90,17 +90,16 @@ public class AppNodesClusterHostsConsistencyTest {
@Test
public void dont_log_if_configured_hosts_are_consistent() throws UnknownHostException {
Map<Member, List<String>> hostsPerMember = new LinkedHashMap<>();
Member m1 = newLocalHostMember(1);
Member m1 = newLocalHostMember(1, true);
Member m2 = newLocalHostMember(2);
Member m3 = newLocalHostMember(3);

hostsPerMember.put(m1, Arrays.asList("1.1.1.1:1000", "1.1.1.1:2000", "1.1.1.2:1000"));
hostsPerMember.put(m2, Arrays.asList("1.1.1.1:1000", "1.1.1.1:2000", "1.1.1.2:1000"));
hostsPerMember.put(m3, Arrays.asList("1.1.1.1:1000", "1.1.1.1:2000", "1.1.1.2:1000"));

settings.set(CLUSTER_HZ_HOSTS.getKey(), "1.1.1.1:1000,1.1.1.1:2000,1.1.1.2:1000");

TestHazelcastMember member = new TestHazelcastMember(hostsPerMember);
TestHazelcastMember member = new TestHazelcastMember(hostsPerMember, m1);
AppNodesClusterHostsConsistency underTest = AppNodesClusterHostsConsistency.setInstance(member, settings, logger);
underTest.check();

@@ -108,28 +107,27 @@ public class AppNodesClusterHostsConsistencyTest {
}

@Test
public void setInstance_fails_with_ISE_when_called_twice_with_same_arguments() {
HazelcastMember hzMember = mock(HazelcastMember.class);
public void setInstance_fails_with_ISE_when_called_twice_with_same_arguments() throws UnknownHostException {
TestHazelcastMember member = new TestHazelcastMember(Collections.emptyMap(), newLocalHostMember(1, true));

AppNodesClusterHostsConsistency.setInstance(hzMember, settings);
AppNodesClusterHostsConsistency.setInstance(member, settings);

expectedException.expect(IllegalStateException.class);
expectedException.expectMessage("Instance is already set");

AppNodesClusterHostsConsistency.setInstance(hzMember, settings);
AppNodesClusterHostsConsistency.setInstance(member, settings);
}

@Test
public void setInstance_fails_with_ISE_when_called_twice_with_other_arguments() {
HazelcastMember hzMember1 = mock(HazelcastMember.class);
HazelcastMember hzMember2 = mock(HazelcastMember.class);

AppNodesClusterHostsConsistency.setInstance(hzMember1, settings);
public void setInstance_fails_with_ISE_when_called_twice_with_other_arguments() throws UnknownHostException {
TestHazelcastMember member1 = new TestHazelcastMember(Collections.emptyMap(), newLocalHostMember(1, true));
TestHazelcastMember member2 = new TestHazelcastMember(Collections.emptyMap(), newLocalHostMember(2, true));
AppNodesClusterHostsConsistency.setInstance(member1, new TestAppSettings());

expectedException.expect(IllegalStateException.class);
expectedException.expectMessage("Instance is already set");

AppNodesClusterHostsConsistency.setInstance(hzMember2, new TestAppSettings());
AppNodesClusterHostsConsistency.setInstance(member2, new TestAppSettings());
}

private Member newLocalHostMember(int port) throws UnknownHostException {
@@ -138,7 +136,7 @@ public class AppNodesClusterHostsConsistencyTest {

private Member newLocalHostMember(int port, boolean localMember) throws UnknownHostException {
Member member = mock(Member.class);
when (member.localMember()).thenReturn(localMember);
when(member.localMember()).thenReturn(localMember);
Address address1 = new Address(InetAddress.getLocalHost(), port);
when(member.getAddress()).thenReturn(address1);
return member;
@@ -146,9 +144,11 @@ public class AppNodesClusterHostsConsistencyTest {

private class TestHazelcastMember implements HazelcastMember {
private final Map<Member, List<String>> hostsPerMember;
private final Cluster cluster = mock(Cluster.class);

private TestHazelcastMember(Map<Member, List<String>> hostsPerMember) {
private TestHazelcastMember(Map<Member, List<String>> hostsPerMember, Member localMember) {
this.hostsPerMember = hostsPerMember;
when(cluster.getLocalMember()).thenReturn(localMember);
}

@Override
@@ -169,7 +169,6 @@ public class AppNodesClusterHostsConsistencyTest {
@Override
public Set<String> getMemberUuids() {
throw new IllegalStateException("not expected to be called");

}

@Override
@@ -184,7 +183,7 @@ public class AppNodesClusterHostsConsistencyTest {

@Override
public Cluster getCluster() {
throw new IllegalStateException("not expected to be called");
return cluster;
}

@Override

Loading…
Cancel
Save