mirror of https://gitee.com/bigwinds/arangodb
honor subcodes in rocksdb statuses
This commit is contained in:
parent
08cd4ced33
commit
4cf5fedca9
|
@ -419,8 +419,7 @@ void RocksDBCollection::truncate(transaction::Methods* trx,
|
|||
while (iter->Valid() && cmp->Compare(iter->key(), bounds.end()) < 0) {
|
||||
rocksdb::Status s = rtrx->Delete(iter->key());
|
||||
if (!s.ok()) {
|
||||
trx->abort();
|
||||
break;
|
||||
THROW_ARANGO_EXCEPTION(rocksutils::convertStatus(s, rocksutils::StatusHint::document));
|
||||
}
|
||||
|
||||
TRI_voc_rid_t revisionId = RocksDBKey::revisionId(iter->key());
|
||||
|
@ -460,8 +459,7 @@ void RocksDBCollection::truncate(transaction::Methods* trx,
|
|||
while (iter->Valid() && -1 == cmp->Compare(iter->key(), bounds.end())) {
|
||||
rocksdb::Status s = rtrx->Delete(iter->key());
|
||||
if (!s.ok()) {
|
||||
trx->abort();
|
||||
break;
|
||||
THROW_ARANGO_EXCEPTION(rocksutils::convertStatus(s, rocksutils::StatusHint::document));
|
||||
}
|
||||
iter->Next();
|
||||
}
|
||||
|
@ -480,6 +478,7 @@ int RocksDBCollection::read(transaction::Methods* trx,
|
|||
return TRI_ERROR_NO_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
// not found
|
||||
return TRI_ERROR_ARANGO_DOCUMENT_NOT_FOUND;
|
||||
}
|
||||
|
@ -1008,7 +1007,12 @@ int RocksDBCollection::removeDocument(arangodb::transaction::Methods* trx,
|
|||
|
||||
rocksdb::Transaction* rtrx = rocksTransaction(trx);
|
||||
|
||||
rtrx->Delete(key.string());
|
||||
rocksdb::Status status = rtrx->Delete(key.string());
|
||||
if (!status.ok()) {
|
||||
auto converted =
|
||||
rocksutils::convertStatus(status, rocksutils::StatusHint::document);
|
||||
return converted.errorNumber();
|
||||
}
|
||||
|
||||
auto indexes = _indexes;
|
||||
size_t const n = indexes.size();
|
||||
|
@ -1106,9 +1110,9 @@ arangodb::Result RocksDBCollection::lookupRevisionVPack(
|
|||
auto key = RocksDBKey::Document(_objectId, revisionId);
|
||||
std::string value;
|
||||
auto* state = toRocksTransactionState(trx);
|
||||
rocksdb::Status status = state->rocksTransaction()->Get(state->readOptions(),
|
||||
key.string(), &value);
|
||||
TRI_ASSERT(value.data());
|
||||
auto& options = state->readOptions();
|
||||
TRI_ASSERT(options.snapshot != nullptr);
|
||||
rocksdb::Status status = state->rocksTransaction()->Get(options, key.string(), &value);
|
||||
auto result = convertStatus(status);
|
||||
if (result.ok()) {
|
||||
mdr.setManaged(std::move(value), revisionId);
|
||||
|
|
|
@ -62,10 +62,13 @@ arangodb::Result convertStatus(rocksdb::Status const& status, StatusHint hint) {
|
|||
case rocksdb::Status::Code::kCorruption:
|
||||
return {TRI_ERROR_ARANGO_CORRUPTED_DATAFILE, status.ToString()};
|
||||
case rocksdb::Status::Code::kNotSupported:
|
||||
return {TRI_ERROR_ILLEGAL_OPTION, status.ToString()};
|
||||
return {TRI_ERROR_NOT_IMPLEMENTED, status.ToString()};
|
||||
case rocksdb::Status::Code::kInvalidArgument:
|
||||
return {TRI_ERROR_BAD_PARAMETER, status.ToString()};
|
||||
case rocksdb::Status::Code::kIOError:
|
||||
if (status.subcode() == rocksdb::Status::SubCode::kNoSpace) {
|
||||
return {TRI_ERROR_ARANGO_FILESYSTEM_FULL, status.ToString()};
|
||||
}
|
||||
return {TRI_ERROR_ARANGO_IO_ERROR, status.ToString()};
|
||||
case rocksdb::Status::Code::kMergeInProgress:
|
||||
return {TRI_ERROR_ARANGO_MERGE_IN_PROGRESS, status.ToString()};
|
||||
|
@ -74,10 +77,18 @@ arangodb::Result convertStatus(rocksdb::Status const& status, StatusHint hint) {
|
|||
case rocksdb::Status::Code::kShutdownInProgress:
|
||||
return {TRI_ERROR_SHUTTING_DOWN, status.ToString()};
|
||||
case rocksdb::Status::Code::kTimedOut:
|
||||
if (status.subcode() == rocksdb::Status::SubCode::kMutexTimeout ||
|
||||
status.subcode() == rocksdb::Status::SubCode::kLockTimeout) {
|
||||
// TODO: maybe add a separator error code/message here
|
||||
return {TRI_ERROR_LOCK_TIMEOUT, status.ToString()};
|
||||
}
|
||||
return {TRI_ERROR_LOCK_TIMEOUT, status.ToString()};
|
||||
case rocksdb::Status::Code::kAborted:
|
||||
return {TRI_ERROR_TRANSACTION_ABORTED, status.ToString()};
|
||||
case rocksdb::Status::Code::kBusy:
|
||||
if (status.subcode() == rocksdb::Status::SubCode::kDeadlock) {
|
||||
return {TRI_ERROR_DEADLOCK};
|
||||
}
|
||||
return {TRI_ERROR_ARANGO_BUSY, status.ToString()};
|
||||
case rocksdb::Status::Code::kExpired:
|
||||
return {TRI_ERROR_INTERNAL, "key expired; TTL was set in error"};
|
||||
|
|
Loading…
Reference in New Issue