From 3505076a63179b48a4b3350e7bc295e7e665ee42 Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=A9bastien=20Lesaint?= Date: Tue, 5 Sep 2017 10:53:55 +0200 Subject: [PATCH] SONAR-9741 add detail TRACE logs SharedHealthStateImpl --- .../cluster/health/SharedHealthStateImpl.java | 14 +++++++++- .../health/SharedHealthStateImplTest.java | 26 ++++++++++++++++--- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/server/sonar-cluster/src/main/java/org/sonar/cluster/health/SharedHealthStateImpl.java b/server/sonar-cluster/src/main/java/org/sonar/cluster/health/SharedHealthStateImpl.java index 2957fc297e7..a045598d234 100644 --- a/server/sonar-cluster/src/main/java/org/sonar/cluster/health/SharedHealthStateImpl.java +++ b/server/sonar-cluster/src/main/java/org/sonar/cluster/health/SharedHealthStateImpl.java @@ -23,6 +23,7 @@ import com.google.common.collect.ImmutableSet; import java.util.HashMap; import java.util.Map; import java.util.Set; +import java.util.function.Predicate; import java.util.stream.Collectors; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; @@ -33,6 +34,7 @@ import static java.util.Objects.requireNonNull; public class SharedHealthStateImpl implements SharedHealthState { private static final String SQ_HEALTH_STATE_REPLICATED_MAP_IDENTIFIER = "sq_health_state"; private static final Logger LOG = Loggers.get(SharedHealthStateImpl.class); + private static final int TIMEOUT_30_SECONDS = 30 * 60 * 1000; private final HazelcastClient hazelcastClient; @@ -66,7 +68,7 @@ public class SharedHealthStateImpl implements SharedHealthState { Map sqHealthState = readReplicatedMap(); Set hzMemberUUIDs = hazelcastClient.getMemberUuids(); Set existingNodeHealths = sqHealthState.entrySet().stream() - .filter(entry -> hzMemberUUIDs.contains(entry.getKey())) + .filter(ofNonExistentMember(hzMemberUUIDs)) .map(entry -> entry.getValue().getNodeHealth()) .collect(Collectors.toSet()); if (LOG.isTraceEnabled()) { @@ -75,6 +77,16 @@ public class SharedHealthStateImpl implements SharedHealthState { return ImmutableSet.copyOf(existingNodeHealths); } + private static Predicate> ofNonExistentMember(Set hzMemberUUIDs) { + return entry -> { + boolean res = hzMemberUUIDs.contains(entry.getKey()); + if (!res && LOG.isTraceEnabled()) { + LOG.trace("Ignoring NodeHealth of member {} because it is not part of the cluster at the moment", entry.getKey()); + } + return res; + }; + } + private Map readReplicatedMap() { return hazelcastClient.getReplicatedMap(SQ_HEALTH_STATE_REPLICATED_MAP_IDENTIFIER); } diff --git a/server/sonar-cluster/src/test/java/org/sonar/cluster/health/SharedHealthStateImplTest.java b/server/sonar-cluster/src/test/java/org/sonar/cluster/health/SharedHealthStateImplTest.java index bef109c26b5..5c4eecc07e6 100644 --- a/server/sonar-cluster/src/test/java/org/sonar/cluster/health/SharedHealthStateImplTest.java +++ b/server/sonar-cluster/src/test/java/org/sonar/cluster/health/SharedHealthStateImplTest.java @@ -19,6 +19,7 @@ */ package org.sonar.cluster.health; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Random; @@ -92,7 +93,6 @@ public class SharedHealthStateImplTest { assertThat(logTester.logs()).hasSize(1); assertThat(logTester.logs(LoggerLevel.TRACE).iterator().next()).isEqualTo("Reading " + map + " and adding " + newNodeHealth); - } @Test @@ -121,14 +121,34 @@ public class SharedHealthStateImplTest { public void readAll_logs_map_sq_health_state_content_and_the_content_effectively_returned_if_TRACE() { logTester.setLevel(LoggerLevel.TRACE); Map map = new HashMap<>(); - map.put(randomAlphanumeric(44), new TimestampedNodeHealth(randomNodeHealth(), random.nextLong())); + String uuid = randomAlphanumeric(44); + NodeHealth nodeHealth = randomNodeHealth(); + map.put(uuid, new TimestampedNodeHealth(nodeHealth, random.nextLong())); when(hazelcastClient.getClusterTime()).thenReturn(random.nextLong()); + when(hazelcastClient.getMemberUuids()).thenReturn(Collections.singleton(uuid)); doReturn(map).when(hazelcastClient).getReplicatedMap(MAP_SQ_HEALTH_STATE); underTest.readAll(); assertThat(logTester.logs()).hasSize(1); - assertThat(logTester.logs(LoggerLevel.TRACE).iterator().next()).isEqualTo("Reading " + map + " and keeping []"); + assertThat(logTester.logs(LoggerLevel.TRACE)).containsOnly("Reading " + new HashMap<>(map) + " and keeping " + Collections.singleton(nodeHealth)); + } + + @Test + public void readAll_logs_content_of_non_existing_member_was_ignored_if_TRACE() { + logTester.setLevel(LoggerLevel.TRACE); + Map map = new HashMap<>(); + String memberUuid = randomAlphanumeric(44); + map.put(memberUuid, new TimestampedNodeHealth(randomNodeHealth(), random.nextLong())); + when(hazelcastClient.getClusterTime()).thenReturn(random.nextLong()); + doReturn(map).when(hazelcastClient).getReplicatedMap(MAP_SQ_HEALTH_STATE); + + underTest.readAll(); + + assertThat(logTester.logs()).hasSize(2); + assertThat(logTester.logs(LoggerLevel.TRACE)).containsOnly( + "Reading " + map + " and keeping []", + "Ignoring NodeHealth of member " + memberUuid + " because it is not part of the cluster at the moment"); } @Test -- 2.39.5