summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2018-11-05 11:49:42 +0100
committerGitHub <noreply@github.com>2018-11-05 11:49:42 +0100
commite5d0e505d22f728ff97da039c6eceb5860147511 (patch)
tree28a67abf05c25111ef47b508281f1c11ea2815b5
parentbc8fa8416508d32c6aba6d8294f9ac10bd9f4eca (diff)
parent2ab2e7b2023bcb54107cce436336395d87f512ef (diff)
Merge pull request #7558 from vespa-engine/balder/set-adaptive-timeout-reason
Set adaptive-timeout as reason for coverage loss if it has any.
-rw-r--r--searchcore/src/vespa/searchcore/fdispatch/search/fnet_search.cpp27
-rw-r--r--searchcore/src/vespa/searchcore/fdispatch/search/fnet_search.h1
-rw-r--r--searchlib/src/vespa/searchlib/engine/searchreply.h2
3 files changed, 22 insertions, 8 deletions
diff --git a/searchcore/src/vespa/searchcore/fdispatch/search/fnet_search.cpp b/searchcore/src/vespa/searchcore/fdispatch/search/fnet_search.cpp
index 577d6e7edf5..16308ed22f9 100644
--- a/searchcore/src/vespa/searchcore/fdispatch/search/fnet_search.cpp
+++ b/searchcore/src/vespa/searchcore/fdispatch/search/fnet_search.cpp
@@ -6,6 +6,7 @@
#include "fnet_search.h"
#include "mergehits.h"
#include <vespa/searchlib/engine/packetconverter.h>
+#include <vespa/searchlib/engine/searchreply.h>
#include <vespa/vespalib/util/stringfmt.h>
#include <vespa/vespalib/xxhash/xxhash.h>
@@ -870,6 +871,7 @@ FastS_FNET_Search::CheckCoverage()
uint16_t nodesQueried = 0;
uint16_t nodesReplied = 0;
size_t cntNone(0);
+ size_t askedButNotAnswered(0);
for (const FastS_FNET_SearchNode & node : _nodes) {
if (node._qresult != nullptr) {
@@ -882,14 +884,21 @@ FastS_FNET_Search::CheckCoverage()
} else {
nodesQueried++;
cntNone++;
+ if (node.IsConnected()) {
+ askedButNotAnswered++;
+ }
}
}
+ bool missingReplies = (askedButNotAnswered != 0) || (nodesQueried != nodesReplied);
const ssize_t missingParts = cntNone - (_dataset->getSearchableCopies() - 1);
- if ((missingParts > 0) && (cntNone != _nodes.size())) {
+ if (((missingParts > 0) && (cntNone != _nodes.size())) || (missingReplies && useAdaptiveTimeout())) {
// TODO This is a dirty way of anticipating missing coverage.
// It should be done differently
activeDocs += missingParts * activeDocs/(_nodes.size() - cntNone);
}
+ if (missingReplies && useAdaptiveTimeout()) {
+ degradedReason |= search::engine::SearchReply::Coverage::ADAPTIVE_TIMEOUT;
+ }
_util.SetCoverage(covDocs, activeDocs, soonActiveDocs, degradedReason, nodesQueried, nodesReplied);
}
@@ -1446,22 +1455,26 @@ FastS_FNET_Search::ProcessDocsumsDone()
return RET_OK;
}
+bool
+FastS_FNET_Search::useAdaptiveTimeout() const {
+ return _dataset->getMinimalSearchCoverage() < 100.0;
+}
void
FastS_FNET_Search::adjustQueryTimeout()
{
uint32_t pendingQueries = getPendingQueries();
- if (pendingQueries == 0 || _util.IsQueryFlagSet(search::fs4transport::QFLAG_DUMP_FEATURES)) {
+ if ((pendingQueries == 0) ||
+ _util.IsQueryFlagSet(search::fs4transport::QFLAG_DUMP_FEATURES) ||
+ ! useAdaptiveTimeout())
+ {
return;
}
double mincoverage = _dataset->getMinimalSearchCoverage();
- uint32_t wantedAnswers = getRequestedQueries();
- if (mincoverage < 100.0) {
- wantedAnswers *= mincoverage / 100.0;
- LOG(spam, "Adjusting wanted answers from %u to %u", getRequestedQueries(), wantedAnswers);
- }
+ uint32_t wantedAnswers = getRequestedQueries() * mincoverage / 100.0;
+ LOG(spam, "Adjusting wanted answers from %u to %u", getRequestedQueries(), wantedAnswers);
if (getDoneQueries() < wantedAnswers) {
return;
}
diff --git a/searchcore/src/vespa/searchcore/fdispatch/search/fnet_search.h b/searchcore/src/vespa/searchcore/fdispatch/search/fnet_search.h
index 0ad9a7f0067..81e84e92bbd 100644
--- a/searchcore/src/vespa/searchcore/fdispatch/search/fnet_search.h
+++ b/searchcore/src/vespa/searchcore/fdispatch/search/fnet_search.h
@@ -328,6 +328,7 @@ public:
char *ST_GetSortData() { return _util.GetSortData(); }
FastS_QueryResult *ST_GetQueryResult() { return _util.GetQueryResult(); }
+ bool useAdaptiveTimeout() const;
void adjustQueryTimeout();
void adjustDocsumTimeout();
uint32_t getRequestedQueries() const { return _queryNodes; }
diff --git a/searchlib/src/vespa/searchlib/engine/searchreply.h b/searchlib/src/vespa/searchlib/engine/searchreply.h
index 9135866a7f7..40dca8a1c46 100644
--- a/searchlib/src/vespa/searchlib/engine/searchreply.h
+++ b/searchlib/src/vespa/searchlib/engine/searchreply.h
@@ -53,8 +53,8 @@ public:
Coverage & degradeMatchPhase() { _degradeReason |= MATCH_PHASE; return *this; }
Coverage & degradeTimeout() { _degradeReason |= TIMEOUT; return *this; }
Coverage & degradeAdaptiveTimeout() { _degradeReason |= ADAPTIVE_TIMEOUT; return *this; }
- private:
enum DegradeReason {MATCH_PHASE=0x01, TIMEOUT=0x02, ADAPTIVE_TIMEOUT=0x04};
+ private:
uint64_t _covered;
uint64_t _active;
uint64_t _soonActive;