summaryrefslogtreecommitdiffstats
path: root/container-search
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@oath.com>2018-11-30 06:11:31 -0800
committerGitHub <noreply@github.com>2018-11-30 06:11:31 -0800
commit2f4892f1ef2cee978e838677d23c4ae9b0ce0ef5 (patch)
tree37cc8765f40863658c6781d8baad2e2bbc9e1255 /container-search
parentc6bd76ac92e97f6273ebf70a7d93751198d66774 (diff)
parent292ecb59c961826006a642cd1989137f39bc620d (diff)
Merge pull request #7824 from vespa-engine/ollivir/adaptive-timeout-fixes
Fixes to adaptive timeout handling
Diffstat (limited to 'container-search')
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/fastsearch/FastSearcher.java43
-rw-r--r--container-search/src/main/java/com/yahoo/search/dispatch/InterleavedSearchInvoker.java2
-rw-r--r--container-search/src/main/java/com/yahoo/search/dispatch/SearchInvoker.java4
-rw-r--r--container-search/src/main/java/com/yahoo/search/result/Coverage.java10
4 files changed, 47 insertions, 12 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastSearcher.java b/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastSearcher.java
index 1a01fb8b116..4f4e812296a 100644
--- a/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastSearcher.java
+++ b/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastSearcher.java
@@ -274,17 +274,26 @@ public class FastSearcher extends VespaBackEndSearcher {
// federated query rules
Coverage finalCoverage = null;
+ long answeredActiveDocs = 0;
+ long answeredSoonActiveDocs = 0;
+
for (Result partialResult : results) {
+ Coverage coverage = partialResult.getCoverage(true);
+
+ if(partialResult.hits().getErrorHit() == null) {
+ answeredActiveDocs += coverage.getActive();
+ answeredSoonActiveDocs += coverage.getSoonActive();
+ }
if(finalCoverage == null) {
- finalCoverage = partialResult.getCoverage(true);
+ finalCoverage = coverage;
} else {
- finalCoverage.mergeWithPartition(partialResult.getCoverage(true));
+ finalCoverage.mergeWithPartition(coverage);
}
result.mergeWith(partialResult);
result.hits().addAll(partialResult.hits().asUnorderedHits());
}
if (finalCoverage != null) {
- adjustCoverageDegradedReason(finalCoverage);
+ adjustDegradedCoverage(finalCoverage, answeredActiveDocs, answeredSoonActiveDocs);
result.setCoverage(finalCoverage);
}
@@ -302,14 +311,28 @@ public class FastSearcher extends VespaBackEndSearcher {
return result;
}
- private void adjustCoverageDegradedReason(Coverage coverage) {
- int asked = coverage.getNodesTried();
+ private void adjustDegradedCoverage(Coverage coverage, long answeredActiveDocs, long answeredSoonActiveDocs) {
+ if (coverage.getFull()) {
+ return;
+ }
int answered = coverage.getNodes();
- if (asked > answered) {
- int searchableCopies = (int) dispatcher.searchCluster().dispatchConfig().searchableCopies();
- int missingNodes = (asked - answered) - (searchableCopies - 1);
- if (missingNodes > 0) {
- coverage.setDegradedReason(com.yahoo.container.handler.Coverage.DEGRADED_BY_TIMEOUT);
+ int asked = coverage.getNodesTried();
+ int notAnswered = asked - answered;
+
+ if (coverage.isDegradedByAdapativeTimeout()) {
+ long active = answeredActiveDocs + (notAnswered * answeredActiveDocs / answered);
+ long soonActive = answeredSoonActiveDocs + (notAnswered * answeredSoonActiveDocs / answered);
+ coverage.setActive(active).setSoonActive(soonActive);
+ } else {
+ if (asked > answered) {
+ int searchableCopies = (int) dispatcher.searchCluster().dispatchConfig().searchableCopies();
+ int missingNodes = notAnswered - (searchableCopies - 1);
+ if (missingNodes > 0) {
+ long active = answeredActiveDocs + (missingNodes * answeredActiveDocs / answered);
+ long soonActive = answeredSoonActiveDocs + (missingNodes * answeredSoonActiveDocs / answered);
+ coverage.setActive(active).setSoonActive(soonActive);
+ coverage.setDegradedReason(com.yahoo.container.handler.Coverage.DEGRADED_BY_TIMEOUT);
+ }
}
}
}
diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/InterleavedSearchInvoker.java b/container-search/src/main/java/com/yahoo/search/dispatch/InterleavedSearchInvoker.java
index 83647b332e6..19e1cb57ddf 100644
--- a/container-search/src/main/java/com/yahoo/search/dispatch/InterleavedSearchInvoker.java
+++ b/container-search/src/main/java/com/yahoo/search/dispatch/InterleavedSearchInvoker.java
@@ -134,7 +134,7 @@ public class InterleavedSearchInvoker extends SearchInvoker implements ResponseM
if (requests == responses || minimumCoverage >= 100.0) {
return query.getTimeLeft();
}
- int minimumResponses = (int) (requests * minimumCoverage / 100.0);
+ int minimumResponses = (int) Math.ceil(requests * minimumCoverage / 100.0);
if (responses < minimumResponses) {
return query.getTimeLeft();
diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/SearchInvoker.java b/container-search/src/main/java/com/yahoo/search/dispatch/SearchInvoker.java
index 2691b32d631..29e3efc6d84 100644
--- a/container-search/src/main/java/com/yahoo/search/dispatch/SearchInvoker.java
+++ b/container-search/src/main/java/com/yahoo/search/dispatch/SearchInvoker.java
@@ -56,7 +56,9 @@ public abstract class SearchInvoker extends CloseableInvoker {
protected Optional<Coverage> getErrorCoverage() {
if(node.isPresent()) {
- return Optional.of(new Coverage(0, node.get().getActiveDocuments(), 0));
+ Coverage error = new Coverage(0, node.get().getActiveDocuments(), 0);
+ error.setNodesTried(1);
+ return Optional.of(error);
} else {
return Optional.empty();
}
diff --git a/container-search/src/main/java/com/yahoo/search/result/Coverage.java b/container-search/src/main/java/com/yahoo/search/result/Coverage.java
index fe59bc9088a..c8c77e2b785 100644
--- a/container-search/src/main/java/com/yahoo/search/result/Coverage.java
+++ b/container-search/src/main/java/com/yahoo/search/result/Coverage.java
@@ -47,6 +47,16 @@ public class Coverage extends com.yahoo.container.handler.Coverage {
public Coverage setSoonActive(long soonActive) { this.soonActive = soonActive; return this; }
/**
+ * Will set number of documents present
+ *
+ * @param active Number of documents active
+ * @return self for chaining
+
+ */
+ @Beta
+ public Coverage setActive(long active) { this.active = active; return this; }
+
+ /**
* Will set the reasons for degraded coverage as reported by vespa backend.
*
* @param degradedReason Reason for degradation