summaryrefslogtreecommitdiffstats
path: root/searchcore
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@yahooinc.com>2022-04-27 14:08:06 +0000
committerHåvard Pettersen <havardpe@yahooinc.com>2022-04-27 14:12:24 +0000
commitd92ddc80ed694f63fdcf762f198ea0af071c138f (patch)
treec0f621a8d3da99e41736a1b881293df4bdb8aacb /searchcore
parent6af60e5fbd2ef841359f62f676aab94c19206fa3 (diff)
make soft doom factor atomic
also avoid actual value race by not assigning it to the initial value for a (very) short time each time stats are sampled.
Diffstat (limited to 'searchcore')
-rw-r--r--searchcore/src/vespa/searchcore/proton/matching/matcher.cpp3
-rw-r--r--searchcore/src/vespa/searchcore/proton/matching/matching_stats.cpp16
-rw-r--r--searchcore/src/vespa/searchcore/proton/matching/matching_stats.h10
3 files changed, 16 insertions, 13 deletions
diff --git a/searchcore/src/vespa/searchcore/proton/matching/matcher.cpp b/searchcore/src/vespa/searchcore/proton/matching/matcher.cpp
index 756af216988..381915f53d4 100644
--- a/searchcore/src/vespa/searchcore/proton/matching/matcher.cpp
+++ b/searchcore/src/vespa/searchcore/proton/matching/matcher.cpp
@@ -128,8 +128,7 @@ Matcher::getStats()
{
std::lock_guard<std::mutex> guard(_statsLock);
MatchingStats stats = std::move(_stats);
- _stats = MatchingStats();
- _stats.softDoomFactor(stats.softDoomFactor());
+ _stats = MatchingStats(stats.softDoomFactor());
return stats;
}
diff --git a/searchcore/src/vespa/searchcore/proton/matching/matching_stats.cpp b/searchcore/src/vespa/searchcore/proton/matching/matching_stats.cpp
index 2c826094ddf..bbb9dba9a30 100644
--- a/searchcore/src/vespa/searchcore/proton/matching/matching_stats.cpp
+++ b/searchcore/src/vespa/searchcore/proton/matching/matching_stats.cpp
@@ -19,7 +19,7 @@ constexpr double MAX_CHANGE_FACTOR = 5;
} // namespace proton::matching::<unnamed>
-MatchingStats::MatchingStats()
+MatchingStats::MatchingStats(double prev_soft_doom_factor)
: _queries(0),
_limited_queries(0),
_docidSpaceCovered(0),
@@ -28,7 +28,7 @@ MatchingStats::MatchingStats()
_docsReRanked(0),
_softDoomed(0),
_doomOvertime(),
- _softDoomFactor(INITIAL_SOFT_DOOM_FACTOR),
+ _softDoomFactor(prev_soft_doom_factor),
_queryCollateralTime(), // TODO: Remove in Vespa 8
_querySetupTime(),
_queryLatency(),
@@ -89,16 +89,18 @@ MatchingStats::updatesoftDoomFactor(vespalib::duration hardLimit, vespalib::dura
// It is merely a safety measure to avoid overflow on bad input as can happen with time senstive stuff
// in any soft real time system.
if ((hardLimit >= MIN_TIMEOUT) && (softLimit >= MIN_TIMEOUT)) {
+ double factor = softDoomFactor();
double diff = vespalib::to_s(softLimit - duration)/vespalib::to_s(hardLimit);
if (duration < softLimit) {
// Since softdoom factor can become very small, allow a minimum change of some size
- diff = std::min(diff, _softDoomFactor*MAX_CHANGE_FACTOR);
- _softDoomFactor += 0.01*diff;
+ diff = std::min(diff, factor*MAX_CHANGE_FACTOR);
+ factor += 0.01*diff;
} else {
- diff = std::max(diff, -_softDoomFactor*MAX_CHANGE_FACTOR);
- _softDoomFactor += 0.02*diff;
+ diff = std::max(diff, -factor*MAX_CHANGE_FACTOR);
+ factor += 0.02*diff;
}
- _softDoomFactor = std::max(_softDoomFactor, 0.01); // Never go below 1%
+ factor = std::max(factor, 0.01); // Never go below 1%
+ softDoomFactor(factor);
}
return *this;
}
diff --git a/searchcore/src/vespa/searchcore/proton/matching/matching_stats.h b/searchcore/src/vespa/searchcore/proton/matching/matching_stats.h
index 047c6fcaf13..eafa14870fa 100644
--- a/searchcore/src/vespa/searchcore/proton/matching/matching_stats.h
+++ b/searchcore/src/vespa/searchcore/proton/matching/matching_stats.h
@@ -5,6 +5,7 @@
#include <vector>
#include <cstddef>
#include <vespa/vespalib/util/time.h>
+#include <vespa/vespalib/datastore/atomic_value_wrapper.h>
namespace proton::matching {
@@ -124,7 +125,8 @@ private:
size_t _docsReRanked;
size_t _softDoomed;
Avg _doomOvertime;
- double _softDoomFactor;
+ using SoftDoomFactor = vespalib::datastore::AtomicValueWrapper<double>;
+ SoftDoomFactor _softDoomFactor;
Avg _queryCollateralTime; // TODO: Remove in Vespa 8
Avg _querySetupTime;
Avg _queryLatency;
@@ -139,7 +141,7 @@ public:
MatchingStats & operator = (const MatchingStats &) = delete;
MatchingStats(MatchingStats &&) = default;
MatchingStats & operator = (MatchingStats &&) = default;
- MatchingStats();
+ MatchingStats(double prev_soft_doom_factor = INITIAL_SOFT_DOOM_FACTOR);
~MatchingStats();
MatchingStats &queries(size_t value) { _queries = value; return *this; }
@@ -165,8 +167,8 @@ public:
vespalib::duration doomOvertime() const { return vespalib::from_s(_doomOvertime.max()); }
- MatchingStats &softDoomFactor(double value) { _softDoomFactor = value; return *this; }
- double softDoomFactor() const { return _softDoomFactor; }
+ MatchingStats &softDoomFactor(double value) { _softDoomFactor.store_relaxed(value); return *this; }
+ double softDoomFactor() const { return _softDoomFactor.load_relaxed(); }
MatchingStats &updatesoftDoomFactor(vespalib::duration hardLimit, vespalib::duration softLimit, vespalib::duration duration);
// TODO: Remove in Vespa 8