summaryrefslogtreecommitdiffstats
path: root/searchcore
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@oath.com>2018-11-29 14:21:00 +0100
committerHenning Baldersheim <balder@oath.com>2018-11-29 14:21:00 +0100
commit7eab757f92fa688b4560b4eb085c0a5fb624c5ea (patch)
treeccae2e6c09f816fb76a4f8a032abf8f8d6e9b3c3 /searchcore
parentc1fc295f963cf7e9a117dac9d0dabf7151ec0c1b (diff)
Prevent bad effects of zero search time.
Diffstat (limited to 'searchcore')
-rw-r--r--searchcore/src/tests/fdispatch/randomrow/randomrow_test.cpp12
-rw-r--r--searchcore/src/vespa/searchcore/fdispatch/search/plain_dataset.cpp2
-rw-r--r--searchcore/src/vespa/searchcore/fdispatch/search/rowstate.cpp15
-rw-r--r--searchcore/src/vespa/searchcore/fdispatch/search/rowstate.h7
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);