diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2018-11-05 11:49:42 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-05 11:49:42 +0100 |
commit | e5d0e505d22f728ff97da039c6eceb5860147511 (patch) | |
tree | 28a67abf05c25111ef47b508281f1c11ea2815b5 | |
parent | bc8fa8416508d32c6aba6d8294f9ac10bd9f4eca (diff) | |
parent | 2ab2e7b2023bcb54107cce436336395d87f512ef (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.
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; |