diff options
author | Harald Musum <musum@yahooinc.com> | 2023-06-19 13:15:33 +0200 |
---|---|---|
committer | Harald Musum <musum@yahooinc.com> | 2023-06-19 13:15:33 +0200 |
commit | bb2333e7e0d6e74b99518faefa8334c4577221f1 (patch) | |
tree | a629cf81c4af97c333a2b5754bb0296cecd7e8b8 /clustercontroller-core | |
parent | 335ade42d91443f700c31bb3448d470a0de43cd2 (diff) |
Move fetchStatusPage
Diffstat (limited to 'clustercontroller-core')
3 files changed, 79 insertions, 42 deletions
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 8027cec4e3c..a5fa0d08bb8 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 @@ -2,7 +2,6 @@ package com.yahoo.vespa.clustercontroller.core; import com.yahoo.document.FixedBucketSpaces; -import com.yahoo.exception.ExceptionUtils; import com.yahoo.vdslib.distribution.ConfiguredNode; import com.yahoo.vdslib.state.ClusterState; import com.yahoo.vdslib.state.Node; @@ -22,10 +21,9 @@ import com.yahoo.vespa.clustercontroller.core.status.LegacyIndexPageRequestHandl import com.yahoo.vespa.clustercontroller.core.status.LegacyNodePageRequestHandler; import com.yahoo.vespa.clustercontroller.core.status.NodeHealthRequestHandler; import com.yahoo.vespa.clustercontroller.core.status.StatusHandler; -import com.yahoo.vespa.clustercontroller.core.status.statuspage.StatusPageResponse; import com.yahoo.vespa.clustercontroller.core.status.statuspage.StatusPageServer; import com.yahoo.vespa.clustercontroller.utils.util.MetricReporter; -import java.io.FileNotFoundException; + import java.time.Duration; import java.time.Instant; import java.util.ArrayDeque; @@ -37,7 +35,6 @@ import java.util.List; import java.util.Map; import java.util.Queue; import java.util.Set; -import java.util.TimeZone; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; @@ -508,43 +505,6 @@ public class FleetController implements NodeListener, SlobrokListener, SystemSta } } - public StatusPageResponse fetchStatusPage(StatusPageServer.HttpRequest httpRequest) { - verifyInControllerThread(); - StatusPageResponse.ResponseCode responseCode; - String message; - final String hiddenMessage; - try { - StatusPageServer.RequestHandler handler = statusRequestRouter.resolveHandler(httpRequest); - if (handler == null) { - throw new FileNotFoundException("No handler found for request: " + httpRequest.getPath()); - } - return handler.handle(httpRequest); - } catch (FileNotFoundException e) { - responseCode = StatusPageResponse.ResponseCode.NOT_FOUND; - message = e.getMessage(); - hiddenMessage = ""; - } catch (Exception e) { - responseCode = StatusPageResponse.ResponseCode.INTERNAL_SERVER_ERROR; - message = "Internal Server Error"; - hiddenMessage = ExceptionUtils.getStackTraceAsString(e); - context.log(logger, Level.FINE, () -> "Unknown exception thrown for request " + httpRequest.getRequest() + ": " + hiddenMessage); - } - - TimeZone tz = TimeZone.getTimeZone("UTC"); - long currentTime = timer.getCurrentTimeInMillis(); - StatusPageResponse response = new StatusPageResponse(); - StringBuilder content = new StringBuilder(); - response.setContentType("text/html"); - response.setResponseCode(responseCode); - content.append("<!-- Answer to request ").append(httpRequest.getRequest()).append(" -->\n"); - content.append("<p>UTC time when creating this page: ").append(RealTimer.printDateNoMilliSeconds(currentTime, tz)).append("</p>"); - response.writeHtmlHeader(content, message); - response.writeHtmlFooter(content, hiddenMessage); - response.writeContent(content.toString()); - - return response; - } - public void tick() throws Exception { synchronized (monitor) { boolean didWork; @@ -635,7 +595,8 @@ public class FleetController implements NodeListener, SlobrokListener, SystemSta private boolean processAnyPendingStatusPageRequest() { StatusPageServer.HttpRequest statusRequest = statusPageServer.getCurrentHttpRequest(); if (statusRequest != null) { - statusPageServer.answerCurrentStatusRequest(fetchStatusPage(statusRequest)); + verifyInControllerThread(); + statusPageServer.fetchStatusPage(statusRequest, statusRequestRouter, timer); return true; } return false; diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/status/StatusHandler.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/status/StatusHandler.java index 65b06afb0c5..6ed121284b6 100644 --- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/status/StatusHandler.java +++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/status/StatusHandler.java @@ -1,14 +1,20 @@ // 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.exception.ExceptionUtils; +import com.yahoo.vespa.clustercontroller.core.RealTimer; +import com.yahoo.vespa.clustercontroller.core.Timer; import com.yahoo.vespa.clustercontroller.core.status.statuspage.StatusPageResponse; import com.yahoo.vespa.clustercontroller.core.status.statuspage.StatusPageServer; import com.yahoo.vespa.clustercontroller.utils.communication.http.HttpRequest; import com.yahoo.vespa.clustercontroller.utils.communication.http.HttpRequestHandler; import com.yahoo.vespa.clustercontroller.utils.communication.http.HttpResult; + +import java.io.FileNotFoundException; import java.io.StringWriter; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.TimeZone; import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -42,6 +48,46 @@ public class StatusHandler implements HttpRequestHandler { return r; } } + + public void fetchStatusPage(StatusPageServer.HttpRequest httpRequest, + StatusPageServer.PatternRequestRouter statusRequestRouter, + Timer timer) { + StatusPageResponse.ResponseCode responseCode; + String message; + final String hiddenMessage; + try { + StatusPageServer.RequestHandler handler = statusRequestRouter.resolveHandler(httpRequest); + if (handler == null) { + throw new FileNotFoundException("No handler found for request: " + httpRequest.getPath()); + } + answerCurrentStatusRequest(handler.handle(httpRequest)); + return; + } catch (FileNotFoundException e) { + responseCode = StatusPageResponse.ResponseCode.NOT_FOUND; + message = e.getMessage(); + hiddenMessage = ""; + } catch (Exception e) { + responseCode = StatusPageResponse.ResponseCode.INTERNAL_SERVER_ERROR; + message = "Internal Server Error"; + hiddenMessage = ExceptionUtils.getStackTraceAsString(e); + } + + TimeZone tz = TimeZone.getTimeZone("UTC"); + long currentTime = timer.getCurrentTimeInMillis(); + StatusPageResponse response = new StatusPageResponse(); + StringBuilder content = new StringBuilder(); + response.setContentType("text/html"); + response.setResponseCode(responseCode); + content.append("<!-- Answer to request ").append(httpRequest.getRequest()).append(" -->\n"); + content.append("<p>UTC time when creating this page: ").append(RealTimer.printDateNoMilliSeconds(currentTime, tz)).append("</p>"); + response.writeHtmlHeader(content, message); + response.writeHtmlFooter(content, hiddenMessage); + response.writeContent(content.toString()); + + + answerCurrentStatusRequest(response); + } + public void answerCurrentStatusRequest(StatusPageResponse r) { synchronized (answerMonitor) { response = r; diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateRequests.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateRequests.java new file mode 100644 index 00000000000..f0f98120d72 --- /dev/null +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateRequests.java @@ -0,0 +1,30 @@ +package com.yahoo.vespa.clustercontroller.core; + +import com.yahoo.vespa.clustercontroller.utils.staterestapi.requests.UnitStateRequest; + +import java.util.List; + +public class StateRequests { + + public static class Get extends StateRequests implements UnitStateRequest { + private final List<String> path; + private final int recursive; + + public Get(String req, int recursive) { + path = req.isEmpty() ? List.of() : List.of(req.split("/")); + this.recursive = recursive; + } + + @Override + public int getRecursiveLevels() { + return recursive; + } + + @Override + public List<String> getUnitPath() { + return path; + } + + } + +} |