diff options
author | Harald Musum <musum@yahooinc.com> | 2022-08-10 10:49:05 +0200 |
---|---|---|
committer | Harald Musum <musum@yahooinc.com> | 2022-08-10 10:49:05 +0200 |
commit | 04c39c7c801b8a15713424cb40543c1205b47c62 (patch) | |
tree | 349f489d44da4c6525fbd8292c653462e4e32579 | |
parent | 910abd5cb5cf9a71b1d67af4002b39a20f9169ed (diff) |
Move html generation to handler
3 files changed, 85 insertions, 83 deletions
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ContentCluster.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ContentCluster.java index f2a4a9736c3..695fecb6314 100644 --- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ContentCluster.java +++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ContentCluster.java @@ -1,20 +1,14 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. - package com.yahoo.vespa.clustercontroller.core; import com.yahoo.vdslib.distribution.ConfiguredNode; import com.yahoo.vdslib.distribution.Distribution; -import com.yahoo.vdslib.distribution.Group; import com.yahoo.vdslib.state.ClusterState; import com.yahoo.vdslib.state.Node; import com.yahoo.vdslib.state.NodeState; -import com.yahoo.vdslib.state.NodeType; import com.yahoo.vdslib.state.State; import com.yahoo.vespa.clustercontroller.core.listeners.NodeListener; -import com.yahoo.vespa.clustercontroller.core.status.statuspage.HtmlTable; -import com.yahoo.vespa.clustercontroller.core.status.statuspage.VdsClusterHtmlRenderer; import com.yahoo.vespa.clustercontroller.utils.staterestapi.requests.SetUnitStateRequest; - import java.util.Collection; import java.util.Collections; import java.util.List; @@ -46,61 +40,6 @@ public class ContentCluster { setNodes(configuredNodes, new NodeListener() {}); } - // TODO move out, this doesn't belong in a domain model class - public void writeHtmlState( - final VdsClusterHtmlRenderer vdsClusterHtmlRenderer, - final StringBuilder sb, - final Timer timer, - final ClusterStateBundle state, - final ClusterStatsAggregator statsAggregator, - final Distribution distribution, - final FleetControllerOptions options, - final EventLog eventLog) { - - final VdsClusterHtmlRenderer.Table table = - vdsClusterHtmlRenderer.createNewClusterHtmlTable(clusterName, slobrokGenerationCount); - - if (state.clusterFeedIsBlocked()) { // Implies FeedBlock != null - table.appendRaw("<h3 style=\"color: red\">Cluster feeding is blocked!</h3>\n"); - table.appendRaw(String.format("<p>Summary: <strong>%s</strong></p>\n", - HtmlTable.escape(state.getFeedBlockOrNull().getDescription()))); - } - - final List<Group> groups = LeafGroups.enumerateFrom(distribution.getRootGroup()); - - for (int j=0; j<groups.size(); ++j) { - final Group group = groups.get(j); - assert(group != null); - final String localName = group.getUnixStylePath(); - assert(localName != null); - final TreeMap<Integer, NodeInfo> storageNodeInfoByIndex = new TreeMap<>(); - final TreeMap<Integer, NodeInfo> distributorNodeInfoByIndex = new TreeMap<>(); - for (ConfiguredNode configuredNode : group.getNodes()) { - storeNodeInfo(configuredNode.index(), NodeType.STORAGE, storageNodeInfoByIndex); - storeNodeInfo(configuredNode.index(), NodeType.DISTRIBUTOR, distributorNodeInfoByIndex); - } - table.renderNodes( - storageNodeInfoByIndex, - distributorNodeInfoByIndex, - timer, - state, - statsAggregator, - options.minMergeCompletionRatio, - options.maxPrematureCrashes, - options.clusterFeedBlockLimit, - eventLog, - clusterName, - localName); - } - table.addTable(sb, options.stableStateTimePeriod); - } - - private void storeNodeInfo(int nodeIndex, NodeType nodeType, Map<Integer, NodeInfo> nodeInfoByIndex) { - NodeInfo nodeInfo = getNodeInfo(new Node(nodeType, nodeIndex)); - if (nodeInfo == null) return; - nodeInfoByIndex.put(nodeIndex, nodeInfo); - } - public Distribution getDistribution() { return distribution; } public void setDistribution(Distribution distribution) { diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/FleetController.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/FleetController.java index 7f385c6077c..9a6183379d9 100644 --- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/FleetController.java +++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/FleetController.java @@ -12,8 +12,8 @@ import com.yahoo.vdslib.state.State; import com.yahoo.vespa.clustercontroller.core.database.DatabaseHandler; import com.yahoo.vespa.clustercontroller.core.database.ZooKeeperDatabaseFactory; import com.yahoo.vespa.clustercontroller.core.hostinfo.HostInfo; -import com.yahoo.vespa.clustercontroller.core.listeners.SlobrokListener; import com.yahoo.vespa.clustercontroller.core.listeners.NodeListener; +import com.yahoo.vespa.clustercontroller.core.listeners.SlobrokListener; import com.yahoo.vespa.clustercontroller.core.listeners.SystemStateListener; import com.yahoo.vespa.clustercontroller.core.rpc.RPCCommunicator; import com.yahoo.vespa.clustercontroller.core.rpc.RpcServer; @@ -27,7 +27,6 @@ import com.yahoo.vespa.clustercontroller.core.status.statuspage.StatusPageRespon import com.yahoo.vespa.clustercontroller.core.status.statuspage.StatusPageServer; import com.yahoo.vespa.clustercontroller.core.status.statuspage.StatusPageServerInterface; import com.yahoo.vespa.clustercontroller.utils.util.MetricReporter; - import java.io.FileNotFoundException; import java.util.ArrayDeque; import java.util.ArrayList; @@ -45,7 +44,6 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; -import java.util.stream.Stream; public class FleetController implements NodeListener, SlobrokListener, SystemStateListener, Runnable, RemoteClusterControllerTaskScheduler { @@ -505,9 +503,7 @@ public class FleetController implements NodeListener, SlobrokListener, SystemSta cluster.setSlobrokGenerationCount(0); } - configuredBucketSpaces = Collections.unmodifiableSet( - Stream.of(FixedBucketSpaces.defaultSpace(), FixedBucketSpaces.globalSpace()) - .collect(Collectors.toSet())); + configuredBucketSpaces = Set.of(FixedBucketSpaces.defaultSpace(), FixedBucketSpaces.globalSpace()); stateVersionTracker.setMinMergeCompletionRatio(options.minMergeCompletionRatio); communicator.propagateOptions(options); diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/status/LegacyIndexPageRequestHandler.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/status/LegacyIndexPageRequestHandler.java index 378f65f7235..6b2b77f1e7d 100644 --- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/status/LegacyIndexPageRequestHandler.java +++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/status/LegacyIndexPageRequestHandler.java @@ -1,14 +1,31 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.clustercontroller.core.status; -import com.yahoo.vdslib.state.ClusterState; -import com.yahoo.vespa.clustercontroller.core.*; +import com.yahoo.vdslib.distribution.ConfiguredNode; +import com.yahoo.vdslib.distribution.Distribution; +import com.yahoo.vdslib.distribution.Group; +import com.yahoo.vdslib.state.Node; +import com.yahoo.vdslib.state.NodeType; +import com.yahoo.vespa.clustercontroller.core.ClusterStateBundle; +import com.yahoo.vespa.clustercontroller.core.ClusterStateHistoryEntry; +import com.yahoo.vespa.clustercontroller.core.ClusterStatsAggregator; +import com.yahoo.vespa.clustercontroller.core.ContentCluster; +import com.yahoo.vespa.clustercontroller.core.EventLog; +import com.yahoo.vespa.clustercontroller.core.FleetControllerOptions; +import com.yahoo.vespa.clustercontroller.core.LeafGroups; +import com.yahoo.vespa.clustercontroller.core.MasterElectionHandler; +import com.yahoo.vespa.clustercontroller.core.NodeInfo; +import com.yahoo.vespa.clustercontroller.core.RealTimer; +import com.yahoo.vespa.clustercontroller.core.StateVersionTracker; import com.yahoo.vespa.clustercontroller.core.Timer; +import com.yahoo.vespa.clustercontroller.core.status.statuspage.HtmlTable; import com.yahoo.vespa.clustercontroller.core.status.statuspage.StatusPageResponse; import com.yahoo.vespa.clustercontroller.core.status.statuspage.StatusPageServer; import com.yahoo.vespa.clustercontroller.core.status.statuspage.VdsClusterHtmlRenderer; - -import java.util.*; +import java.util.List; +import java.util.Map; +import java.util.TimeZone; +import java.util.TreeMap; /** * @author Haakon Humberset @@ -27,8 +44,7 @@ public class LegacyIndexPageRequestHandler implements StatusPageServer.RequestHa public LegacyIndexPageRequestHandler(Timer timer, boolean showLocalSystemStatesInLog, ContentCluster cluster, MasterElectionHandler masterElectionHandler, StateVersionTracker stateVersionTracker, - EventLog eventLog, long startedTime, RunDataExtractor data) - { + EventLog eventLog, long startedTime, RunDataExtractor data) { this.timer = timer; this.showLocalSystemStatesInLog = showLocalSystemStatesInLog; this.cluster = cluster; @@ -59,16 +75,15 @@ public class LegacyIndexPageRequestHandler implements StatusPageServer.RequestHa content.append("<tr><td>Cluster controller uptime:</td><td align=\"right\">" + RealTimer.printDuration(currentTime - startedTime) + "</td></tr></table>"); if (masterElectionHandler.isAmongNthFirst(data.getOptions().stateGatherCount)) { // Table overview of all the nodes - cluster.writeHtmlState( - new VdsClusterHtmlRenderer(), - content, - timer, - stateVersionTracker.getVersionedClusterStateBundle(), - stateVersionTracker.getAggregatedClusterStats(), - data.getOptions().storageDistribution, - data.getOptions(), - eventLog - ); + writeHtmlState(cluster, + new VdsClusterHtmlRenderer(), + content, + timer, + stateVersionTracker.getVersionedClusterStateBundle(), + stateVersionTracker.getAggregatedClusterStats(), + data.getOptions().storageDistribution, + data.getOptions(), + eventLog); // Current cluster state and cluster state history writeHtmlState(stateVersionTracker, content, request); } else { @@ -153,4 +168,56 @@ public class LegacyIndexPageRequestHandler implements StatusPageServer.RequestHa sb.append("</td></tr>\n"); } + private void writeHtmlState(ContentCluster cluster, + VdsClusterHtmlRenderer vdsClusterHtmlRenderer, + StringBuilder sb, + Timer timer, + ClusterStateBundle state, + ClusterStatsAggregator statsAggregator, + Distribution distribution, + FleetControllerOptions options, + EventLog eventLog) { + + VdsClusterHtmlRenderer.Table table = vdsClusterHtmlRenderer.createNewClusterHtmlTable(cluster.getName(), cluster.getSlobrokGenerationCount()); + + if (state.clusterFeedIsBlocked()) { // Implies FeedBlock != null + table.appendRaw("<h3 style=\"color: red\">Cluster feeding is blocked!</h3>\n"); + table.appendRaw(String.format("<p>Summary: <strong>%s</strong></p>\n", + HtmlTable.escape(state.getFeedBlockOrNull().getDescription()))); + } + + final List<Group> groups = LeafGroups.enumerateFrom(distribution.getRootGroup()); + + for (final Group group : groups) { + assert (group != null); + String localName = group.getUnixStylePath(); + assert (localName != null); + TreeMap<Integer, NodeInfo> storageNodeInfoByIndex = new TreeMap<>(); + TreeMap<Integer, NodeInfo> distributorNodeInfoByIndex = new TreeMap<>(); + for (ConfiguredNode configuredNode : group.getNodes()) { + storeNodeInfo(cluster, configuredNode.index(), NodeType.STORAGE, storageNodeInfoByIndex); + storeNodeInfo(cluster, configuredNode.index(), NodeType.DISTRIBUTOR, distributorNodeInfoByIndex); + } + table.renderNodes( + storageNodeInfoByIndex, + distributorNodeInfoByIndex, + timer, + state, + statsAggregator, + options.minMergeCompletionRatio, + options.maxPrematureCrashes, + options.clusterFeedBlockLimit, + eventLog, + cluster.getName(), + localName); + } + table.addTable(sb, options.stableStateTimePeriod); + } + + private void storeNodeInfo(ContentCluster cluster, int nodeIndex, NodeType nodeType, Map<Integer, NodeInfo> nodeInfoByIndex) { + NodeInfo nodeInfo = cluster.getNodeInfo(new Node(nodeType, nodeIndex)); + if (nodeInfo == null) return; + nodeInfoByIndex.put(nodeIndex, nodeInfo); + } + } |