diff options
author | Valerij Fredriksen <freva@users.noreply.github.com> | 2022-10-13 21:10:41 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-13 21:10:41 +0200 |
commit | a5ed12b351806b187613457b58982ca67f537594 (patch) | |
tree | 84e4beabd59ca6a1440607b5ba28468e92a83e48 /configserver | |
parent | 6e7459c9eff635d9c8227cd8d1add320f298c0e2 (diff) |
Revert "Remove HostLivenessTracker"
Diffstat (limited to 'configserver')
6 files changed, 65 insertions, 4 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/host/ConfigRequestHostLivenessTracker.java b/configserver/src/main/java/com/yahoo/vespa/config/server/host/ConfigRequestHostLivenessTracker.java new file mode 100644 index 00000000000..9195f78b23b --- /dev/null +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/host/ConfigRequestHostLivenessTracker.java @@ -0,0 +1,45 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.config.server.host; + +import com.yahoo.component.annotation.Inject; +import com.yahoo.config.provision.HostLivenessTracker; + +import java.time.Clock; +import java.time.Instant; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Keeps track of the last config request made by each hostname. + * This always remembers all requests forever since the moment is is constructed. + * This is the implementation which will be injected to components who request a HostLivenessTracker. + * + * @author bratseth + */ +public class ConfigRequestHostLivenessTracker implements HostLivenessTracker { + + private final Clock clock; + private final Map<String, Instant> lastRequestFromHost = new ConcurrentHashMap<>(); + + @Inject + @SuppressWarnings("unused") + public ConfigRequestHostLivenessTracker() { + this(Clock.systemUTC()); + } + + public ConfigRequestHostLivenessTracker(Clock clock) { + this.clock = clock; + } + + @Override + public void receivedRequestFrom(String hostname) { + lastRequestFromHost.put(hostname, clock.instant()); + } + + @Override + public Optional<Instant> lastRequestFrom(String hostname) { + return Optional.ofNullable(lastRequestFromHost.get(hostname)); + } + +} diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/GetConfigProcessor.java b/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/GetConfigProcessor.java index 1c419ce047a..b7327ef3aa7 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/GetConfigProcessor.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/GetConfigProcessor.java @@ -20,7 +20,6 @@ import com.yahoo.vespa.config.protocol.VespaVersion; import com.yahoo.vespa.config.server.GetConfigContext; import com.yahoo.vespa.config.server.UnknownConfigDefinitionException; import com.yahoo.vespa.config.server.tenant.TenantRepository; - import java.util.Optional; import java.util.Set; import java.util.logging.Level; @@ -151,6 +150,7 @@ class GetConfigProcessor implements Runnable { @Override public void run() { + rpcServer.hostLivenessTracker().receivedRequestFrom(request.getClientHostName()); Pair<GetConfigContext, Long> delayed = getConfig(request); if (delayed != null) { diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/RpcServer.java b/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/RpcServer.java index a2461706f11..b36967d76a4 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/RpcServer.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/RpcServer.java @@ -7,6 +7,7 @@ import com.yahoo.component.annotation.Inject; import com.yahoo.concurrent.ThreadFactoryFactory; import com.yahoo.config.FileReference; import com.yahoo.config.provision.ApplicationId; +import com.yahoo.config.provision.HostLivenessTracker; import com.yahoo.config.provision.TenantName; import com.yahoo.jrt.Acceptor; import com.yahoo.jrt.DataValue; @@ -26,8 +27,8 @@ import com.yahoo.vespa.config.protocol.ConfigResponse; import com.yahoo.vespa.config.protocol.JRTServerConfigRequest; import com.yahoo.vespa.config.protocol.JRTServerConfigRequestV3; import com.yahoo.vespa.config.protocol.Trace; -import com.yahoo.vespa.config.server.ConfigActivationListener; import com.yahoo.vespa.config.server.GetConfigContext; +import com.yahoo.vespa.config.server.ConfigActivationListener; import com.yahoo.vespa.config.server.RequestHandler; import com.yahoo.vespa.config.server.SuperModelRequestHandler; import com.yahoo.vespa.config.server.application.ApplicationSet; @@ -43,7 +44,6 @@ import com.yahoo.vespa.filedistribution.FileDownloader; import com.yahoo.vespa.filedistribution.FileReceiver; import com.yahoo.vespa.filedistribution.FileReferenceData; import com.yahoo.vespa.filedistribution.FileReferenceDownload; - import java.nio.ByteBuffer; import java.time.Duration; import java.util.Arrays; @@ -102,6 +102,7 @@ public class RpcServer implements Runnable, ConfigActivationListener, TenantList private final SuperModelRequestHandler superModelRequestHandler; private final MetricUpdater metrics; private final MetricUpdaterFactory metricUpdaterFactory; + private final HostLivenessTracker hostLivenessTracker; private final FileServer fileServer; private final RpcAuthorizer rpcAuthorizer; @@ -127,12 +128,13 @@ public class RpcServer implements Runnable, ConfigActivationListener, TenantList @Inject public RpcServer(ConfigserverConfig config, SuperModelRequestHandler superModelRequestHandler, MetricUpdaterFactory metrics, HostRegistry hostRegistry, - FileServer fileServer, RpcAuthorizer rpcAuthorizer, + HostLivenessTracker hostLivenessTracker, FileServer fileServer, RpcAuthorizer rpcAuthorizer, RpcRequestHandlerProvider handlerProvider) { this.superModelRequestHandler = superModelRequestHandler; metricUpdaterFactory = metrics; supervisor.setMaxOutputBufferSize(config.maxoutputbuffersize()); this.metrics = metrics.getOrCreateMetricUpdater(Collections.emptyMap()); + this.hostLivenessTracker = hostLivenessTracker; BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(config.maxgetconfigclients()); int rpcWorkerThreads = (config.numRpcThreads() == 0) ? threadsToUse() : config.numRpcThreads(); executorService = new ThreadPoolExecutor(rpcWorkerThreads, rpcWorkerThreads, @@ -611,4 +613,8 @@ public class RpcServer implements Runnable, ConfigActivationListener, TenantList req.returnValues().add(new Int32Value(0)); }); } + + HostLivenessTracker hostLivenessTracker() { + return hostLivenessTracker; + } } diff --git a/configserver/src/main/resources/configserver-app/services.xml b/configserver/src/main/resources/configserver-app/services.xml index b8397722b3d..650176829e6 100644 --- a/configserver/src/main/resources/configserver-app/services.xml +++ b/configserver/src/main/resources/configserver-app/services.xml @@ -30,6 +30,7 @@ <component id="com.yahoo.vespa.config.server.host.HostRegistry" bundle="configserver" /> <component id="com.yahoo.vespa.config.server.ApplicationRepository" bundle="configserver" /> <component id="com.yahoo.vespa.config.server.version.VersionState" bundle="configserver" /> + <component id="com.yahoo.vespa.config.server.host.ConfigRequestHostLivenessTracker" bundle="configserver" /> <component id="com.yahoo.config.provision.Zone" bundle="config-provisioning" /> <component id="com.yahoo.vespa.config.server.application.ConfigConvergenceChecker" bundle="configserver" /> <component id="com.yahoo.vespa.config.server.application.HttpProxy" bundle="configserver" /> diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/MockRpcServer.java b/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/MockRpcServer.java index 0f9ce9eff13..3272689473e 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/MockRpcServer.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/MockRpcServer.java @@ -7,6 +7,7 @@ import com.yahoo.vespa.config.protocol.ConfigResponse; import com.yahoo.vespa.config.protocol.JRTServerConfigRequest; import com.yahoo.vespa.config.server.GetConfigContext; import com.yahoo.vespa.config.server.filedistribution.FileServer; +import com.yahoo.vespa.config.server.host.ConfigRequestHostLivenessTracker; import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.monitoring.Metrics; import com.yahoo.vespa.config.server.rpc.security.NoopRpcAuthorizer; @@ -37,6 +38,7 @@ public class MockRpcServer extends RpcServer { null, Metrics.createTestMetrics(), new HostRegistry(), + new ConfigRequestHostLivenessTracker(), new FileServer(tempDir), new NoopRpcAuthorizer(), new RpcRequestHandlerProvider()); diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/RpcTester.java b/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/RpcTester.java index e5ed4e4673d..441f6c3a6ce 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/RpcTester.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/RpcTester.java @@ -3,6 +3,7 @@ package com.yahoo.vespa.config.server.rpc; import com.yahoo.cloud.config.ConfigserverConfig; import com.yahoo.config.provision.ApplicationId; +import com.yahoo.config.provision.HostLivenessTracker; import com.yahoo.config.provision.TenantName; import com.yahoo.config.provision.Zone; import com.yahoo.jrt.Request; @@ -20,6 +21,7 @@ import com.yahoo.vespa.config.server.SuperModelRequestHandler; import com.yahoo.vespa.config.server.TestConfigDefinitionRepo; import com.yahoo.vespa.config.server.application.OrchestratorMock; import com.yahoo.vespa.config.server.filedistribution.FileServer; +import com.yahoo.vespa.config.server.host.ConfigRequestHostLivenessTracker; import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.monitoring.Metrics; import com.yahoo.vespa.config.server.rpc.security.NoopRpcAuthorizer; @@ -49,6 +51,7 @@ public class RpcTester implements AutoCloseable { private final ManualClock clock = new ManualClock(Instant.ofEpochMilli(100)); private final String myHostname = HostName.getLocalhost(); + private final HostLivenessTracker hostLivenessTracker = new ConfigRequestHostLivenessTracker(clock); private final Spec spec; private final RpcServer rpcServer; @@ -92,6 +95,7 @@ public class RpcTester implements AutoCloseable { .withProvisioner(new MockProvisioner()) .withOrchestrator(new OrchestratorMock()) .build(); + assertFalse(hostLivenessTracker.lastRequestFrom(myHostname).isPresent()); } public void close() { @@ -118,6 +122,7 @@ public class RpcTester implements AutoCloseable { new InMemoryFlagSource())), Metrics.createTestMetrics(), hostRegistry, + hostLivenessTracker, new FileServer(temporaryFolder.newFolder()), new NoopRpcAuthorizer(), new RpcRequestHandlerProvider()); @@ -162,6 +167,8 @@ public class RpcTester implements AutoCloseable { void performRequest(Request req) { clock.advance(Duration.ofMillis(10)); sup.connect(spec).invokeSync(req, Duration.ofSeconds(10)); + if (req.methodName().equals(RpcServer.getConfigMethodName)) + assertEquals(clock.instant(), hostLivenessTracker.lastRequestFrom(myHostname).get()); } RpcServer rpcServer() { |