mirror of https://gitee.com/bigwinds/arangodb
fix some tests, and remove legacy API response
This commit is contained in:
parent
125dcfffa9
commit
d48fff70f2
|
@ -580,8 +580,6 @@ void AqlItemBlock::toVelocyPack(transaction::Methods* trx, VPackBuilder& result)
|
||||||
result.add("nrItems", VPackValue(_nrItems));
|
result.add("nrItems", VPackValue(_nrItems));
|
||||||
result.add("nrRegs", VPackValue(_nrRegs));
|
result.add("nrRegs", VPackValue(_nrRegs));
|
||||||
result.add("error", VPackValue(false));
|
result.add("error", VPackValue(false));
|
||||||
// Backwards compatbility 3.3
|
|
||||||
result.add("exhausted", VPackValue(false));
|
|
||||||
|
|
||||||
enum State {
|
enum State {
|
||||||
Empty, // saw an empty value
|
Empty, // saw an empty value
|
||||||
|
|
|
@ -80,12 +80,12 @@ class DistributeConsumerNode : public ExecutionNode {
|
||||||
// This node is not allowed to be cloned.
|
// This node is not allowed to be cloned.
|
||||||
// Clone specialization!
|
// Clone specialization!
|
||||||
TRI_ASSERT(false);
|
TRI_ASSERT(false);
|
||||||
THROW_ARANGO_EXCEPTION(TRI_ERROR_INTERNAL);
|
THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_INTERNAL, "DistributeConsumerNode cannot be cloned");
|
||||||
}
|
}
|
||||||
|
|
||||||
CostEstimate estimateCost() const override {
|
CostEstimate estimateCost() const override {
|
||||||
TRI_ASSERT(false);
|
TRI_ASSERT(false);
|
||||||
THROW_ARANGO_EXCEPTION(TRI_ERROR_INTERNAL);
|
THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_INTERNAL, "DistributeConsumerNode cannot be estimated");
|
||||||
}
|
}
|
||||||
|
|
||||||
void cloneRegisterPlan(ScatterNode* dependency);
|
void cloneRegisterPlan(ScatterNode* dependency);
|
||||||
|
|
|
@ -88,19 +88,22 @@ Result EngineInfoContainerCoordinator::EngineInfo::buildEngine(
|
||||||
// For _id == 0 this thread will always maintain the handle to
|
// For _id == 0 this thread will always maintain the handle to
|
||||||
// the engine and will clean up. We do not keep track of it seperately
|
// the engine and will clean up. We do not keep track of it seperately
|
||||||
if (_id != 0) {
|
if (_id != 0) {
|
||||||
|
coordinatorQueryIds.emplace_back(_id);
|
||||||
|
|
||||||
double ttl = query.queryOptions().ttl;
|
double ttl = query.queryOptions().ttl;
|
||||||
TRI_ASSERT(ttl > 0);
|
TRI_ASSERT(ttl > 0);
|
||||||
try {
|
try {
|
||||||
queryRegistry->insert(_id, &query, ttl, true, false);
|
queryRegistry->insert(_id, &query, ttl, true, false);
|
||||||
} catch (basics::Exception const& e) {
|
} catch (basics::Exception const& e) {
|
||||||
|
coordinatorQueryIds.pop_back();
|
||||||
return {e.code(), e.message()};
|
return {e.code(), e.message()};
|
||||||
} catch (std::exception const& e) {
|
} catch (std::exception const& e) {
|
||||||
|
coordinatorQueryIds.pop_back();
|
||||||
return {TRI_ERROR_INTERNAL, e.what()};
|
return {TRI_ERROR_INTERNAL, e.what()};
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
return {TRI_ERROR_INTERNAL};
|
coordinatorQueryIds.pop_back();
|
||||||
|
return {TRI_ERROR_INTERNAL, "unable to store query in registry"};
|
||||||
}
|
}
|
||||||
|
|
||||||
coordinatorQueryIds.emplace_back(_id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return {TRI_ERROR_NO_ERROR};
|
return {TRI_ERROR_NO_ERROR};
|
||||||
|
|
|
@ -589,12 +589,11 @@ std::pair<ExecutionState, size_t> ExecutionEngine::skipSome(size_t atMost) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Result ExecutionEngine::shutdownSync(int errorCode) noexcept {
|
Result ExecutionEngine::shutdownSync(int errorCode) noexcept {
|
||||||
Result res{TRI_ERROR_INTERNAL};
|
Result res{TRI_ERROR_INTERNAL, "unable to shutdown query"};
|
||||||
ExecutionState state = ExecutionState::WAITING;
|
ExecutionState state = ExecutionState::WAITING;
|
||||||
try {
|
try {
|
||||||
std::shared_ptr<SharedQueryState> sharedState = _query.sharedState();
|
std::shared_ptr<SharedQueryState> sharedState = _query.sharedState();
|
||||||
if (sharedState != nullptr) {
|
if (sharedState != nullptr) {
|
||||||
|
|
||||||
while (state == ExecutionState::WAITING) {
|
while (state == ExecutionState::WAITING) {
|
||||||
std::tie(state, res) = shutdown(errorCode);
|
std::tie(state, res) = shutdown(errorCode);
|
||||||
if (state == ExecutionState::WAITING) {
|
if (state == ExecutionState::WAITING) {
|
||||||
|
@ -602,6 +601,8 @@ Result ExecutionEngine::shutdownSync(int errorCode) noexcept {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (std::exception const& ex) {
|
||||||
|
res.reset(TRI_ERROR_INTERNAL, ex.what());
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
res.reset(TRI_ERROR_INTERNAL);
|
res.reset(TRI_ERROR_INTERNAL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -134,8 +134,6 @@ void InputAqlItemRow::toVelocyPack(transaction::Methods* trx, VPackBuilder& resu
|
||||||
result.add("nrItems", VPackValue(1));
|
result.add("nrItems", VPackValue(1));
|
||||||
result.add("nrRegs", VPackValue(getNrRegisters()));
|
result.add("nrRegs", VPackValue(getNrRegisters()));
|
||||||
result.add("error", VPackValue(false));
|
result.add("error", VPackValue(false));
|
||||||
// Backwards compatbility 3.3
|
|
||||||
result.add("exhausted", VPackValue(false));
|
|
||||||
|
|
||||||
enum State {
|
enum State {
|
||||||
Empty, // saw an empty value
|
Empty, // saw an empty value
|
||||||
|
|
|
@ -104,7 +104,7 @@ std::pair<ExecutionState, SharedAqlItemBlockPtr> ExecutionBlockImpl<RemoteExecut
|
||||||
// For every call we simply forward via HTTP
|
// For every call we simply forward via HTTP
|
||||||
if (_lastError.fail()) {
|
if (_lastError.fail()) {
|
||||||
TRI_ASSERT(_lastResponse == nullptr);
|
TRI_ASSERT(_lastResponse == nullptr);
|
||||||
Result res = _lastError;
|
Result res = std::move(_lastError);
|
||||||
_lastError.reset();
|
_lastError.reset();
|
||||||
// we were called with an error need to throw it.
|
// we were called with an error need to throw it.
|
||||||
THROW_ARANGO_EXCEPTION(res);
|
THROW_ARANGO_EXCEPTION(res);
|
||||||
|
@ -236,7 +236,7 @@ std::pair<ExecutionState, Result> ExecutionBlockImpl<RemoteExecutor>::initialize
|
||||||
InputAqlItemRow const& input) {
|
InputAqlItemRow const& input) {
|
||||||
// For every call we simply forward via HTTP
|
// For every call we simply forward via HTTP
|
||||||
if (_requestInFlight.load(std::memory_order_acquire)) {
|
if (_requestInFlight.load(std::memory_order_acquire)) {
|
||||||
return {ExecutionState::WAITING, 0};
|
return {ExecutionState::WAITING, TRI_ERROR_NO_ERROR};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_isResponsibleForInitializeCursor) {
|
if (!_isResponsibleForInitializeCursor) {
|
||||||
|
@ -259,11 +259,22 @@ std::pair<ExecutionState, Result> ExecutionBlockImpl<RemoteExecutor>::initialize
|
||||||
auto response = std::move(_lastResponse);
|
auto response = std::move(_lastResponse);
|
||||||
|
|
||||||
// Result is the response which is an object containing the ErrorCode
|
// Result is the response which is an object containing the ErrorCode
|
||||||
|
int errorNumber = TRI_ERROR_INTERNAL; // default error code
|
||||||
VPackSlice slice = response->slice();
|
VPackSlice slice = response->slice();
|
||||||
if (slice.hasKey("code")) {
|
VPackSlice errorSlice = slice.get(StaticStrings::ErrorNum);
|
||||||
return {ExecutionState::DONE, slice.get("code").getNumericValue<int>()};
|
if (!errorSlice.isNumber()) {
|
||||||
|
errorSlice = slice.get(StaticStrings::Code);
|
||||||
}
|
}
|
||||||
return {ExecutionState::DONE, TRI_ERROR_INTERNAL};
|
if (errorSlice.isNumber()) {
|
||||||
|
errorNumber = errorSlice.getNumericValue<int>();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string errorMessage;
|
||||||
|
errorSlice = slice.get(StaticStrings::ErrorMessage);
|
||||||
|
if (errorSlice.isString()) {
|
||||||
|
return {ExecutionState::DONE, {errorNumber, errorSlice.copyString()}};
|
||||||
|
}
|
||||||
|
return {ExecutionState::DONE, errorNumber};
|
||||||
}
|
}
|
||||||
|
|
||||||
VPackOptions options(VPackOptions::Defaults);
|
VPackOptions options(VPackOptions::Defaults);
|
||||||
|
@ -274,13 +285,10 @@ std::pair<ExecutionState, Result> ExecutionBlockImpl<RemoteExecutor>::initialize
|
||||||
VPackBuilder builder(buffer, &options);
|
VPackBuilder builder(buffer, &options);
|
||||||
builder.openObject(/*unindexed*/ true);
|
builder.openObject(/*unindexed*/ true);
|
||||||
|
|
||||||
// Backwards Compatibility 3.3
|
|
||||||
// NOTE: Removing this breaks tests in current devel - is this really for
|
|
||||||
// bc only?
|
|
||||||
builder.add("exhausted", VPackValue(false));
|
|
||||||
// Used in 3.4.0 onwards
|
// Used in 3.4.0 onwards
|
||||||
builder.add("done", VPackValue(false));
|
builder.add("done", VPackValue(false));
|
||||||
builder.add("error", VPackValue(false));
|
builder.add(StaticStrings::Code, VPackValue(TRI_ERROR_NO_ERROR));
|
||||||
|
builder.add(StaticStrings::Error, VPackValue(false));
|
||||||
// NOTE API change. Before all items have been send.
|
// NOTE API change. Before all items have been send.
|
||||||
// Now only the one output row is send.
|
// Now only the one output row is send.
|
||||||
builder.add("pos", VPackValue(0));
|
builder.add("pos", VPackValue(0));
|
||||||
|
@ -338,7 +346,7 @@ std::pair<ExecutionState, Result> ExecutionBlockImpl<RemoteExecutor>::shutdown(i
|
||||||
_didReceiveShutdownRequest = true;
|
_didReceiveShutdownRequest = true;
|
||||||
|
|
||||||
TRI_ASSERT(_lastResponse == nullptr);
|
TRI_ASSERT(_lastResponse == nullptr);
|
||||||
Result res = _lastError;
|
Result res = std::move(_lastError);
|
||||||
_lastError.reset();
|
_lastError.reset();
|
||||||
|
|
||||||
if (res.is(TRI_ERROR_QUERY_NOT_FOUND)) {
|
if (res.is(TRI_ERROR_QUERY_NOT_FOUND)) {
|
||||||
|
|
|
@ -674,6 +674,7 @@ RestStatus RestAqlHandler::handleUseQuery(std::string const& operation, Query* q
|
||||||
}
|
}
|
||||||
// Used in 3.4.0 onwards.
|
// Used in 3.4.0 onwards.
|
||||||
answerBuilder.add("done", VPackValue(state == ExecutionState::DONE));
|
answerBuilder.add("done", VPackValue(state == ExecutionState::DONE));
|
||||||
|
answerBuilder.add(StaticStrings::Code, VPackValue(TRI_ERROR_NO_ERROR));
|
||||||
if (items.get() == nullptr) {
|
if (items.get() == nullptr) {
|
||||||
// Backwards Compatibility
|
// Backwards Compatibility
|
||||||
answerBuilder.add(StaticStrings::Error, VPackValue(false));
|
answerBuilder.add(StaticStrings::Error, VPackValue(false));
|
||||||
|
@ -734,7 +735,7 @@ RestStatus RestAqlHandler::handleUseQuery(std::string const& operation, Query* q
|
||||||
answerBuilder.add(StaticStrings::Code, VPackValue(res.errorNumber()));
|
answerBuilder.add(StaticStrings::Code, VPackValue(res.errorNumber()));
|
||||||
} else if (operation == "shutdown") {
|
} else if (operation == "shutdown") {
|
||||||
int errorCode =
|
int errorCode =
|
||||||
VelocyPackHelper::getNumericValue<int>(querySlice, "code", TRI_ERROR_INTERNAL);
|
VelocyPackHelper::readNumericValue<int>(querySlice, StaticStrings::Code, TRI_ERROR_INTERNAL);
|
||||||
|
|
||||||
ExecutionState state;
|
ExecutionState state;
|
||||||
Result res;
|
Result res;
|
||||||
|
|
|
@ -71,8 +71,8 @@ class RestAqlHandler : public RestVocbaseBaseHandler {
|
||||||
// "number": must be a positive integer, the cursor skips as many items,
|
// "number": must be a positive integer, the cursor skips as many items,
|
||||||
// possibly exhausting the cursor.
|
// possibly exhausting the cursor.
|
||||||
// The result is a JSON with the attributes "error" (boolean),
|
// The result is a JSON with the attributes "error" (boolean),
|
||||||
// "errorMessage" (if applicable) and "exhausted" (boolean) [3.3
|
// "errorMessage" (if applicable) and
|
||||||
// and earlier] "done" (boolean) [3.4.0 and later] to indicate
|
// "done" (boolean) [3.4.0 and later] to indicate
|
||||||
// whether or not the cursor is exhausted.
|
// whether or not the cursor is exhausted.
|
||||||
RestStatus useQuery(std::string const& operation, std::string const& idString);
|
RestStatus useQuery(std::string const& operation, std::string const& idString);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue