aboutsummaryrefslogtreecommitdiffstats
path: root/staging_vespalib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-12-06 19:03:52 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2021-12-06 19:03:52 +0000
commit807a830319653ca32df389fdc61949dd3be922db (patch)
tree301c15168c303852b5cba097ed0f90c1e515d07d /staging_vespalib
parent7f71eddb09917cf59091236c7f1b0701c038d5f1 (diff)
Compute watermarkRatio once
Diffstat (limited to 'staging_vespalib')
-rw-r--r--staging_vespalib/src/vespa/vespalib/util/singleexecutor.cpp8
-rw-r--r--staging_vespalib/src/vespa/vespalib/util/singleexecutor.h1
2 files changed, 5 insertions, 4 deletions
diff --git a/staging_vespalib/src/vespa/vespalib/util/singleexecutor.cpp b/staging_vespalib/src/vespa/vespalib/util/singleexecutor.cpp
index ff46f58cb84..99791c36a9e 100644
--- a/staging_vespalib/src/vespa/vespalib/util/singleexecutor.cpp
+++ b/staging_vespalib/src/vespa/vespalib/util/singleexecutor.cpp
@@ -11,7 +11,8 @@ SingleExecutor::SingleExecutor(init_fun_t func, uint32_t taskLimit)
{ }
SingleExecutor::SingleExecutor(init_fun_t func, uint32_t taskLimit, uint32_t watermark, duration reactionTime)
- : _taskLimit(vespalib::roundUp2inN(taskLimit)),
+ : _watermarkRatio(watermark < taskLimit ? double(watermark) / taskLimit : 1.0),
+ _taskLimit(vespalib::roundUp2inN(taskLimit)),
_wantedTaskLimit(_taskLimit.load()),
_rp(0),
_tasks(std::make_unique<Task::UP[]>(_taskLimit)),
@@ -27,7 +28,7 @@ SingleExecutor::SingleExecutor(init_fun_t func, uint32_t taskLimit, uint32_t wat
_wakeupConsumerAt(0),
_producerNeedWakeupAt(0),
_wp(0),
- _watermark(std::min(_taskLimit.load(), (watermark*_taskLimit)/taskLimit)),
+ _watermark(_taskLimit.load()*_watermarkRatio),
_reactionTime(reactionTime),
_closed(false)
{
@@ -158,9 +159,8 @@ SingleExecutor::wait_for_room(Lock & lock) {
if (taskLimit != _wantedTaskLimit.load(std::memory_order_relaxed)) {
drain(lock);
_tasks = std::make_unique<Task::UP[]>(_wantedTaskLimit);
- double waterMarkRatio = double(get_watermark()) / _taskLimit.load(std::memory_order_relaxed);
_taskLimit = _wantedTaskLimit.load();
- _watermark = _taskLimit * waterMarkRatio;
+ _watermark = _taskLimit * _watermarkRatio;
}
_queueSize.add(numTasks());
while (numTasks() >= _taskLimit.load(std::memory_order_relaxed)) {
diff --git a/staging_vespalib/src/vespa/vespalib/util/singleexecutor.h b/staging_vespalib/src/vespa/vespalib/util/singleexecutor.h
index 9bc2f3ca837..e76e3f17a41 100644
--- a/staging_vespalib/src/vespa/vespalib/util/singleexecutor.h
+++ b/staging_vespalib/src/vespa/vespalib/util/singleexecutor.h
@@ -47,6 +47,7 @@ private:
uint64_t numTasks() const {
return _wp.load(std::memory_order_relaxed) - _rp.load(std::memory_order_acquire);
}
+ const double _watermarkRatio;
std::atomic<uint32_t> _taskLimit;
std::atomic<uint32_t> _wantedTaskLimit;
std::atomic<uint64_t> _rp;