about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAmineChikhaoui <amine.chikhaoui91@gmail.com>2017-10-25T15·13+0100
committerAmineChikhaoui <amine.chikhaoui91@gmail.com>2017-10-25T15·13+0100
commit9f01a3f0a87679ac3ba2c71ab6d31478bcbef481 (patch)
tree1fcb4095a7f2da1cd281023ee0e86a782777d528
parent82327e3cc474be3c72a22480ad6e219f072e27e0 (diff)
attempt to fix #1630: make the queries of store paths run in parallel using a thread pool
-rw-r--r--src/libstore/store-api.cc9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc
index c57e42fec00d..82e0bda5468c 100644
--- a/src/libstore/store-api.cc
+++ b/src/libstore/store-api.cc
@@ -389,8 +389,9 @@ PathSet Store::queryValidPaths(const PathSet & paths, SubstituteFlag maybeSubsti
     Sync<State> state_(State{paths.size(), PathSet()});
 
     std::condition_variable wakeup;
+    ThreadPool pool;
 
-    for (auto & path : paths)
+    auto doQuery = [&](const Path & path ) {
         queryPathInfo(path,
             [path, &state_, &wakeup](ref<ValidPathInfo> info) {
                 auto state(state_.lock());
@@ -411,6 +412,12 @@ PathSet Store::queryValidPaths(const PathSet & paths, SubstituteFlag maybeSubsti
                 if (!--state->left)
                     wakeup.notify_one();
             });
+    };
+
+    for (auto & path : paths)
+        pool.enqueue(std::bind(doQuery, path));
+
+    pool.process();
 
     while (true) {
         auto state(state_.lock());