diff --git a/hbase-it/src/test/java/org/apache/hadoop/hbase/chaos/actions/DumpClusterStatusAction.java b/hbase-it/src/test/java/org/apache/hadoop/hbase/chaos/actions/DumpClusterStatusAction.java index e738505af96..f6a1c4251b5 100644 --- a/hbase-it/src/test/java/org/apache/hadoop/hbase/chaos/actions/DumpClusterStatusAction.java +++ b/hbase-it/src/test/java/org/apache/hadoop/hbase/chaos/actions/DumpClusterStatusAction.java @@ -19,6 +19,14 @@ package org.apache.hadoop.hbase.chaos.actions; import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.apache.hadoop.hbase.ClusterStatus; +import org.apache.hadoop.hbase.ServerName; +import org.apache.hadoop.hbase.net.Address; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,18 +36,71 @@ import org.slf4j.LoggerFactory; public class DumpClusterStatusAction extends Action { private static final Logger LOG = LoggerFactory.getLogger(DumpClusterStatusAction.class); - @Override protected Logger getLogger() { + private Set
initialRegionServers; + + @Override + protected Logger getLogger() { return LOG; } @Override public void init(ActionContext context) throws IOException { super.init(context); + initialRegionServers = collectKnownRegionServers(initialStatus); } @Override public void perform() throws Exception { getLogger().debug("Performing action: Dump cluster status"); - getLogger().info("Cluster status\n" + cluster.getClusterStatus()); + final ClusterStatus currentMetrics = cluster.getClusterStatus(); + getLogger().info("Cluster status\n{}", currentMetrics); + reportMissingRegionServers(currentMetrics); + reportNewRegionServers(currentMetrics); + } + + /** + * Build a set of all the host:port pairs of region servers known to this cluster. + */ + private static Set
collectKnownRegionServers(final ClusterStatus clusterStatus) { + final Set
regionServers = new HashSet<>(); + final Set serverNames = clusterStatus.getLiveServersLoad().keySet(); + serverNames.addAll(clusterStatus.getDeadServerNames()); + + for (final ServerName serverName : serverNames) { + regionServers.add(serverName.getAddress()); + } + return Collections.unmodifiableSet(regionServers); + } + + private void reportMissingRegionServers(final ClusterStatus clusterStatus) { + final Set
regionServers = collectKnownRegionServers(clusterStatus); + final Set
missingRegionServers = new HashSet<>(initialRegionServers); + missingRegionServers.removeAll(regionServers); + if (!missingRegionServers.isEmpty()) { + final StringBuilder stringBuilder = new StringBuilder() + .append("region server(s) are missing from this cluster report"); + final List
sortedAddresses = new ArrayList<>(missingRegionServers); + Collections.sort(sortedAddresses); + for (final Address address : sortedAddresses) { + stringBuilder.append("\n ").append(address); + } + getLogger().warn(stringBuilder.toString()); + } + } + + private void reportNewRegionServers(final ClusterStatus clusterStatus) { + final Set
regionServers = collectKnownRegionServers(clusterStatus); + final Set
newRegionServers = new HashSet<>(regionServers); + newRegionServers.removeAll(initialRegionServers); + if (!newRegionServers.isEmpty()) { + final StringBuilder stringBuilder = new StringBuilder() + .append("region server(s) are new for this cluster report"); + final List
sortedAddresses = new ArrayList<>(newRegionServers); + Collections.sort(sortedAddresses); + for (final Address address : sortedAddresses) { + stringBuilder.append("\n ").append(address); + } + getLogger().warn(stringBuilder.toString()); + } } }