From 5a520ceea79a6fb1fde3dfd87845383c5779defc Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Tue, 20 Sep 2022 07:19:35 +0200 Subject: Chose correct "redundancy" for coverage estimation. Current default is to use searchable-copies. But when we flip to use target-active directly from the backend we need to use redundancy. --- .../yahoo/search/dispatch/CoverageAggregator.java | 30 ++++++++++++---------- .../search/dispatch/InterleavedSearchInvoker.java | 6 ++++- 2 files changed, 21 insertions(+), 15 deletions(-) (limited to 'container-search/src') diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/CoverageAggregator.java b/container-search/src/main/java/com/yahoo/search/dispatch/CoverageAggregator.java index 35d0a1f3231..4e19c8a2e22 100644 --- a/container-search/src/main/java/com/yahoo/search/dispatch/CoverageAggregator.java +++ b/container-search/src/main/java/com/yahoo/search/dispatch/CoverageAggregator.java @@ -69,32 +69,34 @@ public class CoverageAggregator { coverage.setDegradedReason(degradedReason); return coverage; } - public CoverageAggregator adjustedDegradedCoverage(int searchableCopies, TimeoutHandler timeoutHandler) { + public CoverageAggregator adjustedDegradedCoverage(int redundancy, TimeoutHandler timeoutHandler) { int askedAndFailed = askedNodes + failedNodes; if (askedAndFailed == answeredNodesParticipated) { return this; } int notAnswered = askedAndFailed - answeredNodesParticipated; - if ((timeoutHandler.reason() == DEGRADED_BY_ADAPTIVE_TIMEOUT) && answeredNodesParticipated > 0) { + if (timeoutHandler.reason() == DEGRADED_BY_ADAPTIVE_TIMEOUT) { CoverageAggregator clone = new CoverageAggregator(this); - clone.answeredActiveDocs += (notAnswered * answeredActiveDocs / answeredNodesParticipated); - clone.answeredTargetActiveDocs += (notAnswered * answeredTargetActiveDocs / answeredNodesParticipated); - return clone; + return clone.adjustActiveDocs(notAnswered); } else { if (askedAndFailed > answeredNodesParticipated) { - if (answeredNodesParticipated > 0) { - CoverageAggregator clone = new CoverageAggregator(this); - int missingNodes = notAnswered - (searchableCopies - 1); - if (missingNodes > 0) { - clone.answeredActiveDocs += (missingNodes * answeredActiveDocs / answeredNodesParticipated); - clone.answeredTargetActiveDocs += (missingNodes * answeredTargetActiveDocs / answeredNodesParticipated); - } - clone.timedOut = true; - return clone; + CoverageAggregator clone = new CoverageAggregator(this); + int missingNodes = notAnswered - (redundancy - 1); + if (missingNodes > 0) { + clone.adjustActiveDocs(missingNodes); } + clone.timedOut = true; + return clone; } } return this; } + private CoverageAggregator adjustActiveDocs(int numMissingNodes) { + if (answeredNodesParticipated > 0) { + answeredActiveDocs += (numMissingNodes * answeredActiveDocs / answeredNodesParticipated); + answeredTargetActiveDocs += (numMissingNodes * answeredTargetActiveDocs / answeredNodesParticipated); + } + return this; + } } 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 167d780918a..2717b48839e 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 @@ -127,7 +127,7 @@ public class InterleavedSearchInvoker extends SearchInvoker implements ResponseM groupingResultAggregator.toAggregatedHit().ifPresent(h -> result.getResult().hits().add(h)); insertNetworkErrors(result.getResult()); - CoverageAggregator adjusted = coverageAggregator.adjustedDegradedCoverage((int)searchCluster.dispatchConfig().searchableCopies(), timeoutHandler); + CoverageAggregator adjusted = coverageAggregator.adjustedDegradedCoverage(redundancyForCoverage(searchCluster.dispatchConfig()), timeoutHandler); result.getResult().setCoverage(adjusted.createCoverage(timeoutHandler, searchCluster.dispatchConfig().computeCoverageFromTargetActiveDocs())); int needed = query.getOffset() + query.getHits(); @@ -138,6 +138,10 @@ public class InterleavedSearchInvoker extends SearchInvoker implements ResponseM return result; } + private int redundancyForCoverage(DispatchConfig config) { + return (int)(config.computeCoverageFromTargetActiveDocs() ? config.redundancy() : config.searchableCopies()); + } + private void insertNetworkErrors(Result result) { // Network errors will be reported as errors only when all nodes fail, otherwise they are just traced boolean asErrors = coverageAggregator.hasNoAnswers(); -- cgit v1.2.3