diff --git a/arangod/Aql/ExecutionBlock.cpp b/arangod/Aql/ExecutionBlock.cpp index c5dd479866..d98902e4e0 100644 --- a/arangod/Aql/ExecutionBlock.cpp +++ b/arangod/Aql/ExecutionBlock.cpp @@ -4602,17 +4602,18 @@ AqlItemBlock* RemoteBlock::getSome (size_t atLeast, Json responseBodyJson(TRI_UNKNOWN_MEM_ZONE, TRI_JsonString(TRI_UNKNOWN_MEM_ZONE, responseBodyBuf.begin())); - if (JsonHelper::getBooleanValue(responseBodyJson.json(), "exhausted", true)) { - return nullptr; - } - - auto items = new triagens::aql::AqlItemBlock(responseBodyJson); ExecutionStats newStats(responseBodyJson.get("stats")); _engine->_stats.addDelta(_deltaStats, newStats); _deltaStats = newStats; + if (JsonHelper::getBooleanValue(responseBodyJson.json(), "exhausted", true)) { + return nullptr; + } + + auto items = new triagens::aql::AqlItemBlock(responseBodyJson); + return items; LEAVE_BLOCK } diff --git a/arangod/Aql/ExecutionStats.cpp b/arangod/Aql/ExecutionStats.cpp index 0dadd9f702..8663e8a656 100644 --- a/arangod/Aql/ExecutionStats.cpp +++ b/arangod/Aql/ExecutionStats.cpp @@ -51,6 +51,17 @@ Json ExecutionStats::toJson () const { return json; } +Json ExecutionStats::toJsonStatic () { + Json json(Json::Array); + json.set("writesExecuted", Json(static_cast(0))); + json.set("writesIgnored", Json(static_cast(0))); + json.set("scannedFull", Json(static_cast(0))); + json.set("scannedIndex", Json(static_cast(0))); + json.set("static", Json(static_cast(0))); + + return json; +} + ExecutionStats::ExecutionStats() :writesExecuted(0), writesIgnored(0), diff --git a/arangod/Aql/ExecutionStats.h b/arangod/Aql/ExecutionStats.h index 733deb177f..4055d5f41a 100644 --- a/arangod/Aql/ExecutionStats.h +++ b/arangod/Aql/ExecutionStats.h @@ -52,6 +52,12 @@ namespace triagens { triagens::basics::Json toJson () const; +//////////////////////////////////////////////////////////////////////////////// +/// @brief create empty statistics for JSON +//////////////////////////////////////////////////////////////////////////////// + + static triagens::basics::Json toJsonStatic (); + //////////////////////////////////////////////////////////////////////////////// /// @brief sumarize two sets of ExecutionStats //////////////////////////////////////////////////////////////////////////////// diff --git a/arangod/Aql/Query.cpp b/arangod/Aql/Query.cpp index 13300791ab..9c1153a8fc 100644 --- a/arangod/Aql/Query.cpp +++ b/arangod/Aql/Query.cpp @@ -864,7 +864,12 @@ void Query::exitContext () { //////////////////////////////////////////////////////////////////////////////// triagens::basics::Json Query::getStats() { - return _engine->_stats.toJson(); + if (_engine) { + return _engine->_stats.toJson(); + } + else { + return ExecutionStats::toJsonStatic(); + } } //////////////////////////////////////////////////////////////////////////////// diff --git a/arangod/Aql/RestAqlHandler.cpp b/arangod/Aql/RestAqlHandler.cpp index 14e9b05265..277c5a7d07 100644 --- a/arangod/Aql/RestAqlHandler.cpp +++ b/arangod/Aql/RestAqlHandler.cpp @@ -717,7 +717,7 @@ void RestAqlHandler::handleUseQuery (std::string const& operation, shardId = shardIdCharP; } - Json answerBody(Json::Array, 2); + Json answerBody(Json::Array, 3); if (operation == "getSome") { auto atLeast = JsonHelper::getNumericValue(queryJson.json(), @@ -738,7 +738,8 @@ void RestAqlHandler::handleUseQuery (std::string const& operation, } if (items.get() == nullptr) { answerBody("exhausted", Json(true)) - ("error", Json(false)); + ("error", Json(false)) + ("stats", query->getStats()); } else { try { @@ -781,6 +782,7 @@ void RestAqlHandler::handleUseQuery (std::string const& operation, } answerBody("skipped", Json(static_cast(skipped))) ("error", Json(false)); + answerBody.set("stats", query->getStats()); } else if (operation == "skip") { auto number = JsonHelper::getNumericValue(queryJson.json(), @@ -801,6 +803,7 @@ void RestAqlHandler::handleUseQuery (std::string const& operation, answerBody("exhausted", Json(exhausted)) ("error", Json(false)); + answerBody.set("stats", query->getStats()); } catch (...) { LOG_ERROR("skip lead to an exception"); @@ -831,6 +834,7 @@ void RestAqlHandler::handleUseQuery (std::string const& operation, } answerBody("error", Json(res != TRI_ERROR_NO_ERROR)) ("code", Json(static_cast(res))); + answerBody.set("stats", query->getStats()); } else if (operation == "shutdown") { int res = TRI_ERROR_INTERNAL; @@ -848,6 +852,7 @@ void RestAqlHandler::handleUseQuery (std::string const& operation, } answerBody("error", res == TRI_ERROR_NO_ERROR ? Json(false) : Json(true)) ("code", Json(static_cast(res))); + answerBody.set("stats", query->getStats()); } else { LOG_ERROR("Unknown operation!"); diff --git a/lib/HttpServer/HttpCommTask.h b/lib/HttpServer/HttpCommTask.h index 07cca5a978..dfcba0113c 100644 --- a/lib/HttpServer/HttpCommTask.h +++ b/lib/HttpServer/HttpCommTask.h @@ -347,7 +347,6 @@ namespace triagens { this->_sinceCompactification++; } - const char * ptr = this->_readBuffer->c_str() + this->_readPosition; const char * end = this->_readBuffer->end() - 3; @@ -567,8 +566,10 @@ namespace triagens { } } else { - if (this->_readBuffer->c_str() < end) { - this->_readPosition = end - this->_readBuffer->c_str(); + size_t l = (this->_readBuffer->end() - this->_readBuffer->c_str()); + + if (this->_startPosition + 4 <= l) { + this->_readPosition = l - 4; } } }