summaryrefslogtreecommitdiffstats
path: root/container-core
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@yahooinc.com>2022-06-30 14:14:42 +0200
committerBjørn Christian Seime <bjorncs@yahooinc.com>2022-06-30 14:14:42 +0200
commit882b8e0469779404c061a7db3813bfdf923580f7 (patch)
tree56fc92b7c2e7bdd6eb45c01df0a275bcdc49e16b /container-core
parent44b2f5114416254d5eb859ea02f436c4b0dfaf0a (diff)
Make cache expiry configurable
Diffstat (limited to 'container-core')
-rw-r--r--container-core/abi-spec.json4
-rw-r--r--container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/HealthCheckProxyHandler.java18
-rw-r--r--container-core/src/main/resources/configdefinitions/jdisc.http.jdisc.http.connector.def3
3 files changed, 18 insertions, 7 deletions
diff --git a/container-core/abi-spec.json b/container-core/abi-spec.json
index 12949be12b1..1378008b546 100644
--- a/container-core/abi-spec.json
+++ b/container-core/abi-spec.json
@@ -1091,6 +1091,7 @@
"public com.yahoo.jdisc.http.ConnectorConfig$HealthCheckProxy$Builder enable(boolean)",
"public com.yahoo.jdisc.http.ConnectorConfig$HealthCheckProxy$Builder port(int)",
"public com.yahoo.jdisc.http.ConnectorConfig$HealthCheckProxy$Builder clientTimeout(double)",
+ "public com.yahoo.jdisc.http.ConnectorConfig$HealthCheckProxy$Builder cacheExpiry(double)",
"public com.yahoo.jdisc.http.ConnectorConfig$HealthCheckProxy build()"
],
"fields": []
@@ -1106,7 +1107,8 @@
"public void <init>(com.yahoo.jdisc.http.ConnectorConfig$HealthCheckProxy$Builder)",
"public boolean enable()",
"public int port()",
- "public double clientTimeout()"
+ "public double clientTimeout()",
+ "public double cacheExpiry()"
],
"fields": []
},
diff --git a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/HealthCheckProxyHandler.java b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/HealthCheckProxyHandler.java
index ae2871e266d..dd9bc9a14a5 100644
--- a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/HealthCheckProxyHandler.java
+++ b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/HealthCheckProxyHandler.java
@@ -63,7 +63,9 @@ class HealthCheckProxyHandler extends HandlerWrapper {
ConnectorConfig.HealthCheckProxy proxyConfig = connector.connectorConfig().healthCheckProxy();
if (proxyConfig.enable()) {
Duration targetTimeout = Duration.ofMillis((int) (proxyConfig.clientTimeout() * 1000));
- mapping.put(connector.listenPort(), createProxyTarget(proxyConfig.port(), targetTimeout, connectors));
+ Duration cacheExpiry = Duration.ofMillis((int) (proxyConfig.cacheExpiry() * 1000));
+ ProxyTarget target = createProxyTarget(proxyConfig.port(), targetTimeout, cacheExpiry, connectors);
+ mapping.put(connector.listenPort(), target);
log.info(String.format("Port %1$d is configured as a health check proxy for port %2$d. " +
"HTTP requests to '%3$s' on %1$d are proxied as HTTPS to %2$d.",
connector.listenPort(), proxyConfig.port(), HEALTH_CHECK_PATH));
@@ -72,7 +74,8 @@ class HealthCheckProxyHandler extends HandlerWrapper {
return mapping;
}
- private static ProxyTarget createProxyTarget(int targetPort, Duration targetTimeout, List<JDiscServerConnector> connectors) {
+ private static ProxyTarget createProxyTarget(int targetPort, Duration targetTimeout, Duration cacheExpiry,
+ List<JDiscServerConnector> connectors) {
JDiscServerConnector targetConnector = connectors.stream()
.filter(connector -> connector.listenPort() == targetPort)
.findAny()
@@ -85,7 +88,7 @@ class HealthCheckProxyHandler extends HandlerWrapper {
.orElseThrow(() -> new IllegalArgumentException("Health check proxy can only target https port"));
ConnectorConfig.ProxyProtocol proxyProtocolCfg = targetConnector.connectorConfig().proxyProtocol();
boolean proxyProtocol = proxyProtocolCfg.enabled() && !proxyProtocolCfg.mixedMode();
- return new ProxyTarget(targetPort, targetTimeout, sslContextFactory, proxyProtocol);
+ return new ProxyTarget(targetPort, targetTimeout, cacheExpiry, sslContextFactory, proxyProtocol);
}
@Override
@@ -160,21 +163,24 @@ class HealthCheckProxyHandler extends HandlerWrapper {
private static class ProxyTarget implements AutoCloseable {
final int port;
final Duration timeout;
+ final Duration cacheExpiry;
final SslContextFactory.Server serverSsl;
final boolean proxyProtocol;
volatile HttpClient client;
volatile StatusResponse lastResponse;
- ProxyTarget(int port, Duration timeout, SslContextFactory.Server serverSsl, boolean proxyProtocol) {
+ ProxyTarget(int port, Duration timeout, Duration cacheExpiry, SslContextFactory.Server serverSsl,
+ boolean proxyProtocol) {
this.port = port;
this.timeout = timeout;
+ this.cacheExpiry = cacheExpiry;
this.serverSsl = serverSsl;
this.proxyProtocol = proxyProtocol;
}
StatusResponse requestStatusHtml() {
StatusResponse response = lastResponse;
- if (response != null && !response.isExpired()) {
+ if (response != null && !response.isExpired(cacheExpiry)) {
return response;
}
return this.lastResponse = getStatusResponse();
@@ -271,6 +277,6 @@ class HealthCheckProxyHandler extends HandlerWrapper {
this.content = content;
}
- boolean isExpired() { return System.nanoTime() - createdAt > Duration.ofSeconds(1).toNanos(); }
+ boolean isExpired(Duration expiry) { return System.nanoTime() - createdAt > expiry.toNanos(); }
}
}
diff --git a/container-core/src/main/resources/configdefinitions/jdisc.http.jdisc.http.connector.def b/container-core/src/main/resources/configdefinitions/jdisc.http.jdisc.http.connector.def
index ca02c245015..2a8e7159b2f 100644
--- a/container-core/src/main/resources/configdefinitions/jdisc.http.jdisc.http.connector.def
+++ b/container-core/src/main/resources/configdefinitions/jdisc.http.jdisc.http.connector.def
@@ -104,6 +104,9 @@ healthCheckProxy.port int default=8080
# Low-level timeout for proxy client (socket connect, socket read, connection pool). Aggregate timeout will be longer.
healthCheckProxy.clientTimeout double default=1.0
+# Expiry for cached health response
+healthCheckProxy.cacheExpiry double default=1.0
+
# Enable PROXY protocol V1/V2 support (only for https connectors).
proxyProtocol.enabled bool default=false