diff options
author | Geir Storli <geirst@verizonmedia.com> | 2020-05-18 14:26:59 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-18 14:26:59 +0200 |
commit | b081282192342f0a88e422b7aec945df279de644 (patch) | |
tree | 4989f4bd6c3d1841097ce5c25896e26d7953cb4b | |
parent | 0270bb41a17f9d761db44520245ef54c9af77425 (diff) | |
parent | 4868e26a14d3e49b5a165492148c7956df9c9d43 (diff) |
Merge pull request #13279 from vespa-engine/toregge/sort-initializer-tasks
Run initializer task with highest transient memory usage first.
5 files changed, 39 insertions, 2 deletions
diff --git a/searchcore/src/tests/proton/initializer/task_runner_test.cpp b/searchcore/src/tests/proton/initializer/task_runner_test.cpp index 0363da8d083..f351b25cfca 100644 --- a/searchcore/src/tests/proton/initializer/task_runner_test.cpp +++ b/searchcore/src/tests/proton/initializer/task_runner_test.cpp @@ -36,14 +36,17 @@ class NamedTask : public InitializerTask protected: vespalib::string _name; TestLog &_log; + size_t _transient_memory_usage; public: - NamedTask(const vespalib::string &name, TestLog &log) + NamedTask(const vespalib::string &name, TestLog &log, size_t transient_memory_usage = 0) : _name(name), - _log(log) + _log(log), + _transient_memory_usage(transient_memory_usage) { } virtual void run() override { _log.append(_name); } + size_t get_transient_memory_usage() const override { return _transient_memory_usage; } }; @@ -79,6 +82,22 @@ struct TestJob { B->addDependency(D); return TestJob(std::move(log), std::move(C)); } + + static TestJob setupResourceUsingTasks() + { + auto log = std::make_unique<TestLog>(); + auto task_a = std::make_shared<NamedTask>("A", *log, 0); + auto task_b = std::make_shared<NamedTask>("B", *log, 10); + auto task_c = std::make_shared<NamedTask>("C", *log, 2); + auto task_d = std::make_shared<NamedTask>("D", *log, 5); + auto task_e = std::make_shared<NamedTask>("E", *log, 0); + task_e->addDependency(task_a); + task_e->addDependency(task_b); + task_e->addDependency(task_c); + task_e->addDependency(task_d); + return TestJob(std::move(log), std::move(task_e)); + } + }; TestJob::TestJob(TestLog::UP log, InitializerTask::SP root) @@ -138,6 +157,13 @@ TEST_F("multiple threads, dag graph", Fixture(10)) LOG(info, "dabc=%d, dbac=%d", dabc_count, dbac_count); } +TEST_F("single thread with resource using tasks", Fixture(1)) +{ + auto job = TestJob::setupResourceUsingTasks(); + f.run(job._root); + EXPECT_EQUAL("BDCAE", job._log->result()); +} + TEST_MAIN() { TEST_RUN_ALL(); diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_manager_initializer.cpp b/searchcore/src/vespa/searchcore/proton/attribute/attribute_manager_initializer.cpp index 435cd479305..9198cfdafab 100644 --- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_manager_initializer.cpp +++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_manager_initializer.cpp @@ -42,6 +42,9 @@ public: _result.add(result); } } + size_t get_transient_memory_usage() const override { + return _initializer->get_transient_memory_usage(); + } }; class AttributeManagerInitializerTask : public vespalib::Executor::Task diff --git a/searchcore/src/vespa/searchcore/proton/initializer/initializer_task.cpp b/searchcore/src/vespa/searchcore/proton/initializer/initializer_task.cpp index 4f14f709d29..ff423a2c9ef 100644 --- a/searchcore/src/vespa/searchcore/proton/initializer/initializer_task.cpp +++ b/searchcore/src/vespa/searchcore/proton/initializer/initializer_task.cpp @@ -18,4 +18,10 @@ InitializerTask::addDependency(SP dependency) _dependencies.emplace_back(std::move(dependency)); } +size_t +InitializerTask::get_transient_memory_usage() const +{ + return 0u; +} + } diff --git a/searchcore/src/vespa/searchcore/proton/initializer/initializer_task.h b/searchcore/src/vespa/searchcore/proton/initializer/initializer_task.h index ecf98b86fc4..669a55844d6 100644 --- a/searchcore/src/vespa/searchcore/proton/initializer/initializer_task.h +++ b/searchcore/src/vespa/searchcore/proton/initializer/initializer_task.h @@ -31,6 +31,7 @@ public: void setDone() { _state = State::DONE; } void addDependency(SP dependency); virtual void run() = 0; + virtual size_t get_transient_memory_usage() const; }; } diff --git a/searchcore/src/vespa/searchcore/proton/initializer/task_runner.cpp b/searchcore/src/vespa/searchcore/proton/initializer/task_runner.cpp index 86c2b525113..16348dbace6 100644 --- a/searchcore/src/vespa/searchcore/proton/initializer/task_runner.cpp +++ b/searchcore/src/vespa/searchcore/proton/initializer/task_runner.cpp @@ -110,6 +110,7 @@ TaskRunner::pollTask(Context::SP context) TaskList readyTasks; TaskSet checked; getReadyTasks(context->rootTask(), readyTasks, checked); + std::sort(readyTasks.begin(), readyTasks.end(), [](const auto &a, const auto &b) -> bool { return a->get_transient_memory_usage() > b->get_transient_memory_usage(); }); internalRunTasks(readyTasks, context); } |