1
0
Fork 0

only build the status messages if actually necessary (#9318)

This commit is contained in:
Jan 2019-06-25 10:16:12 +02:00 committed by GitHub
parent 086c4e7b82
commit a5a656adbd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 30 deletions

View File

@ -78,76 +78,73 @@ static VPackBuilder& stripObjectIdsImpl(VPackBuilder& builder, VPackSlice const&
return builder; return builder;
} }
arangodb::Result convertStatus(rocksdb::Status const& status, StatusHint hint, arangodb::Result convertStatus(rocksdb::Status const& status, StatusHint hint) {
std::string const& prefix, std::string const& postfix) {
std::string message = prefix + status.ToString() + postfix;
switch (status.code()) { switch (status.code()) {
case rocksdb::Status::Code::kOk: case rocksdb::Status::Code::kOk:
return {TRI_ERROR_NO_ERROR}; return {TRI_ERROR_NO_ERROR};
case rocksdb::Status::Code::kNotFound: case rocksdb::Status::Code::kNotFound:
switch (hint) { switch (hint) {
case StatusHint::collection: case StatusHint::collection:
return {TRI_ERROR_ARANGO_DATA_SOURCE_NOT_FOUND, std::move(message)}; return {TRI_ERROR_ARANGO_DATA_SOURCE_NOT_FOUND, status.ToString()};
case StatusHint::database: case StatusHint::database:
return {TRI_ERROR_ARANGO_DATABASE_NOT_FOUND, std::move(message)}; return {TRI_ERROR_ARANGO_DATABASE_NOT_FOUND, status.ToString()};
case StatusHint::document: case StatusHint::document:
return {TRI_ERROR_ARANGO_DOCUMENT_NOT_FOUND, std::move(message)}; return {TRI_ERROR_ARANGO_DOCUMENT_NOT_FOUND, status.ToString()};
case StatusHint::index: case StatusHint::index:
return {TRI_ERROR_ARANGO_INDEX_NOT_FOUND, std::move(message)}; return {TRI_ERROR_ARANGO_INDEX_NOT_FOUND, status.ToString()};
case StatusHint::view: case StatusHint::view:
return {TRI_ERROR_ARANGO_DATA_SOURCE_NOT_FOUND, std::move(message)}; return {TRI_ERROR_ARANGO_DATA_SOURCE_NOT_FOUND, status.ToString()};
case StatusHint::wal: case StatusHint::wal:
// suppress this error if the WAL is queried for changes that are not // suppress this error if the WAL is queried for changes that are not
// available // available
return {TRI_ERROR_NO_ERROR}; return {TRI_ERROR_NO_ERROR};
default: default:
return {TRI_ERROR_ARANGO_DOCUMENT_NOT_FOUND, std::move(message)}; return {TRI_ERROR_ARANGO_DOCUMENT_NOT_FOUND, status.ToString()};
} }
case rocksdb::Status::Code::kCorruption: case rocksdb::Status::Code::kCorruption:
return {TRI_ERROR_ARANGO_CORRUPTED_DATAFILE, std::move(message)}; return {TRI_ERROR_ARANGO_CORRUPTED_DATAFILE, status.ToString()};
case rocksdb::Status::Code::kNotSupported: case rocksdb::Status::Code::kNotSupported:
return {TRI_ERROR_NOT_IMPLEMENTED, std::move(message)}; return {TRI_ERROR_NOT_IMPLEMENTED, status.ToString()};
case rocksdb::Status::Code::kInvalidArgument: case rocksdb::Status::Code::kInvalidArgument:
return {TRI_ERROR_BAD_PARAMETER, std::move(message)}; return {TRI_ERROR_BAD_PARAMETER, status.ToString()};
case rocksdb::Status::Code::kIOError: case rocksdb::Status::Code::kIOError:
if (status.subcode() == rocksdb::Status::SubCode::kNoSpace) { if (status.subcode() == rocksdb::Status::SubCode::kNoSpace) {
return {TRI_ERROR_ARANGO_FILESYSTEM_FULL, std::move(message)}; return {TRI_ERROR_ARANGO_FILESYSTEM_FULL, status.ToString()};
} }
return {TRI_ERROR_ARANGO_IO_ERROR, std::move(message)}; return {TRI_ERROR_ARANGO_IO_ERROR, status.ToString()};
case rocksdb::Status::Code::kMergeInProgress: case rocksdb::Status::Code::kMergeInProgress:
return {TRI_ERROR_ARANGO_MERGE_IN_PROGRESS, std::move(message)}; return {TRI_ERROR_ARANGO_MERGE_IN_PROGRESS, status.ToString()};
case rocksdb::Status::Code::kIncomplete: case rocksdb::Status::Code::kIncomplete:
return {TRI_ERROR_ARANGO_INCOMPLETE_READ, return {TRI_ERROR_ARANGO_INCOMPLETE_READ, "'incomplete' error in storage engine: " + status.ToString()};
prefix + "'incomplete' error in storage engine " + postfix};
case rocksdb::Status::Code::kShutdownInProgress: case rocksdb::Status::Code::kShutdownInProgress:
return {TRI_ERROR_SHUTTING_DOWN, std::move(message)}; return {TRI_ERROR_SHUTTING_DOWN, status.ToString()};
case rocksdb::Status::Code::kTimedOut: case rocksdb::Status::Code::kTimedOut:
if (status.subcode() == rocksdb::Status::SubCode::kMutexTimeout) { if (status.subcode() == rocksdb::Status::SubCode::kMutexTimeout) {
return {TRI_ERROR_LOCK_TIMEOUT, std::move(message)}; return {TRI_ERROR_LOCK_TIMEOUT, status.ToString()};
} }
if (status.subcode() == rocksdb::Status::SubCode::kLockTimeout) { if (status.subcode() == rocksdb::Status::SubCode::kLockTimeout) {
return {TRI_ERROR_ARANGO_CONFLICT, return {TRI_ERROR_ARANGO_CONFLICT,
prefix + "timeout waiting to lock key " + postfix}; "timeout waiting to lock key " + status.ToString()};
} }
return {TRI_ERROR_LOCK_TIMEOUT, std::move(message)}; return {TRI_ERROR_LOCK_TIMEOUT, status.ToString()};
case rocksdb::Status::Code::kAborted: case rocksdb::Status::Code::kAborted:
return {TRI_ERROR_TRANSACTION_ABORTED, std::move(message)}; return {TRI_ERROR_TRANSACTION_ABORTED, status.ToString()};
case rocksdb::Status::Code::kBusy: case rocksdb::Status::Code::kBusy:
if (status.subcode() == rocksdb::Status::SubCode::kDeadlock) { if (status.subcode() == rocksdb::Status::SubCode::kDeadlock) {
return {TRI_ERROR_DEADLOCK}; return {TRI_ERROR_DEADLOCK, status.ToString()};
} }
if (status.subcode() == rocksdb::Status::SubCode::kLockLimit) { if (status.subcode() == rocksdb::Status::SubCode::kLockLimit) {
// should actually not occur with our RocksDB configuration // should actually not occur with our RocksDB configuration
return {TRI_ERROR_RESOURCE_LIMIT, return {TRI_ERROR_RESOURCE_LIMIT,
prefix + "failed to acquire lock due to lock number limit " + postfix}; "failed to acquire lock due to lock number limit " + status.ToString()};
} }
return {TRI_ERROR_ARANGO_CONFLICT, "write-write conflict"}; return {TRI_ERROR_ARANGO_CONFLICT, "write-write conflict"};
case rocksdb::Status::Code::kExpired: case rocksdb::Status::Code::kExpired:
return {TRI_ERROR_INTERNAL, prefix + "key expired; TTL was set in error " + postfix}; return {TRI_ERROR_INTERNAL, "key expired; TTL was set in error " + status.ToString()};
case rocksdb::Status::Code::kTryAgain: case rocksdb::Status::Code::kTryAgain:
return {TRI_ERROR_ARANGO_TRY_AGAIN, std::move(message)}; return {TRI_ERROR_ARANGO_TRY_AGAIN, status.ToString()};
default: default:
return {TRI_ERROR_INTERNAL, prefix + "unknown RocksDB status code " + postfix}; return {TRI_ERROR_INTERNAL, "unknown RocksDB status code " + status.ToString()};
} }
} }

View File

@ -43,9 +43,8 @@ namespace rocksutils {
enum StatusHint { none, document, collection, view, index, database, wal }; enum StatusHint { none, document, collection, view, index, database, wal };
arangodb::Result convertStatus(rocksdb::Status const&, StatusHint hint = StatusHint::none, arangodb::Result convertStatus(rocksdb::Status const&, StatusHint hint = StatusHint::none);
std::string const& prefix = StaticStrings::Empty,
std::string const& postfix = StaticStrings::Empty);
std::pair<VPackSlice, std::unique_ptr<VPackBuffer<uint8_t>>> stripObjectIds( std::pair<VPackSlice, std::unique_ptr<VPackBuffer<uint8_t>>> stripObjectIds(
VPackSlice const& inputSlice, bool checkBeforeCopy = true); VPackSlice const& inputSlice, bool checkBeforeCopy = true);