aboutsummaryrefslogtreecommitdiffstats
path: root/searchcore
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@broadpark.no>2020-05-18 12:49:04 +0200
committerTor Egge <Tor.Egge@broadpark.no>2020-05-18 12:56:22 +0200
commit4868e26a14d3e49b5a165492148c7956df9c9d43 (patch)
treeab19b93cc2041e26d3ff9133dcbebe23f3cfd3f4 /searchcore
parent33cc8d8a84b90139098aa21703c82bd012a58643 (diff)
Run initializer task with highest transient memory usage first.
Diffstat (limited to 'searchcore')
-rw-r--r--searchcore/src/tests/proton/initializer/task_runner_test.cpp30
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/attribute_manager_initializer.cpp3
-rw-r--r--searchcore/src/vespa/searchcore/proton/initializer/initializer_task.cpp6
-rw-r--r--searchcore/src/vespa/searchcore/proton/initializer/initializer_task.h1
-rw-r--r--searchcore/src/vespa/searchcore/proton/initializer/task_runner.cpp1
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);
}