From fd3f3a88e7e1641526d1b9e34eb6f09c2e20743a Mon Sep 17 00:00:00 2001 From: Max Neunhoeffer Date: Fri, 10 Feb 2017 09:12:15 +0100 Subject: [PATCH] Destroy all traverser engines when AQL is shut down. --- arangod/Cluster/TraverserEngineRegistry.cpp | 13 +++++++++++++ arangod/Cluster/TraverserEngineRegistry.h | 3 +++ arangod/RestServer/AqlFeature.cpp | 1 + 3 files changed, 17 insertions(+) diff --git a/arangod/Cluster/TraverserEngineRegistry.cpp b/arangod/Cluster/TraverserEngineRegistry.cpp index 7c4e7717b2..bf6606a178 100644 --- a/arangod/Cluster/TraverserEngineRegistry.cpp +++ b/arangod/Cluster/TraverserEngineRegistry.cpp @@ -171,3 +171,16 @@ size_t TraverserEngineRegistry::numberRegisteredEngines() { return _engines.size(); } +/// @brief destroy all registered engines +void TraverserEngineRegistry::destroyAll() { + std::vector engines; + { + READ_LOCKER(readLocker, _lock); + for (auto& p : _engines) { + engines.push_back(p.first); + } + } + for (auto& i : engines) { + destroy(i, true); + } +} diff --git a/arangod/Cluster/TraverserEngineRegistry.h b/arangod/Cluster/TraverserEngineRegistry.h index 6989aa91ab..260637aa96 100644 --- a/arangod/Cluster/TraverserEngineRegistry.h +++ b/arangod/Cluster/TraverserEngineRegistry.h @@ -72,6 +72,9 @@ class TraverserEngineRegistry { /// @brief return number of registered engines size_t numberRegisteredEngines(); + /// @brief destroy all registered engines + void destroyAll(); + private: void destroy(TraverserEngineID, bool doLock); diff --git a/arangod/RestServer/AqlFeature.cpp b/arangod/RestServer/AqlFeature.cpp index 221ff94e98..d7c8a6f7b1 100644 --- a/arangod/RestServer/AqlFeature.cpp +++ b/arangod/RestServer/AqlFeature.cpp @@ -86,6 +86,7 @@ void AqlFeature::stop() { } LOG_TOPIC(DEBUG, Logger::QUERIES) << "AQL feature stopped"; QueryRegistryFeature::QUERY_REGISTRY->destroyAll(); + TraverserEngineRegistryFeature::TRAVERSER_ENGINE_REGISTRY->destroyAll(); // Wait until all AQL queries are done while (true) {