summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2022-09-19 13:55:55 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2022-09-19 14:07:37 +0200
commit7d9ef2e10605f4af700a37a5c79a0a789fac527d (patch)
tree7f99d8adc579cc51cca5bd8160d786320a054b97
parent2eeb7b8098d64290f3c08469457eaa76dd1bef05 (diff)
Control whether to report coverage based on active or target active documents.
-rw-r--r--container-core/abi-spec.json2
-rw-r--r--container-core/src/main/java/com/yahoo/container/handler/Coverage.java25
-rw-r--r--container-core/src/main/java/com/yahoo/container/logging/Coverage.java12
-rw-r--r--container-core/src/main/java/com/yahoo/container/logging/HitCounts.java5
-rw-r--r--container-search/src/main/java/com/yahoo/search/dispatch/CoverageAggregator.java11
-rw-r--r--container-search/src/main/java/com/yahoo/search/dispatch/InterleavedSearchInvoker.java2
-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));
+ }
+
}