diff options
author | Haakon Dybdahl <dybdahl@yahoo-inc.com> | 2016-09-26 13:34:45 +0200 |
---|---|---|
committer | Haakon Dybdahl <dybdahl@yahoo-inc.com> | 2016-09-26 13:34:45 +0200 |
commit | 3f3eac749739ae2ae3070d2f94751f633ce8c2f8 (patch) | |
tree | ab28dd688ed0abaf3f8ec32056f1be1b0492d061 /vespa-http-client/src/main/java/com | |
parent | 6ae99ee49edc13bcdc6829ea085d5911b7985f17 (diff) |
Improve time-out handling for close call.
Diffstat (limited to 'vespa-http-client/src/main/java/com')
-rw-r--r-- | vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/api/FeedClientImpl.java | 36 |
1 files changed, 29 insertions, 7 deletions
diff --git a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/api/FeedClientImpl.java b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/api/FeedClientImpl.java index 64836ccb20d..e6ff8593e71 100644 --- a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/api/FeedClientImpl.java +++ b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/api/FeedClientImpl.java @@ -13,6 +13,7 @@ import java.nio.charset.CodingErrorAction; import java.nio.charset.StandardCharsets; import java.time.Instant; import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; /** * Implementation of FeedClient. It is a thin layer on top of multiClusterHandler and multiClusterResultAggregator. @@ -21,10 +22,13 @@ import java.util.concurrent.ScheduledThreadPoolExecutor; public class FeedClientImpl implements FeedClient { private final OperationProcessor operationProcessor; + private final long closeTimeoutMs; + private final long sleepTimeMs = 500; public FeedClientImpl( SessionParams sessionParams, ResultCallback resultCallback, ScheduledThreadPoolExecutor timeoutExecutor) { - + this.closeTimeoutMs = sessionParams.getFeedParams().getServerTimeout(TimeUnit.MILLISECONDS) + + sessionParams.getFeedParams().getClientTimeout(TimeUnit.MILLISECONDS); this.operationProcessor = new OperationProcessor( new IncompleteResultsThrottler( sessionParams.getThrottlerMinSize(), @@ -53,13 +57,15 @@ public class FeedClientImpl implements FeedClient { @Override public void close() { - Instant startTime = Instant.now(); - while (operationProcessor.getIncompleteResultQueueSize() > 0 && startTime.plusSeconds(30).isAfter(Instant.now())) { - try { - Thread.sleep(500); - } catch (InterruptedException e) { - break; + Instant lastResultReceived = Instant.now(); + long lastNumberOfResults = operationProcessor.getIncompleteResultQueueSize(); + + while (waitForOperations(lastResultReceived, lastNumberOfResults, sleepTimeMs, closeTimeoutMs)) { + long results = operationProcessor.getIncompleteResultQueueSize(); + if (results != lastNumberOfResults) { + lastResultReceived = Instant.now(); } + lastNumberOfResults = results; } operationProcessor.close(); } @@ -68,4 +74,20 @@ public class FeedClientImpl implements FeedClient { public String getStatsAsJson() { return operationProcessor.getStatsAsJson(); } + + // On return value true, wait more. Public for testing. + public static boolean waitForOperations(Instant lastResultReceived, long lastNumberOfResults, long sleepTimeMs, long closeTimeoutMs) { + if (lastNumberOfResults == 0) { + return false; + } + if (lastResultReceived.plusMillis(closeTimeoutMs).isBefore(Instant.now())) { + return false; + } + try { + Thread.sleep(sleepTimeMs); + } catch (InterruptedException e) { + return false; + } + return true; + } } |