aboutsummaryrefslogtreecommitdiffstats
path: root/searchcore
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@oath.com>2018-11-22 12:36:54 +0100
committerHenning Baldersheim <balder@oath.com>2018-11-22 12:36:54 +0100
commit9f8dba6c69a2315f784f68a61ee3f4f7991232ee (patch)
tree8b157b147c9779c5a90b2c8c53818be9306d0bf2 /searchcore
parent0413b79cb22bf5c3d92c42be736170df3c75a5df (diff)
Allow faster converge on startup, by capping decay rate at queries issued so far.
Diffstat (limited to 'searchcore')
-rw-r--r--searchcore/src/tests/fdispatch/randomrow/randomrow_test.cpp13
-rw-r--r--searchcore/src/vespa/searchcore/fdispatch/search/rowstate.cpp6
-rw-r--r--searchcore/src/vespa/searchcore/fdispatch/search/rowstate.h16
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;
};
}