8000 Feature/strict typing for error codes (#13484) · arangodb/arangodb@0e41342 · GitHub
[go: up one dir, main page]

Skip to content

Commit 0e41342

Browse files
goedderzjsteemann
andauthored
Feature/strict typing for error codes (#13484)
Co-authored-by: Jan <jsteemann@users.noreply.github.com>
1 parent 78e1fa8 commit 0e41342

File tree

180 files changed

+1649
-1435
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

180 files changed

+1649
-1435
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1258,7 +1258,7 @@ if (USE_MAINTAINER_MODE)
12581258
COMMAND ${PYTHON_EXECUTABLE} ./utils/generateErrorfile.py ./${ERRORS_DAT} ./${m}.tmp
12591259
COMMAND ${CMAKE_COMMAND} -E copy_if_different ./${m}.tmp ./${m}
12601260
COMMAND ${CMAKE_COMMAND} -E remove ./${m}.tmp
1261-
DEPENDS ${CMAKE_SOURCE_DIR}/${ERRORS_DAT}
1261+
DEPENDS ${CMAKE_SOURCE_DIR}/${ERRORS_DAT} ./utils/generateErrorfile.py
12621262
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
12631263
COMMENT "Building errors files ${m}"
12641264
VERBATIM

arangod/Agency/AgencyComm.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -425,16 +425,16 @@ int AgencyCommResult::httpCode() const { return _statusCode; }
425425

426426
bool AgencyCommResult::sent() const { return _sent; }
427427

428-
int AgencyCommResult::errorCode() const {
428+
ErrorCode AgencyCommResult::errorCode() const {
429429
return asResult().errorNumber();
430430
}
431431

432432
std::string AgencyCommResult::errorMessage() const {
433433
return std::string{asResult().errorMessage()};
434434
}
435435

436-
std::pair<std::optional<int>, std::optional<std::string_view>> AgencyCommResult::parseBodyError() const {
437-
auto result = std::pair<std::optional<int>, std::optional<std::string_view>>{};
436+
std::pair<std::optional<ErrorCode>, std::optional<std::string_view>> AgencyCommResult::parseBodyError() const {
437+
auto result = std::pair<std::optional<ErrorCode>, std::optional<std::string_view>>{};
438438

439439
if (_vpack != nullptr) {
440440
auto const body = _vpack->slice();
@@ -443,7 +443,7 @@ std::pair<std::optional<int>, std::optional<std::string_view>> AgencyCommResult:
443443
try {
444444
auto const errorCode = body.get(StaticStrings::ErrorCode).getNumber<int>();
445445
// Save error code if possible, set default error message first
446-
result.first = errorCode;
446+
result.first = ErrorCode{errorCode};
447447
} catch (VPackException const&) {
448448
}
449449

@@ -482,11 +482,11 @@ Result AgencyCommResult::asResult() const {
482482
return Result{};
483483
} else {
484484
auto const err = parseBodyError();
485-
auto const errorCode = std::invoke([&]() -> int {
485+
auto const errorCode = std::invoke([&]() -> ErrorCode {
486486
if (err.first) {
487487
return *err.first;
488488
} else if (_statusCode > 0) {
489-
return _statusCode;
489+
return ErrorCode{_statusCode};
490490
} else {
491491
return TRI_ERROR_INTERNAL;
492492
}

arangod/Agency/AgencyComm.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ class AgencyCommResult {
311311

312312
[[nodiscard]] int httpCode() const;
313313

314-
[[nodiscard]] int errorCode() const;
314+
[[nodiscard]] ErrorCode errorCode() const;
315315

316316
[[nodiscard]] std::string errorMessage() const;
317317

@@ -337,7 +337,7 @@ class AgencyCommResult {
337337

338338
[[nodiscard]] VPackBuilder toVelocyPack() const;
339339

340-
[[nodiscard]] std::pair<std::optional<int>, std::optional<std::string_view>> parseBodyError() const;
340+
[[nodiscard]] std::pair<std::optional<ErrorCode>, std::optional<std::string_view>> parseBodyError() const;
341341

342342
public:
343343
std::string _location = "";

arangod/Agency/Agent.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2032,7 +2032,7 @@ query_t Agent::gossip(VPackSlice slice, bool isCallback, size_t version) {
20322032

20332033
if (!slice.isObject()) {
20342034
THROW_ARANGO_EXCEPTION_MESSAGE(
2035-
20001,
2035+
TRI_ERROR_AGENCY_MALFORMED_GOSSIP_MESSAGE,
20362036
std::string("Gossip message must be an object. Incoming type is ") +
20372037
slice.typeName());
20382038
}
@@ -2052,7 +2052,8 @@ query_t Agent::gossip(VPackSlice slice, bool isCallback, size_t version) {
20522052

20532053
if (!slice.hasKey("id") || !slice.get("id").isString()) {
20542054
THROW_ARANGO_EXCEPTION_MESSAGE(
2055-
20002, "Gossip message must contain string parameter 'id'");
2055+
TRI_ERROR_AGENCY_MALFORMED_GOSSIP_MESSAGE,
2056+
"Gossip message must contain string parameter 'id'");
20562057
}
20572058
std::string id = slice.get("id").copyString();
20582059

@@ -2072,7 +2073,8 @@ query_t Agent::gossip(VPackSlice slice, bool isCallback, size_t version) {
20722073

20732074
if (!slice.hasKey("endpoint") || !slice.get("endpoint").isString()) {
20742075
THROW_ARANGO_EXCEPTION_MESSAGE(
2075-
20003, "Gossip message must contain string parameter 'endpoint'");
2076+
TRI_ERROR_AGENCY_MALFORMED_GOSSIP_MESSAGE,
2077+
"Gossip message must contain string parameter 'endpoint'");
20762078
}
20772079
std::string endpoint = slice.get("endpoint").copyString();
20782080

@@ -2085,15 +2087,17 @@ query_t Agent::gossip(VPackSlice slice, bool isCallback, size_t version) {
20852087

20862088
if (!slice.hasKey("pool") || !slice.get("pool").isObject()) {
20872089
THROW_ARANGO_EXCEPTION_MESSAGE(
2088-
20003, "Gossip message must contain object parameter 'pool'");
2090+
TRI_ERROR_AGENCY_MALFORMED_GOSSIP_MESSAGE,
2091+
"Gossip message must contain object parameter 'pool'");
20892092
}
20902093
VPackSlice pslice = slice.get("pool");
20912094

20922095
LOG_TOPIC("65dd8", TRACE, Logger::AGENCY) << "Received gossip " << slice.toJson();
20932096
for (auto pair : VPackObjectIterator(pslice)) {
20942097
if (!pair.value.isString()) {
20952098
THROW_ARANGO_EXCEPTION_MESSAGE(
2096-
20004, "Gossip message pool must contain string parameters");
2099+
TRI_ERROR_AGENCY_MALFORMED_GOSSIP_MESSAGE,
2100+
"Gossip message pool must contain string parameters");
20972101
}
20982102
}
20992103

arangod/Agency/AsyncAgencyComm.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
#include "Basics/debugging.h"
4242
#include "Futures/Future.h"
4343
#include "Network/Methods.h"
44+
#include "Network/Utils.h"
4445

4546
namespace arangodb {
4647

@@ -84,13 +85,14 @@ struct AsyncAgencyCommResult {
8485
return response->statusCode();
8586
}
8687

87-
Result asResult() {
88+
[[nodiscard]] Result asResult() const {
89+
using namespace arangodb::network;
8890
if (!ok()) {
89-
return Result{int(error), to_string(error)};
90-
} else if (200 <= statusCode() && statusCode() <= 299) {
91-
return Result{};
91+
return Result{fuerteToArangoErrorCode(error), to_string(error)};
9292
} else {
93-
return Result{int(statusCode())};
93+
auto code = statusCode();
94+
return Result{fuerteStatusToArangoErrorCode(code),
95+
fuerteStatusToArangoErrorMessage(code)};
9496
}
9597
}
9698
};

arangod/Agency/RemoveFollower.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -441,8 +441,8 @@ arangodb::Result RemoveFollower::abort(std::string const& reason) {
441441
Result result;
442442
// We can assume that the job is in ToDo or not there:
443443
if (_status == NOTFOUND || _status == FINISHED || _status == FAILED) {
444-
result =
445-
Result(1, "Failed aborting RemoveFollower job beyond pending stage");
444+
result = Result(TRI_ERROR_INTERNAL,
445+
"Failed aborting RemoveFollower job beyond pending stage");
446446
return result;
447447
}
448448
// Can now only be TODO or PENDING

arangod/Agency/RestAgencyHandler.cpp

Lines changed: 71 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -53,21 +53,21 @@ RestAgencyHandler::RestAgencyHandler(application_features::ApplicationServer& se
5353
inline RestStatus RestAgencyHandler::reportErrorEmptyRequest() {
5454
LOG_TOPIC("46536", WARN, Logger::AGENCY)
5555
<< "Empty request to public agency interface.";
56-
generateError(rest::ResponseCode::NOT_FOUND, 404);
56+
generateError(rest::ResponseCode::NOT_FOUND, TRI_ERROR_HTTP_NOT_FOUND);
5757
return RestStatus::DONE;
5858
}
5959

6060
inline RestStatus RestAgencyHandler::reportTooManySuffices() {
6161
LOG_TOPIC("ef6ae", WARN, Logger::AGENCY)
6262
<< "Too many suffixes. Agency public interface takes one path.";
63-
generateError(rest::ResponseCode::NOT_FOUND, 404);
63+
generateError(rest::ResponseCode::NOT_FOUND, TRI_ERROR_HTTP_NOT_FOUND);
6464
return RestStatus::DONE;
6565
}
6666

6767
inline RestStatus RestAgencyHandler::reportUnknownMethod() {
6868
LOG_TOPIC("9b810", WARN, Logger::AGENCY)
6969
<< "Public REST interface has no method " << _request->suffixes()[0];
70-
generateError(rest::ResponseCode::NOT_FOUND, 405);
70+
generateError(rest::ResponseCode::NOT_FOUND, TRI_ERROR_HTTP_NOT_FOUND);
7171
return RestStatus::DONE;
7272
}
7373

@@ -162,74 +162,72 @@ RestStatus RestAgencyHandler::pollIndex(
162162

163163
if (std::get<1>(pollResult)) {
164164
return waitForFuture(
165-
std::move(std::get<0>(pollResult)).thenValue([this, start](std::shared_ptr<VPackBuilder>&& rb) {
166-
VPackSlice res = rb->slice();
167-
168-
if (res.isObject() && res.hasKey("result")) {
169-
170-
if (res.hasKey("error")) { // leadership loss
171-
generateError(
172-
rest::ResponseCode::SERVICE_UNAVAILABLE,
173-
TRI_ERROR_HTTP_SERVICE_UNAVAILABLE, "No leader");
174-
return;
175-
}
176-
177-
VPackSlice slice = res.get("result");
178-
179-
if (slice.hasKey("log")) {
180-
VPackBuilder builder;
181-
{
182-
VPackObjectBuilder ob(&builder);
183-
builder.add(StaticStrings::Error, VPackValue(false));
184-
builder.add("code", VPackValue(int(ResponseCode::OK)));
185-
builder.add(VPackValue("result"));
186-
VPackObjectBuilder r(&builder);
187-
if (!slice.get("firstIndex").isNumber()) {
188-
generateError(
189-
rest::ResponseCode::SERVER_ERROR,
190-
TRI_ERROR_HTTP_SERVER_ERROR, "invalid first log index.");
191-
return;
192-
} else if (slice.get("firstIndex").getNumber<uint64_t>() > start) {
193-
generateError(
194-
rest::ResponseCode::SERVER_ERROR,
195-
TRI_ERROR_HTTP_SERVER_ERROR, "first log index is greater than requested.");
196-
return;
197-
}
198-
uint64_t firstIndex = slice.get("firstIndex").getNumber<uint64_t>(), i = 0;
165+
std::move(std::get<0>(pollResult))
166+
.thenValue([this, start](std::shared_ptr<VPackBuilder>&& rb) {
167+
VPackSlice res = rb->slice();
168+
169+
if (res.isObject() && res.hasKey("result")) {
170+
if (res.hasKey("error")) { // leadership loss
171+
generateError(rest::ResponseCode::SERVICE_UNAVAILABLE,
172+
TRI_ERROR_HTTP_SERVICE_UNAVAILABLE, "No leader");
173+
return;
174+
}
199175

200-
builder.add("commitIndex", slice.get("commitIndex"));
201-
VPackSlice logs = slice.get("log");
202-
if (start <= firstIndex) {
203-
builder.add("firstIndex", logs[i].get("index"));
204-
}
205-
builder.add(VPackValue("log"));
206-
VPackArrayBuilder a(&builder);
207-
if (start <= firstIndex) {
208-
uint64_t i = start - firstIndex;
209-
for (; i < logs.length(); ++i) {
210-
builder.add(logs[i]);
176+
VPackSlice slice = res.get("result");
177+
178+
if (slice.hasKey("log")) {
179+
VPackBuilder builder;
180+
{
181+
VPackObjectBuilder ob(&builder);
182+
builder.add(StaticStrings::Error, VPackValue(false));
183+
builder.add("code", VPackValue(int(ResponseCode::OK)));
184+
builder.add(VPackValue("result"));
185+
VPackObjectBuilder r(&builder);
186+
if (!slice.get("firstIndex").isNumber()) {
187+
generateError(rest::ResponseCode::SERVER_ERROR, TRI_ERROR_HTTP_SERVER_ERROR,
188+
"invalid first log index.");
189+
return;
190+
} else if (slice.get("firstIndex").getNumber<uint64_t>() > start) {
191+
generateError(
192+
rest::ResponseCode::SERVER_ERROR, TRI_ERROR_HTTP_SERVER_ERROR,
193+
"first log index is greater than requested.");
194+
return;
195+
}
196+
uint64_t firstIndex = slice.get("firstIndex").getNumber<uint64_t>(),
197+
i = 0;
198+
199+
builder.add("commitIndex", slice.get("commitIndex"));
200+
VPackSlice logs = slice.get("log");
201+
if (start <= firstIndex) {
202+
builder.add("firstIndex", logs[i].get("index"));
203+
}
204+
builder.add(VPackValue("log"));
205+
VPackArrayBuilder a(&builder);
206+
if (start <= firstIndex) {
207+
uint64_t i = start - firstIndex;
208+
for (; i < logs.length(); ++i) {
209+
builder.add(logs[i]);
210+
}
211+
}
212+
}
213+
generateResult(rest::ResponseCode::OK, std::move(*builder.steal()));
214+
return;
215+
} else {
216+
generateResult(rest::ResponseCode::OK, std::move(*rb->steal()));
217+
return;
211218
}
219+
} else {
220+
generateError(rest::ResponseCode::SERVICE_UNAVAILABLE,
221+
TRI_ERROR_HTTP_SERVICE_UNAVAILABLE, "No leader");
212222
}
213-
}
214-
generateResult(rest::ResponseCode::OK, std::move(*builder.steal()));
215-
return;
216-
} else {
217-
generateResult(rest::ResponseCode::OK, std::move(*rb->steal()));
218-
return;
219-
}
220-
} else {
221-
generateError(
222-
rest::ResponseCode::SERVICE_UNAVAILABLE,
223-
TRI_ERROR_HTTP_SERVICE_UNAVAILABLE, "No leader");
224-
}
225-
})
226-
.thenError<VPackException>([this](VPackException const& e) {
227-
generateError(Result{e.errorCode(), e.what()});
228-
})
229-
.thenError<std::exception>([this](std::exception const& e) {
230-
generateError(
231-
rest::ResponseCode::SERVER_ERROR, TRI_ERROR_HTTP_SERVER_ERROR, e.what());
232-
}));
223+
})
224+
.thenError<VPackException>([this](VPackException const& e) {
225+
generateError(Result{TRI_ERROR_HTTP_SERVER_ERROR, e.what()});
226+
})
227+
.thenError<std::exception>([this](std::exception const& e) {
228+
generateError(rest::ResponseCode::SERVER_ERROR,
229+
TRI_ERROR_HTTP_SERVER_ERROR, e.what());
230+
}));
233231
} else {
234232
auto const& leader = std::get<2>(pollResult);
235233
if (leader == NO_LEADER) {
@@ -346,7 +344,7 @@ RestStatus RestAgencyHandler::handleStore() {
346344
query_t builder = _agent->buildDB(index);
347345
generateResult(rest::ResponseCode::OK, builder->slice());
348346
} catch (...) {
349-
generateError(rest::ResponseCode::BAD, 400);
347+
generateError(rest::ResponseCode::BAD, TRI_ERROR_HTTP_BAD_PARAMETER);
350348
}
351349

352350
return RestStatus::DONE;
@@ -458,7 +456,7 @@ RestStatus RestAgencyHandler::handleWrite() {
458456
if (result == Agent::raft_commit_t::UNKNOWN) {
459457
generateError(rest::ResponseCode::SERVICE_UNAVAILABLE, TRI_ERROR_HTTP_SERVICE_UNAVAILABLE);
460458
} else if (result == Agent::raft_commit_t::TIMEOUT) {
461-
generateError(rest::ResponseCode::REQUEST_TIMEOUT, 408);
459+
generateError(rest::ResponseCode::REQUEST_TIMEOUT, TRI_ERROR_HTTP_REQUEST_TIMEOUT);
462460
} else {
463461
if (forbidden > 0) {
464462
generateResult(rest::ResponseCode::FORBIDDEN, body.slice());
@@ -554,7 +552,7 @@ RestStatus RestAgencyHandler::handleInquire() {
554552
query = _request->toVelocyPackBuilderPtr();
555553
} catch (std::exception const& ex) {
556554
LOG_TOPIC("78755", DEBUG, Logger::AGENCY) << ex.what();
557-
generateError(rest::ResponseCode::BAD, 400);
555+
generateError(rest::ResponseCode::BAD, TRI_ERROR_HTTP_BAD_PARAMETER);
558556
return RestStatus::DONE;
559557
}
560558

@@ -628,7 +626,7 @@ RestStatus RestAgencyHandler::handleInquire() {
628626
if (result == Agent::raft_commit_t::UNKNOWN) {
629627
generateError(rest::ResponseCode::SERVICE_UNAVAILABLE, TRI_ERROR_HTTP_SERVICE_UNAVAILABLE);
630628
} else if (result == Agent::raft_commit_t::TIMEOUT) {
631-
generateError(rest::ResponseCode::REQUEST_TIMEOUT, 408);
629+
generateError(rest::ResponseCode::REQUEST_TIMEOUT, TRI_ERROR_HTTP_REQUEST_TIMEOUT);
632630
} else {
633631
if (failed) { // Some/all requests failed
634632
generateResult(rest::ResponseCode::NOT_FOUND, body.slice());
@@ -761,7 +759,7 @@ RestStatus RestAgencyHandler::handleState() {
761759
}
762760

763761
RestStatus RestAgencyHandler::reportMethodNotAllowed() {
764-
generateError(rest::ResponseCode::METHOD_NOT_ALLOWED, 405);
762+
generateError(rest::ResponseCode::METHOD_NOT_ALLOWED, TRI_ERROR_HTTP_METHOD_NOT_ALLOWED);
765763
return RestStatus::DONE;
766764
}
767765

0 commit comments

Comments
 (0)
0