diff options
author | Henning Baldersheim <balder@oath.com> | 2018-11-22 12:36:54 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@oath.com> | 2018-11-22 12:36:54 +0100 |
commit | 9f8dba6c69a2315f784f68a61ee3f4f7991232ee (patch) | |
tree | 8b157b147c9779c5a90b2c8c53818be9306d0bf2 /searchcore | |
parent | 0413b79cb22bf5c3d92c42be736170df3c75a5df (diff) |
Allow faster converge on startup, by capping decay rate at queries issued so far.
Diffstat (limited to 'searchcore')
3 files changed, 23 insertions, 12 deletions
diff --git a/searchcore/src/tests/fdispatch/randomrow/randomrow_test.cpp b/searchcore/src/tests/fdispatch/randomrow/randomrow_test.cpp index 217e994980b..41db91035ed 100644 --- a/searchcore/src/tests/fdispatch/randomrow/randomrow_test.cpp +++ b/searchcore/src/tests/fdispatch/randomrow/randomrow_test.cpp @@ -16,18 +16,25 @@ TEST("requireThatEmpyStateReturnsRowZero") TEST("requireThatDecayWorks") { + constexpr double SMALL = 0.000001; 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_EQUAL(1.001, s.getRowState(0).getAverageSearchTime()); + EXPECT_APPROX(1.5, s.getRowState(0).getAverageSearchTime(), SMALL); s.updateSearchTime(2.0, 0); - EXPECT_APPROX(1.002, s.getRowState(0).getAverageSearchTime(), 0.0001); + EXPECT_APPROX(1.666667, 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.998396, s.getRowState(0).getAverageSearchTime(), 0.000001); + EXPECT_APPROX(0.771429, 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); } TEST("requireWeightedSelectionWorks") diff --git a/searchcore/src/vespa/searchcore/fdispatch/search/rowstate.cpp b/searchcore/src/vespa/searchcore/fdispatch/search/rowstate.cpp index c4b0319e6cb..73c0afe6bc6 100644 --- a/searchcore/src/vespa/searchcore/fdispatch/search/rowstate.cpp +++ b/searchcore/src/vespa/searchcore/fdispatch/search/rowstate.cpp @@ -6,10 +6,12 @@ namespace fdispatch { void RowState::updateSearchTime(double searchTime) { - _avgSearchTime = (searchTime + (_decayRate-1)*_avgSearchTime)/_decayRate; + _numQueries++; + double decayRate = std::max(1ul, std::min(_numQueries, _decayRate)); + _avgSearchTime = (searchTime + (decayRate-1)*_avgSearchTime)/decayRate; } -StateOfRows::StateOfRows(size_t numRows, double initialValue, double decayRate) : +StateOfRows::StateOfRows(size_t numRows, double initialValue, uint64_t decayRate) : _rows(numRows, RowState(initialValue, decayRate)), _sumActiveDocs(0), _invalidActiveDocsCounter(0) { diff --git a/searchcore/src/vespa/searchcore/fdispatch/search/rowstate.h b/searchcore/src/vespa/searchcore/fdispatch/search/rowstate.h index 07bc769cfdd..f8c05fe2707 100644 --- a/searchcore/src/vespa/searchcore/fdispatch/search/rowstate.h +++ b/searchcore/src/vespa/searchcore/fdispatch/search/rowstate.h @@ -15,10 +15,11 @@ namespace fdispatch { **/ class RowState { public: - RowState(double initialValue, double decayRate) : + RowState(double initialValue, uint64_t decayRate) : _avgSearchTime(initialValue), _decayRate(decayRate), - _sumActiveDocs(0) + _sumActiveDocs(0), + _numQueries(0) { } double getAverageSearchTime() const { return _avgSearchTime; } double getAverageSearchTimeInverse() const { return 1.0/_avgSearchTime; } @@ -30,9 +31,10 @@ public: _sumActiveDocs = tmp; } private: - double _avgSearchTime; - double _decayRate; + double _avgSearchTime; + uint64_t _decayRate; uint64_t _sumActiveDocs; + uint64_t _numQueries; }; /** @@ -43,7 +45,7 @@ private: **/ class StateOfRows { public: - StateOfRows(size_t numRows, double initial, double decayRate); + StateOfRows(size_t numRows, double initial, uint64_t decayRate); void updateSearchTime(double searchTime, uint32_t rowId); const RowState & getRowState(uint32_t rowId) const { return _rows[rowId]; } RowState & getRowState(uint32_t rowId) { return _rows[rowId]; } @@ -56,8 +58,8 @@ public: bool activeDocsValid() const { return _invalidActiveDocsCounter == 0; } private: std::vector<RowState> _rows; - uint64_t _sumActiveDocs; - size_t _invalidActiveDocsCounter; + uint64_t _sumActiveDocs; + size_t _invalidActiveDocsCounter; }; } |