diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2022-09-19 13:55:55 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2022-09-19 14:07:37 +0200 |
commit | 7d9ef2e10605f4af700a37a5c79a0a789fac527d (patch) | |
tree | 7f99d8adc579cc51cca5bd8160d786320a054b97 | |
parent | 2eeb7b8098d64290f3c08469457eaa76dd1bef05 (diff) |
Control whether to report coverage based on active or target active documents.
-rw-r--r-- | container-core/abi-spec.json | 2 | ||||
-rw-r--r-- | container-core/src/main/java/com/yahoo/container/handler/Coverage.java | 25 | ||||
-rw-r--r-- | container-core/src/main/java/com/yahoo/container/logging/Coverage.java | 12 | ||||
-rw-r--r-- | container-core/src/main/java/com/yahoo/container/logging/HitCounts.java | 5 | ||||
-rw-r--r-- | container-search/src/main/java/com/yahoo/search/dispatch/CoverageAggregator.java | 11 | ||||
-rw-r--r-- | container-search/src/main/java/com/yahoo/search/dispatch/InterleavedSearchInvoker.java | 2 | ||||
-rw-r--r-- | container-search/src/test/java/com/yahoo/search/result/CoverageTestCase.java (renamed from container-search/src/test/java/com/yahoo/search/result/test/CoverageTestCase.java) | 25 |
7 files changed, 54 insertions, 28 deletions
diff --git a/container-core/abi-spec.json b/container-core/abi-spec.json index 6e4fc74fdc6..e39391fa4a3 100644 --- a/container-core/abi-spec.json +++ b/container-core/abi-spec.json @@ -200,7 +200,6 @@ "public" ], "methods": [ - "protected void <init>()", "protected void <init>(long, long, int, int)", "public void <init>(long, int, boolean)", "protected void <init>(long, int, boolean, int)", @@ -220,6 +219,7 @@ "public int getFullResultSets()", "public int getResultSets()", "public int getResultPercentage()", + "public com.yahoo.container.handler.Coverage useTargetActiveForCoverageComputation(boolean)", "public com.yahoo.container.logging.Coverage toLoggingCoverage()" ], "fields": [ diff --git a/container-core/src/main/java/com/yahoo/container/handler/Coverage.java b/container-core/src/main/java/com/yahoo/container/handler/Coverage.java index 3f8d085af9e..fdcd225ddf5 100644 --- a/container-core/src/main/java/com/yahoo/container/handler/Coverage.java +++ b/container-core/src/main/java/com/yahoo/container/handler/Coverage.java @@ -1,6 +1,8 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.container.handler; +import com.yahoo.api.annotations.Beta; + /** * The coverage report for a result set. * @@ -9,6 +11,7 @@ package com.yahoo.container.handler; */ public class Coverage { + private boolean useTargetActiveForCoverageComputation = false; protected long docs; protected long active; protected long targetActive; @@ -29,11 +32,6 @@ public class Coverage { public final static int DEGRADED_BY_TIMEOUT = 2; public final static int DEGRADED_BY_ADAPTIVE_TIMEOUT = 4; - /** - * Build an invalid instance to initiate manually. - */ - protected Coverage() { } - protected Coverage(long docs, long active, int nodes, int resultSets) { this(docs, active, nodes, resultSets, FullCoverageDefinition.DOCUMENT_COUNT); } @@ -164,17 +162,28 @@ public class Coverage { if (getResultSets() == 0) { return 0; } - if (docs < active) { - return (int) Math.round(docs * 100.0d / active); + long total = useTargetActiveForCoverageComputation ? targetActive : active; + if (docs < total) { + return (int) Math.round(docs * 100.0d / total); } return getFullResultSets() * 100 / getResultSets(); } + /** + * Decides whether active or target active shall be used for coverage computation. + * DO NOT USE - This is only for temporary internal use. + */ + @Beta + public Coverage useTargetActiveForCoverageComputation(boolean value) { + useTargetActiveForCoverageComputation = value; + return this; + } + public com.yahoo.container.logging.Coverage toLoggingCoverage() { int degradation = com.yahoo.container.logging.Coverage.toDegradation(isDegradedByMatchPhase(), isDegradedByTimeout(), isDegradedByAdapativeTimeout()); - return new com.yahoo.container.logging.Coverage(getDocs(), getActive(), getTargetActive(), degradation); + return new com.yahoo.container.logging.Coverage(getDocs(), getActive(), getTargetActive(), degradation, useTargetActiveForCoverageComputation); } } diff --git a/container-core/src/main/java/com/yahoo/container/logging/Coverage.java b/container-core/src/main/java/com/yahoo/container/logging/Coverage.java index 98d685393dc..c016a203256 100644 --- a/container-core/src/main/java/com/yahoo/container/logging/Coverage.java +++ b/container-core/src/main/java/com/yahoo/container/logging/Coverage.java @@ -9,14 +9,19 @@ public class Coverage { private final long active; private final long targetActive; private final int degradedReason; + private final boolean useTargetActiveForCoverageComputation; private final static int DEGRADED_BY_MATCH_PHASE = 1; private final static int DEGRADED_BY_TIMEOUT = 2; private final static int DEGRADED_BY_ADAPTIVE_TIMEOUT = 4; - public Coverage(long docs, long active, long targetActive, int degradedReason) { + public Coverage(long docs, long active, long targetActive, int degradedReason, boolean useTargetActiveForCoverageComputation) { this.docs = docs; this.active = active; this.targetActive = targetActive; this.degradedReason = degradedReason; + this.useTargetActiveForCoverageComputation = useTargetActiveForCoverageComputation; + } + Coverage(long docs, long active, long targetActive, int degradedReason) { + this(docs, active, targetActive, degradedReason, true); } public long getDocs() { @@ -55,8 +60,9 @@ public class Coverage { * about had. */ public int getResultPercentage() { - if (docs < active) { - return (int) Math.round(docs * 100.0d / active); + long total = useTargetActiveForCoverageComputation ? targetActive : active; + if (docs < total) { + return (int) Math.round(docs * 100.0d / total); } return 100; } diff --git a/container-core/src/main/java/com/yahoo/container/logging/HitCounts.java b/container-core/src/main/java/com/yahoo/container/logging/HitCounts.java index c76382de584..b9f14be3ea6 100644 --- a/container-core/src/main/java/com/yahoo/container/logging/HitCounts.java +++ b/container-core/src/main/java/com/yahoo/container/logging/HitCounts.java @@ -18,11 +18,6 @@ public class HitCounts { private final int requestedOffset; private final Coverage coverage; - HitCounts(int retrievedHits, int summaryCount, long totalHitCount, int requestedHits, int requestedOffset) { - this(retrievedHits, summaryCount, totalHitCount, requestedHits, requestedOffset, - new Coverage(1,1,1,0)); - } - public HitCounts(int retrievedHits, int summaryCount, long totalHitCount, int requestedHits, int requestedOffset, Coverage coverage) { 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 877412d2e9b..35d0a1f3231 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 @@ -54,10 +54,11 @@ public class CoverageAggregator { this.failedNodes = failedNodes; } - public Coverage createCoverage(TimeoutHandler timeoutHandler) { + public Coverage createCoverage(TimeoutHandler timeoutHandler, boolean useTargetActiveForCoverageComputation) { Coverage coverage = new Coverage(answeredDocs, answeredActiveDocs, answeredNodesParticipated, 1); coverage.setNodesTried(askedNodes); coverage.setTargetActive(answeredTargetActiveDocs); + coverage.useTargetActiveForCoverageComputation(useTargetActiveForCoverageComputation); int degradedReason = 0; if (timedOut) { degradedReason |= timeoutHandler.reason(); @@ -82,11 +83,13 @@ public class CoverageAggregator { return clone; } else { if (askedAndFailed > answeredNodesParticipated) { - int missingNodes = notAnswered - (searchableCopies - 1); if (answeredNodesParticipated > 0) { CoverageAggregator clone = new CoverageAggregator(this); - clone.answeredActiveDocs += (missingNodes * answeredActiveDocs / answeredNodesParticipated); - clone.answeredTargetActiveDocs += (missingNodes * answeredTargetActiveDocs / answeredNodesParticipated); + int missingNodes = notAnswered - (searchableCopies - 1); + if (missingNodes > 0) { + clone.answeredActiveDocs += (missingNodes * answeredActiveDocs / answeredNodesParticipated); + clone.answeredTargetActiveDocs += (missingNodes * answeredTargetActiveDocs / answeredNodesParticipated); + } clone.timedOut = true; return clone; } 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 dcf9b56aa33..167d780918a 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 @@ -128,7 +128,7 @@ public class InterleavedSearchInvoker extends SearchInvoker implements ResponseM insertNetworkErrors(result.getResult()); CoverageAggregator adjusted = coverageAggregator.adjustedDegradedCoverage((int)searchCluster.dispatchConfig().searchableCopies(), timeoutHandler); - result.getResult().setCoverage(adjusted.createCoverage(timeoutHandler)); + result.getResult().setCoverage(adjusted.createCoverage(timeoutHandler, searchCluster.dispatchConfig().computeCoverageFromTargetActiveDocs())); int needed = query.getOffset() + query.getHits(); for (int index = query.getOffset(); (index < merged.size()) && (index < needed); index++) { diff --git a/container-search/src/test/java/com/yahoo/search/result/test/CoverageTestCase.java b/container-search/src/test/java/com/yahoo/search/result/CoverageTestCase.java index f59a7a94f0a..e2675b09307 100644 --- a/container-search/src/test/java/com/yahoo/search/result/test/CoverageTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/result/CoverageTestCase.java @@ -1,9 +1,8 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.search.result.test; +package com.yahoo.search.result; import com.yahoo.search.Query; import com.yahoo.search.Result; -import com.yahoo.search.result.Coverage; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -34,6 +33,17 @@ public class CoverageTestCase { } @Test + void testCoverageBasedOnActive() { + var c = new Coverage(8, 10).setTargetActive(16); + assertEquals(80, c.getResultPercentage()); + } + @Test + void testCoverageBasedOnTargetActive() { + var c = new Coverage(8, 10).setTargetActive(16).useTargetActiveForCoverageComputation(true); + assertEquals(50, c.getResultPercentage()); + } + + @Test void testDefaultCoverage() { boolean create = true; @@ -67,10 +77,7 @@ public class CoverageTestCase { assertEquals(1, federationSearcherResult.getCoverage(create).getResultSets()); } - @Test - void testCoverageConversion() { - Coverage c = new Coverage(6, 10); - c.setDegradedReason(7); + void verifyCoverageConversion(com.yahoo.container.handler.Coverage c) { com.yahoo.container.logging.Coverage lc = c.toLoggingCoverage(); assertEquals(lc.getDocs(), c.getDocs()); assertEquals(lc.getActive(), c.getActive()); @@ -83,4 +90,10 @@ public class CoverageTestCase { assertEquals(lc.isDegradedByTimeout(), c.isDegradedByTimeout()); } + @Test + void testCoverageConversion() { + verifyCoverageConversion(new Coverage(6, 10).setDegradedReason(7).setTargetActive(12).useTargetActiveForCoverageComputation(false)); + verifyCoverageConversion(new Coverage(6, 10).setDegradedReason(7).setTargetActive(12).useTargetActiveForCoverageComputation(true)); + } + } |