diff options
author | Jon Bratseth <bratseth@oath.com> | 2018-11-30 06:11:31 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-30 06:11:31 -0800 |
commit | 2f4892f1ef2cee978e838677d23c4ae9b0ce0ef5 (patch) | |
tree | 37cc8765f40863658c6781d8baad2e2bbc9e1255 /container-search | |
parent | c6bd76ac92e97f6273ebf70a7d93751198d66774 (diff) | |
parent | 292ecb59c961826006a642cd1989137f39bc620d (diff) |
Merge pull request #7824 from vespa-engine/ollivir/adaptive-timeout-fixes
Fixes to adaptive timeout handling
Diffstat (limited to 'container-search')
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 |