diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2018-11-29 15:20:47 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-29 15:20:47 +0100 |
commit | fcd87bca84996778d3362106e79ce03156f94377 (patch) | |
tree | a7b50182f923ecc0c4c0bda7ae979374461da3bf | |
parent | 76d87f828dc780a72b102a821e358b9227ab147a (diff) | |
parent | 7eab757f92fa688b4560b4eb085c0a5fb624c5ea (diff) |
Merge pull request #7813 from vespa-engine/balder/investigate-adaptive-distribution
Prevent bad effects of zero search time.
4 files changed, 23 insertions, 13 deletions
diff --git a/searchcore/src/tests/fdispatch/randomrow/randomrow_test.cpp b/searchcore/src/tests/fdispatch/randomrow/randomrow_test.cpp index 41db91035ed..c6791436bff 100644 --- a/searchcore/src/tests/fdispatch/randomrow/randomrow_test.cpp +++ b/searchcore/src/tests/fdispatch/randomrow/randomrow_test.cpp @@ -16,25 +16,29 @@ TEST("requireThatEmpyStateReturnsRowZero") TEST("requireThatDecayWorks") { - constexpr double SMALL = 0.000001; + constexpr double SMALL = 0.00001; StateOfRows s(1, 1.0, 1000); s.updateSearchTime(1.0, 0); EXPECT_EQUAL(1.0, s.getRowState(0).getAverageSearchTime()); s.updateSearchTime(2.0, 0); - EXPECT_APPROX(1.5, s.getRowState(0).getAverageSearchTime(), SMALL); + EXPECT_APPROX(1.02326, s.getRowState(0).getAverageSearchTime(), SMALL); s.updateSearchTime(2.0, 0); - EXPECT_APPROX(1.666667, s.getRowState(0).getAverageSearchTime(), SMALL); + EXPECT_APPROX(1.04545, s.getRowState(0).getAverageSearchTime(), SMALL); s.updateSearchTime(0.1, 0); s.updateSearchTime(0.1, 0); s.updateSearchTime(0.1, 0); s.updateSearchTime(0.1, 0); - EXPECT_APPROX(0.771429, s.getRowState(0).getAverageSearchTime(), SMALL); + EXPECT_APPROX(0.966667, s.getRowState(0).getAverageSearchTime(), SMALL); for (size_t i(0); i < 10000; i++) { s.updateSearchTime(1.0, 0); } EXPECT_APPROX(1.0, s.getRowState(0).getAverageSearchTime(), SMALL); s.updateSearchTime(0.1, 0); EXPECT_APPROX(0.9991, s.getRowState(0).getAverageSearchTime(), SMALL); + for (size_t i(0); i < 10000; i++) { + s.updateSearchTime(0.0, 0); + } + EXPECT_APPROX(0.001045, s.getRowState(0).getAverageSearchTime(), SMALL); } TEST("requireWeightedSelectionWorks") diff --git a/searchcore/src/vespa/searchcore/fdispatch/search/plain_dataset.cpp b/searchcore/src/vespa/searchcore/fdispatch/search/plain_dataset.cpp index 4e1bc62b790..cd68b208ff4 100644 --- a/searchcore/src/vespa/searchcore/fdispatch/search/plain_dataset.cpp +++ b/searchcore/src/vespa/searchcore/fdispatch/search/plain_dataset.cpp @@ -195,7 +195,7 @@ FastS_PlainDataSet::FastS_PlainDataSet(FastS_AppContext *appCtx, FastS_DataSetDesc *desc) : FastS_DataSetBase(appCtx, desc), _partMap(desc), - _stateOfRows(_partMap.getNumRows(), 0.010, desc->GetQueryDistributionMode().getLatencyDecayRate()), + _stateOfRows(_partMap.getNumRows(), 0.001, desc->GetQueryDistributionMode().getLatencyDecayRate()), _MHPN_log(), _slowQueryLimitFactor(desc->GetSlowQueryLimitFactor()), _slowQueryLimitBias(desc->GetSlowQueryLimitBias()), diff --git a/searchcore/src/vespa/searchcore/fdispatch/search/rowstate.cpp b/searchcore/src/vespa/searchcore/fdispatch/search/rowstate.cpp index b0ca9f3463b..b11d9aeac53 100644 --- a/searchcore/src/vespa/searchcore/fdispatch/search/rowstate.cpp +++ b/searchcore/src/vespa/searchcore/fdispatch/search/rowstate.cpp @@ -4,11 +4,22 @@ namespace fdispatch { +constexpr uint64_t MIN_DECAY_RATE = 42; +constexpr double MIN_QUERY_TIME = 0.001; + +RowState::RowState(double initialValue, uint64_t decayRate) : + _decayRate(std::max(decayRate, MIN_DECAY_RATE)), + _avgSearchTime(std::max(initialValue, MIN_QUERY_TIME)), + _sumActiveDocs(0), + _numQueries(0) +{ } + void RowState::updateSearchTime(double searchTime) { - _numQueries++; - double decayRate = std::min(_numQueries, _decayRate); + searchTime = std::max(searchTime, MIN_QUERY_TIME); + double decayRate = std::min(_numQueries + MIN_DECAY_RATE, _decayRate); _avgSearchTime = (searchTime + (decayRate-1)*_avgSearchTime)/decayRate; + ++_numQueries; } StateOfRows::StateOfRows(size_t numRows, double initialValue, uint64_t decayRate) : diff --git a/searchcore/src/vespa/searchcore/fdispatch/search/rowstate.h b/searchcore/src/vespa/searchcore/fdispatch/search/rowstate.h index 00bf7f1bd91..92268a291bb 100644 --- a/searchcore/src/vespa/searchcore/fdispatch/search/rowstate.h +++ b/searchcore/src/vespa/searchcore/fdispatch/search/rowstate.h @@ -15,12 +15,7 @@ namespace fdispatch { **/ class RowState { public: - RowState(double initialValue, uint64_t decayRate) : - _decayRate(std::max(1ul, decayRate)), - _avgSearchTime(initialValue), - _sumActiveDocs(0), - _numQueries(0) - { } + RowState(double initialValue, uint64_t decayRate); double getAverageSearchTime() const { return _avgSearchTime; } double getAverageSearchTimeInverse() const { return 1.0/_avgSearchTime; } void updateSearchTime(double searchTime); |