aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Musum <musum@yahooinc.com>2022-08-10 10:49:05 +0200
committerHarald Musum <musum@yahooinc.com>2022-08-10 10:49:05 +0200
commit04c39c7c801b8a15713424cb40543c1205b47c62 (patch)
tree349f489d44da4c6525fbd8292c653462e4e32579
parent910abd5cb5cf9a71b1d67af4002b39a20f9169ed (diff)
Move html generation to handler
-rw-r--r--clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ContentCluster.java61
-rw-r--r--clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/FleetController.java8
-rw-r--r--clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/status/LegacyIndexPageRequestHandler.java99
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);
+ }
+
}