diff --git a/arangod/Aql/EngineInfoContainerDBServer.cpp b/arangod/Aql/EngineInfoContainerDBServer.cpp index d49023e9c0..cbd76c6d60 100644 --- a/arangod/Aql/EngineInfoContainerDBServer.cpp +++ b/arangod/Aql/EngineInfoContainerDBServer.cpp @@ -1200,19 +1200,26 @@ struct NoopCb final : public arangodb::ClusterCommCallback { void EngineInfoContainerDBServer::cleanupEngines(std::shared_ptr cc, int errorCode, std::string const& dbname, MapRemoteToSnippet& queryIds) const { + constexpr double shortTimeout = 10.0; // Picked arbitrarily + auto cb = std::make_shared<::NoopCb>(); + std::unordered_map headers; + CoordTransactionID coordinatorTransactionID = TRI_NewTickServer(); + // Shutdown query snippets std::string url("/_db/" + arangodb::basics::StringUtils::urlEncode(dbname) + "/_api/aql/shutdown/"); - std::vector requests; auto body = std::make_shared( "{\"code\":" + std::to_string(errorCode) + "}"); for (auto const& it : queryIds) { // it.first == RemoteNodeId, we don't need this // it.second server -> [snippets] for (auto const& serToSnippets : it.second) { - auto server = serToSnippets.first; - for (auto const& shardId : serToSnippets.second) { - requests.emplace_back(server, rest::RequestType::PUT, url + shardId, body); + ServerID const& server = serToSnippets.first; + for (auto const& shardId : serToSnippets.second) { + cc->asyncRequest(coordinatorTransactionID, server, rest::RequestType::PUT, + url + shardId, body, headers, cb, + shortTimeout, false, 2.0); + } } } @@ -1220,13 +1227,8 @@ void EngineInfoContainerDBServer::cleanupEngines(std::shared_ptr cc // Shutdown traverser engines url = "/_db/" + arangodb::basics::StringUtils::urlEncode(dbname) + "/_internal/traverser/"; - std::unordered_map headers; std::shared_ptr noBody; - - CoordTransactionID coordinatorTransactionID = TRI_NewTickServer(); - auto cb = std::make_shared<::NoopCb>(); - - constexpr double shortTimeout = 10.0; // Picked arbitrarily + for (auto const& gn : _graphNodes) { auto allEngines = gn->engines(); for (auto const& engine : *allEngines) { diff --git a/arangod/Cluster/ClusterTrxMethods.cpp b/arangod/Cluster/ClusterTrxMethods.cpp index 26841ae535..b8605beeaa 100644 --- a/arangod/Cluster/ClusterTrxMethods.cpp +++ b/arangod/Cluster/ClusterTrxMethods.cpp @@ -457,6 +457,8 @@ void ClusterTrxMethods::addAQLTransactionHeader(transaction::Methods const& trx, TRI_ASSERT(false); } state.addKnownServer(server); // remember server + } else if (state.hasHint(transaction::Hints::Hint::FROM_TOPLEVEL_AQL)) { + THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_INTERNAL, "illegal AQL transaction state"); } headers.emplace(arangodb::StaticStrings::TransactionId, std::move(value)); }