From 6ee9206e463ed55e86a56695c8a217ea3791fa73 Mon Sep 17 00:00:00 2001 From: Jan Date: Wed, 17 Apr 2019 15:27:37 +0200 Subject: [PATCH] clear traverser cache in-between (#8772) --- arangod/Aql/TraversalExecutor.cpp | 3 +++ arangod/Graph/TraverserCache.cpp | 6 ++++++ arangod/Graph/TraverserCache.h | 3 +++ arangod/Graph/TraverserOptions.h | 5 ----- lib/Basics/StringHeap.cpp | 10 ++++++++++ lib/Basics/StringHeap.h | 5 +++++ 6 files changed, 27 insertions(+), 5 deletions(-) diff --git a/arangod/Aql/TraversalExecutor.cpp b/arangod/Aql/TraversalExecutor.cpp index 1301a36ed6..21cc834894 100644 --- a/arangod/Aql/TraversalExecutor.cpp +++ b/arangod/Aql/TraversalExecutor.cpp @@ -26,6 +26,7 @@ #include "Aql/Query.h" #include "Aql/SingleRowFetcher.h" #include "Graph/Traverser.h" +#include "Graph/TraverserCache.h" #include "Graph/TraverserOptions.h" using namespace arangodb; @@ -246,6 +247,8 @@ ExecutionState TraversalExecutor::computeState() const { } bool TraversalExecutor::resetTraverser() { + _traverser.traverserCache()->clear(); + // Initialize the Expressions within the options. // We need to find the variable and read its value here. Everything is // computed right now. diff --git a/arangod/Graph/TraverserCache.cpp b/arangod/Graph/TraverserCache.cpp index 87392ff73c..1e947c2eaf 100644 --- a/arangod/Graph/TraverserCache.cpp +++ b/arangod/Graph/TraverserCache.cpp @@ -52,6 +52,12 @@ TraverserCache::TraverserCache(aql::Query* query) } TraverserCache::~TraverserCache() {} + +void TraverserCache::clear() { + _stringHeap->clear(); + _persistedStrings.clear(); + _mmdr->clear(); +} VPackSlice TraverserCache::lookupToken(EdgeDocumentToken const& idToken) { TRI_ASSERT(!ServerState::instance()->isCoordinator()); diff --git a/arangod/Graph/TraverserCache.h b/arangod/Graph/TraverserCache.h index 26ca0ed69e..319a018294 100644 --- a/arangod/Graph/TraverserCache.h +++ b/arangod/Graph/TraverserCache.h @@ -59,6 +59,9 @@ class TraverserCache { virtual ~TraverserCache(); + /// @brief clears all allocated memory in the underlying StringHeap + void clear(); + ////////////////////////////////////////////////////////////////////////////// /// @brief Inserts the real document stored within the token /// into the given builder. diff --git a/arangod/Graph/TraverserOptions.h b/arangod/Graph/TraverserOptions.h index 283d8478c7..0a212af318 100644 --- a/arangod/Graph/TraverserOptions.h +++ b/arangod/Graph/TraverserOptions.h @@ -48,11 +48,6 @@ class TraversalNode; struct Variable; } // namespace aql -namespace graph { -class EdgeUniquenessChecker; -class TraverserCache; -} // namespace graph - namespace traverser { class ClusterTraverser; diff --git a/lib/Basics/StringHeap.cpp b/lib/Basics/StringHeap.cpp index e585c18f12..57276abdc5 100644 --- a/lib/Basics/StringHeap.cpp +++ b/lib/Basics/StringHeap.cpp @@ -58,6 +58,16 @@ arangodb::velocypack::StringRef StringHeap::registerString(char const* ptr, size return arangodb::velocypack::StringRef(position, length); } +void StringHeap::clear() { + _current = nullptr; + _end = nullptr; + + for (auto& it : _blocks) { + delete[] it; + } + _blocks.clear(); +} + void StringHeap::merge(StringHeap&& heap) { _blocks.reserve(_blocks.size() + heap._blocks.size()); _blocks.insert(_blocks.end(), heap._blocks.begin(), heap._blocks.end()); diff --git a/lib/Basics/StringHeap.h b/lib/Basics/StringHeap.h index eb8f26306f..a72261247a 100644 --- a/lib/Basics/StringHeap.h +++ b/lib/Basics/StringHeap.h @@ -43,6 +43,11 @@ class StringHeap { arangodb::velocypack::StringRef registerString(arangodb::velocypack::StringRef const& str) { return registerString(str.data(), str.size()); } + + /// @brief clear all data from the StringHeap, not releasing any occupied memory + /// the caller must make sure that nothing points into the data of the StringHeap + /// when calling this method + void clear(); void merge(StringHeap&& heap);