From 32953a4a97db0dcaf7717a8d778d97d79d12fb8d Mon Sep 17 00:00:00 2001 From: Max Neunhoeffer Date: Thu, 23 Mar 2017 12:33:11 +0100 Subject: [PATCH] Revert "Fix locking of shards in TraverserEngines." This reverts commit 467088b8af209a43513cfa675d4412c3cd3aeeab. --- arangod/Aql/ExecutionEngine.cpp | 16 +++------------- arangod/Cluster/TraverserEngine.cpp | 10 ++++------ arangod/RestHandler/RestVocbaseBaseHandler.cpp | 12 ++---------- 3 files changed, 9 insertions(+), 29 deletions(-) diff --git a/arangod/Aql/ExecutionEngine.cpp b/arangod/Aql/ExecutionEngine.cpp index 1db1c1b60a..92d46db241 100644 --- a/arangod/Aql/ExecutionEngine.cpp +++ b/arangod/Aql/ExecutionEngine.cpp @@ -1007,14 +1007,7 @@ struct CoordinatorInstanciator : public WalkerWorker { if (!shardSet.empty()) { arangodb::CoordTransactionID coordTransactionID = TRI_NewTickServer(); std::unordered_map headers; - std::string shardList; - for (auto const& shard : shardSet) { - if (!shardList.empty()) { - shardList += ","; - } - shardList += shard; - } - headers["X-Arango-Nolock"] = shardList; // Prevent locking + auto res = cc->syncRequest("", coordTransactionID, "server:" + list.first, RequestType::POST, url, engineInfo.toJson(), headers, 30.0); @@ -1025,7 +1018,7 @@ struct CoordinatorInstanciator : public WalkerWorker { message += std::string(" : ") + res->errorMessage; } THROW_ARANGO_EXCEPTION_MESSAGE( - TRI_ERROR_CLUSTER_BACKEND_UNAVAILABLE, message); + TRI_ERROR_QUERY_COLLECTION_LOCK_FAILED, message); } else { // Only if the result was successful we will get here arangodb::basics::StringBuffer& body = res->result->getBody(); @@ -1035,7 +1028,7 @@ struct CoordinatorInstanciator : public WalkerWorker { VPackSlice resultSlice = builder->slice(); if (!resultSlice.isNumber()) { THROW_ARANGO_EXCEPTION_MESSAGE( - TRI_ERROR_INTERNAL, "got unexpected response from engine build request"); + TRI_ERROR_INTERNAL, "got unexpected response from engine lock request"); } auto engineId = resultSlice.getNumericValue(); TRI_ASSERT(engineId != 0); @@ -1216,9 +1209,6 @@ ExecutionEngine* ExecutionEngine::instantiateFromPlan( engine->_lockedShards = new std::unordered_set(); engine->_previouslyLockedShards = nullptr; } - // Note that it is crucial that this is a map and not an unordered_map, - // because we need to guarantee the order of locking by using - // alphabetical order on the shard names! std::map> forLocking; for (auto& q : inst.get()->queryIds) { std::string theId = q.first; diff --git a/arangod/Cluster/TraverserEngine.cpp b/arangod/Cluster/TraverserEngine.cpp index 778be45b39..dedecb709e 100644 --- a/arangod/Cluster/TraverserEngine.cpp +++ b/arangod/Cluster/TraverserEngine.cpp @@ -94,12 +94,9 @@ BaseTraverserEngine::BaseTraverserEngine(TRI_vocbase_t* vocbase, auto params = std::make_shared(); auto opts = std::make_shared(); - _trx = new arangodb::AqlTransaction( - arangodb::StandaloneTransactionContext::Create(vocbase), - _collections.collections(), true); - // true here as last argument is crucial: it leads to the fact that the - // created transaction is considered a "MAIN" part and will not switch - // off collection locking completely! + _trx = new aql::AqlTransaction( + arangodb::transaction::StandaloneContext::Create(vocbase), + _collections.collections(), false); _query = new aql::Query(true, vocbase, "", 0, params, opts, aql::PART_DEPENDENT); _query->injectTransaction(_trx); @@ -115,6 +112,7 @@ BaseTraverserEngine::BaseTraverserEngine(TRI_vocbase_t* vocbase, } } + _trx->begin(); // We begin the transaction before we lock. // We also setup indexes before we lock. } diff --git a/arangod/RestHandler/RestVocbaseBaseHandler.cpp b/arangod/RestHandler/RestVocbaseBaseHandler.cpp index b36598b167..17b1533da2 100644 --- a/arangod/RestHandler/RestVocbaseBaseHandler.cpp +++ b/arangod/RestHandler/RestVocbaseBaseHandler.cpp @@ -627,16 +627,8 @@ void RestVocbaseBaseHandler::prepareExecute() { std::string const& shardId = _request->header("x-arango-nolock", found); if (found) { - _nolockHeaderSet = new std::unordered_set(); - // Split value at commas, if there are any, otherwise take full value: - size_t pos = shardId.find(','); - size_t oldpos = 0; - while (pos != std::string::npos) { - _nolockHeaderSet->emplace(shardId.substr(oldpos, pos - oldpos)); - oldpos = pos + 1; - pos = shardId.find(',', oldpos); - } - _nolockHeaderSet->emplace(shardId.substr(oldpos)); + _nolockHeaderSet = + new std::unordered_set{std::string(shardId)}; CollectionLockState::_noLockHeaders = _nolockHeaderSet; } }