From c99f4244c70c2268f0ffbbcfc4e70d28fd7ecfb7 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Wed, 9 Dec 2015 00:26:18 +0100 Subject: [PATCH] bugfix for cluster edges API --- arangod/Cluster/ClusterMethods.cpp | 42 +++++++++++++++++------------- lib/Rest/HttpResponse.cpp | 1 + 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/arangod/Cluster/ClusterMethods.cpp b/arangod/Cluster/ClusterMethods.cpp index e69af33c03..a5f87fe3b8 100644 --- a/arangod/Cluster/ClusterMethods.cpp +++ b/arangod/Cluster/ClusterMethods.cpp @@ -1230,13 +1230,13 @@ int getAllDocumentsOnCoordinator ( //////////////////////////////////////////////////////////////////////////////// int getAllEdgesOnCoordinator ( - string const& dbname, - string const& collname, - string const& vertex, + std::string const& dbname, + std::string const& collname, + std::string const& vertex, TRI_edge_direction_e const& direction, triagens::rest::HttpResponse::HttpResponseCode& responseCode, - string& contentType, - string& resultBody ) { + std::string& contentType, + std::string& resultBody) { triagens::basics::Json result(triagens::basics::Json::Object); std::vector expTmp; int res = getFilteredEdgesOnCoordinator(dbname, collname, vertex, direction, expTmp, responseCode, contentType, result); @@ -1245,14 +1245,14 @@ int getAllEdgesOnCoordinator ( } int getFilteredEdgesOnCoordinator ( - string const& dbname, - string const& collname, - string const& vertex, + std::string const& dbname, + std::string const& collname, + std::string const& vertex, TRI_edge_direction_e const& direction, std::vector const& expressions, triagens::rest::HttpResponse::HttpResponseCode& responseCode, - string& contentType, - triagens::basics::Json& result ) { + std::string& contentType, + triagens::basics::Json& result) { TRI_ASSERT(result.isObject()); TRI_ASSERT(result.members() == 0); @@ -1268,8 +1268,8 @@ int getFilteredEdgesOnCoordinator ( ClusterCommResult* res; - map shards = collinfo->shardIds(); - map::iterator it; + std::map shards = collinfo->shardIds(); + std::map::iterator it; CoordTransactionID coordTransactionID = TRI_NewTickServer(); std::string queryParameters = "?vertex=" + StringUtils::urlEncode(vertex); if (direction == TRI_EDGE_IN) { @@ -1289,7 +1289,7 @@ int getFilteredEdgesOnCoordinator ( reqBodyString->append(body.toString()); } for (it = shards.begin(); it != shards.end(); ++it) { - map* headers = new map; + std::map* headers = new std::map; res = cc->asyncRequest("", coordTransactionID, "shard:" + it->first, triagens::rest::HttpRequest::HTTP_REQUEST_PUT, "/_db/" + StringUtils::urlEncode(dbname) + "/_api/edges/" + it->first + queryParameters, @@ -1312,19 +1312,27 @@ int getFilteredEdgesOnCoordinator ( cc->drop( "", coordTransactionID, 0, ""); return TRI_ERROR_CLUSTER_TIMEOUT; } - if (res->status == CL_COMM_ERROR || res->status == CL_COMM_DROPPED || - res->answer_code == triagens::rest::HttpResponse::NOT_FOUND) { + if (res->status == CL_COMM_ERROR || res->status == CL_COMM_DROPPED) { delete res; cc->drop( "", coordTransactionID, 0, ""); return TRI_ERROR_INTERNAL; } - + if (res->status == CL_COMM_RECEIVED) { + } + std::unique_ptr shardResult(TRI_JsonString(TRI_UNKNOWN_MEM_ZONE, res->answer->body())); if (shardResult == nullptr || ! TRI_IsObjectJson(shardResult.get())) { delete res; return TRI_ERROR_INTERNAL; } + + bool const isError = triagens::basics::JsonHelper::checkAndGetBooleanValue(shardResult.get(), "error"); + if (isError) { + // shared returned an error + delete res; + return triagens::basics::JsonHelper::getNumericValue(shardResult.get(), "errorNum", TRI_ERROR_INTERNAL); + } auto docs = TRI_LookupObjectJson(shardResult.get(), "edges"); @@ -1364,8 +1372,6 @@ int getFilteredEdgesOnCoordinator ( return TRI_ERROR_NO_ERROR; } - - //////////////////////////////////////////////////////////////////////////////// /// @brief modify a document in a coordinator //////////////////////////////////////////////////////////////////////////////// diff --git a/lib/Rest/HttpResponse.cpp b/lib/Rest/HttpResponse.cpp index 5658d25924..1c47ac71d6 100644 --- a/lib/Rest/HttpResponse.cpp +++ b/lib/Rest/HttpResponse.cpp @@ -213,6 +213,7 @@ HttpResponse::HttpResponseCode HttpResponse::responseCode (int code) { case TRI_ERROR_ARANGO_DOCUMENT_KEY_BAD: case TRI_ERROR_ARANGO_DOCUMENT_KEY_UNEXPECTED: case TRI_ERROR_ARANGO_DOCUMENT_TYPE_INVALID: + case TRI_ERROR_ARANGO_DOCUMENT_HANDLE_BAD: case TRI_ERROR_CLUSTER_MUST_NOT_CHANGE_SHARDING_ATTRIBUTES: case TRI_ERROR_CLUSTER_MUST_NOT_SPECIFY_KEY: case TRI_ERROR_TYPE_ERROR: