diff options
author | HÃ¥vard Pettersen <3535158+havardpe@users.noreply.github.com> | 2022-05-19 15:34:12 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-19 15:34:12 +0200 |
commit | 6b17cff027dea008650e0aca3716f907b2607642 (patch) | |
tree | e73a51ac927b19a1d7cbc1d49cea5d6b088511fc /searchlib | |
parent | 7a15fa697d8603e8980a09cde55b31f3be3b9df1 (diff) | |
parent | a8fdc5a3fc500b0383da9cc7be300dcab85a87cb (diff) |
Merge pull request #22669 from vespa-engine/havardpe/make-sample-count-atomic
make sample count atomic
Diffstat (limited to 'searchlib')
-rw-r--r-- | searchlib/src/vespa/searchlib/index/field_length_calculator.h | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/searchlib/src/vespa/searchlib/index/field_length_calculator.h b/searchlib/src/vespa/searchlib/index/field_length_calculator.h index 35a18b432f9..15d4c5ec285 100644 --- a/searchlib/src/vespa/searchlib/index/field_length_calculator.h +++ b/searchlib/src/vespa/searchlib/index/field_length_calculator.h @@ -15,7 +15,7 @@ namespace search::index { */ class FieldLengthCalculator { std::atomic<double> _average_field_length; - uint32_t _num_samples; // Capped by _max_num_samples + std::atomic<uint32_t> _num_samples; // Capped by _max_num_samples uint32_t _max_num_samples; public: @@ -39,7 +39,7 @@ public: } double get_average_field_length() const { return _average_field_length.load(std::memory_order_relaxed); } - uint32_t get_num_samples() const { return _num_samples; } + uint32_t get_num_samples() const { return _num_samples.load(std::memory_order_relaxed); } uint32_t get_max_num_samples() const { return _max_num_samples; } FieldLengthInfo get_info() const { @@ -47,10 +47,12 @@ public: } void add_field_length(uint32_t field_length) { - if (_num_samples < _max_num_samples) { - ++_num_samples; + auto num_samples = get_num_samples(); + if (num_samples < _max_num_samples) { + ++num_samples; + _num_samples.store(num_samples, std::memory_order_relaxed); } - _average_field_length.store((_average_field_length.load(std::memory_order_relaxed) * (_num_samples - 1) + field_length) / _num_samples, std::memory_order_relaxed); + _average_field_length.store((_average_field_length.load(std::memory_order_relaxed) * (num_samples - 1) + field_length) / num_samples, std::memory_order_relaxed); } }; |