summaryrefslogtreecommitdiffstats
path: root/configserver
diff options
context:
space:
mode:
authorHarald Musum <musum@oath.com>2018-01-09 15:01:25 +0100
committerHarald Musum <musum@oath.com>2018-01-09 15:01:25 +0100
commit7a3f9c6f8818ea5f3763c71db649dd242fd325c3 (patch)
tree58237a2e0908b39011c7393b101ee44b767ec909 /configserver
parent31b6cc5bf35c5da06fa98a4496375e3a8b6fbeda (diff)
Timeout for file distribution status API
* Support timeout request parameter * Change default timeout to 5 seconds
Diffstat (limited to 'configserver')
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java4
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/application/FileDistributionStatus.java9
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/http/HttpHandler.java17
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionHandler.java18
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandler.java4
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/application/FileDistributionStatusTest.java15
6 files changed, 33 insertions, 34 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java
index 1181cbba7de..b3c136d33ae 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java
@@ -263,9 +263,9 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
hostProvisioner.ifPresent(provisioner -> provisioner.restart(applicationId, hostFilter));
}
- public HttpResponse filedistributionStatus(Tenant tenant, ApplicationId applicationId) {
+ public HttpResponse filedistributionStatus(Tenant tenant, ApplicationId applicationId, Duration timeout) {
Application application = getApplication(tenant, applicationId);
- return fileDistributionStatus.status(application);
+ return fileDistributionStatus.status(application, timeout);
}
public Tenant verifyTenantAndApplication(ApplicationId applicationId) {
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/application/FileDistributionStatus.java b/configserver/src/main/java/com/yahoo/vespa/config/server/application/FileDistributionStatus.java
index 67cce912395..0abc66e4761 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/application/FileDistributionStatus.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/application/FileDistributionStatus.java
@@ -12,6 +12,7 @@ import com.yahoo.jrt.Transport;
import com.yahoo.slime.Cursor;
import com.yahoo.vespa.config.server.http.JSONResponse;
+import java.time.Duration;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@@ -30,20 +31,20 @@ public class FileDistributionStatus extends AbstractComponent {
private final Supervisor supervisor = new Supervisor(new Transport());
- public StatusAllHosts status(Application application) {
+ public StatusAllHosts status(Application application, Duration timeout) {
List<HostStatus> hostStatuses = new ArrayList<>();
application.getModel().getHosts()
.forEach(host -> host.getServices()
.stream()
.filter(service -> "configproxy".equals(service.getServiceType()))
- .forEach(service -> hostStatuses.add(getHostStatus(service.getHostName(), getRpcPort(service)))));
+ .forEach(service -> hostStatuses.add(getHostStatus(service.getHostName(), getRpcPort(service), timeout))));
return createStatusForAllHosts(hostStatuses);
}
- HostStatus getHostStatus(String hostname, int port) {
+ HostStatus getHostStatus(String hostname, int port, Duration timeout) {
Target target = supervisor.connect(new Spec(hostname, port));
Request request = new Request("filedistribution.getActiveFileReferencesStatus");
- target.invokeSync(request, 1.0);
+ target.invokeSync(request, timeout.getSeconds());
HostStatus hostStatus = createHostStatusFromResponse(hostname, request);
target.close();
return hostStatus;
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/HttpHandler.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/HttpHandler.java
index e8db448b245..5208853dcde 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/HttpHandler.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/HttpHandler.java
@@ -1,13 +1,10 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.config.server.http;
-import com.google.inject.Inject;
-
import com.yahoo.config.provision.ApplicationLockException;
import com.yahoo.container.jdisc.HttpRequest;
import com.yahoo.container.jdisc.HttpResponse;
import com.yahoo.container.jdisc.LoggingRequestHandler;
-import com.yahoo.container.logging.AccessLog;
import com.yahoo.log.LogLevel;
import com.yahoo.config.provision.OutOfCapacityException;
import com.yahoo.vespa.config.server.ActivationConflictException;
@@ -15,7 +12,7 @@ import com.yahoo.yolean.Exceptions;
import java.io.PrintWriter;
import java.io.StringWriter;
-import java.util.concurrent.Executor;
+import java.time.Duration;
/**
* Super class for http handlers, that takes care of checking valid
@@ -23,7 +20,6 @@ import java.util.concurrent.Executor;
* implement the handleMETHOD methods that it supports.
*
* @author hmusum
- * @since 5.1.14
*/
public class HttpHandler extends LoggingRequestHandler {
@@ -71,6 +67,17 @@ public class HttpHandler extends LoggingRequestHandler {
}
}
+ protected static Duration getRequestTimeout(HttpRequest request, Duration defaultTimeout) {
+ if (!request.hasProperty("timeout")) {
+ return defaultTimeout;
+ }
+ try {
+ return Duration.ofSeconds((long) Double.parseDouble(request.getProperty("timeout")));
+ } catch (Exception e) {
+ return defaultTimeout;
+ }
+ }
+
private String getMessage(Exception e, HttpRequest request) {
if (request.getBooleanProperty("debug")) {
StringWriter sw = new StringWriter();
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionHandler.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionHandler.java
index 5acb6e81a83..4f7548d82ce 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionHandler.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionHandler.java
@@ -1,11 +1,8 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.config.server.http;
-import com.google.inject.Inject;
-
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.container.jdisc.HttpRequest;
-import com.yahoo.container.logging.AccessLog;
import com.yahoo.jdisc.application.BindingMatch;
import com.yahoo.slime.Slime;
import com.yahoo.vespa.config.server.ApplicationRepository;
@@ -14,8 +11,6 @@ import com.yahoo.vespa.config.server.TimeoutBudget;
import java.time.Clock;
import java.time.Duration;
-import java.util.concurrent.Executor;
-
/**
* Super class for session handlers, that takes care of checking valid
@@ -23,7 +18,6 @@ import java.util.concurrent.Executor;
* implement the handleMETHOD methods that it supports.
*
* @author hmusum
- * @since 5.1.14
*/
public class SessionHandler extends HttpHandler {
@@ -74,18 +68,6 @@ public class SessionHandler extends HttpHandler {
return new TimeoutBudget(Clock.systemUTC(), getRequestTimeout(request, defaultTimeout));
}
-
- protected static Duration getRequestTimeout(HttpRequest request, Duration defaultTimeout) {
- if (!request.hasProperty("timeout")) {
- return defaultTimeout;
- }
- try {
- return Duration.ofSeconds((long) Double.parseDouble(request.getProperty("timeout")));
- } catch (Exception e) {
- return defaultTimeout;
- }
- }
-
public static DeployHandlerLogger createLogger(Slime deployLog, HttpRequest request, ApplicationId app) {
return createLogger(deployLog, request.getBooleanProperty("verbose"), app);
}
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandler.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandler.java
index 876966c6550..7be7bfb47e1 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandler.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandler.java
@@ -26,6 +26,7 @@ import com.yahoo.vespa.config.server.tenant.Tenant;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
+import java.time.Duration;
/**
* Operations on applications (delete, wait for config convergence, restart, application content etc.)
@@ -93,7 +94,8 @@ public class ApplicationHandler extends HttpHandler {
}
if (isFiledistributionStatusRequest(request)) {
- return applicationRepository.filedistributionStatus(tenant, applicationId);
+ Duration timeout = HttpHandler.getRequestTimeout(request, Duration.ofSeconds(5));
+ return applicationRepository.filedistributionStatus(tenant, applicationId, timeout);
}
return new GetApplicationResponse(Response.Status.OK, applicationRepository.getApplicationGeneration(tenant, applicationId));
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/application/FileDistributionStatusTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/application/FileDistributionStatusTest.java
index 35a86ad4757..c78f4fe1b3a 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/application/FileDistributionStatusTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/application/FileDistributionStatusTest.java
@@ -16,6 +16,7 @@ import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import java.io.IOException;
+import java.time.Duration;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
@@ -34,6 +35,8 @@ import static com.yahoo.vespa.config.server.application.FileDistributionStatus.S
*/
public class FileDistributionStatusTest {
+ private final Duration timeout = Duration.ofMillis(100);
+
private TenantName tenant = TenantName.from("mytenant");
private ApplicationId appId = ApplicationId.from(tenant, ApplicationName.from("myapp"), InstanceName.from("myinstance"));
private Application application;
@@ -48,7 +51,7 @@ public class FileDistributionStatusTest {
FileDistributionStatus status = new MockStatus(statusFinished("localhost", Status.FINISHED, fileReferenceStatuses));
application = createApplication("localhost");
- HttpResponse response = status.status(application);
+ HttpResponse response = getStatus(status, application);
assertResponse(200,
"{" +
"\"hosts\":[" +
@@ -68,7 +71,7 @@ public class FileDistributionStatusTest {
FileDistributionStatus status = new MockStatus(statusWithError("localhost2", Status.IN_PROGRESS, fileReferenceStatuses, ""));
application = createApplication("localhost2");
- HttpResponse response = status.status(application);
+ HttpResponse response = getStatus(status, application);
assertResponse(200,
"{" +
"\"hosts\":[" +
@@ -97,7 +100,7 @@ public class FileDistributionStatusTest {
FileDistributionStatus status = new MockStatus(new HashSet<>(Arrays.asList(localhost, localhost2)));
application = createApplication("localhost", "localhost2");
- HttpResponse response = status.status(application);
+ HttpResponse response = getStatus(status, application);
assertResponse(200,
"{" +
"\"hosts\":[" +
@@ -140,6 +143,10 @@ public class FileDistributionStatusTest {
return new Application(mockModel, new ServerCache(), 3, Version.fromIntValues(0, 0, 0), MetricUpdater.createTestUpdater(), appId);
}
+ HttpResponse getStatus(FileDistributionStatus fileDistributionStatus, Application application) {
+ return fileDistributionStatus.status(application, timeout);
+ }
+
private static class MockStatus extends FileDistributionStatus {
private final Map<String, HostStatus> statuses = new HashMap<>();
@@ -155,7 +162,7 @@ public class FileDistributionStatusTest {
}
@Override
- HostStatus getHostStatus(String hostname, int port) {
+ HostStatus getHostStatus(String hostname, int port, Duration timeout) {
return statuses.get(hostname);
}
}