diff options
author | Henning Baldersheim <balder@oath.com> | 2018-07-17 17:51:28 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@oath.com> | 2018-07-17 17:51:28 +0200 |
commit | 8bff92aa93ec5caa7c5d2a9173ef1792cfd428f0 (patch) | |
tree | 300619f0097a242d0ab1abd28fed658fdbb043e8 /searchcore | |
parent | a22dbb93b39d20f52add81941ec1df9962d54b30 (diff) |
Prevent division by zero and large relative changes on very small numbers.
Diffstat (limited to 'searchcore')
-rw-r--r-- | searchcore/src/tests/proton/matching/matching_stats_test.cpp | 33 | ||||
-rw-r--r-- | searchcore/src/vespa/searchcore/proton/matching/matching_stats.cpp | 14 |
2 files changed, 43 insertions, 4 deletions
diff --git a/searchcore/src/tests/proton/matching/matching_stats_test.cpp b/searchcore/src/tests/proton/matching/matching_stats_test.cpp index 8b58a9e271c..26eaa127aa3 100644 --- a/searchcore/src/tests/proton/matching/matching_stats_test.cpp +++ b/searchcore/src/tests/proton/matching/matching_stats_test.cpp @@ -240,6 +240,39 @@ TEST("requireThatPartitionsAreAddedCorrectly") { EXPECT_EQUAL(1.0, all1.getPartition(1).wait_time_max()); } +TEST("requireThatSoftDoomIsSetAndAdded") { + MatchingStats stats; + MatchingStats stats2; + EXPECT_EQUAL(0ul, stats.softDoomed()); + EXPECT_EQUAL(0.5, stats.softDoomFactor()); + stats.softDoomFactor(0.7); + stats.softDoomed(3); + EXPECT_EQUAL(3ul, stats.softDoomed()); + EXPECT_EQUAL(0.7, stats.softDoomFactor()); + stats2.add(stats); + EXPECT_EQUAL(3ul, stats2.softDoomed()); + EXPECT_EQUAL(0.5, stats2.softDoomFactor()); // Not affected by add +} + +TEST("requireThatSoftDoomFacorIsComputedCorrectly") { + MatchingStats stats; + EXPECT_EQUAL(0ul, stats.softDoomed()); + EXPECT_EQUAL(0.5, stats.softDoomFactor()); + stats.softDoomed(1); + stats.updatesoftDoomFactor(1.0, 0.5, 2.0); + EXPECT_EQUAL(1ul, stats.softDoomed()); + EXPECT_EQUAL(0.47, stats.softDoomFactor()); + stats.updatesoftDoomFactor(1.0, 0.5, 2.0); + EXPECT_EQUAL(1ul, stats.softDoomed()); + EXPECT_EQUAL(0.44, stats.softDoomFactor()); + stats.updatesoftDoomFactor(0.0009, 0.5, 2.0); // hard limits less than 1ms should be ignored + EXPECT_EQUAL(1ul, stats.softDoomed()); + EXPECT_EQUAL(0.44, stats.softDoomFactor()); + stats.updatesoftDoomFactor(1.0, 0.0009, 2.0); // soft limits less than 1ms should be ignored + EXPECT_EQUAL(1ul, stats.softDoomed()); + EXPECT_EQUAL(0.44, stats.softDoomFactor()); +} + TEST_MAIN() { TEST_RUN_ALL(); } diff --git a/searchcore/src/vespa/searchcore/proton/matching/matching_stats.cpp b/searchcore/src/vespa/searchcore/proton/matching/matching_stats.cpp index 0bc1807d714..2b4660adc11 100644 --- a/searchcore/src/vespa/searchcore/proton/matching/matching_stats.cpp +++ b/searchcore/src/vespa/searchcore/proton/matching/matching_stats.cpp @@ -13,6 +13,8 @@ MatchingStats::Partition &get_writable_partition(std::vector<MatchingStats::Part return state[id]; } +constexpr double MIN_TIMEOUT = 0.001; + } // namespace proton::matching::<unnamed> MatchingStats::MatchingStats() @@ -62,6 +64,7 @@ MatchingStats::add(const MatchingStats &rhs) _docsReRanked += rhs._docsReRanked; _softDoomed += rhs.softDoomed(); + _queryCollateralTime.add(rhs._queryCollateralTime); _queryLatency.add(rhs._queryLatency); _matchTime.add(rhs._matchTime); @@ -75,10 +78,13 @@ MatchingStats::add(const MatchingStats &rhs) MatchingStats & MatchingStats::updatesoftDoomFactor(double hardLimit, double softLimit, double duration) { - if (duration < softLimit) { - _softDoomFactor += 0.01*(softLimit - duration)/hardLimit; - } else { - _softDoomFactor += 0.02*(softLimit - duration)/hardLimit; + if ((hardLimit >= MIN_TIMEOUT) && (softLimit >= MIN_TIMEOUT)) { + double diff = (softLimit - duration)/hardLimit; + if (duration < softLimit) { + _softDoomFactor += 0.01*diff; + } else { + _softDoomFactor += 0.02*diff; + } } return *this; } |