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) {
|
while (iter->Valid() && cmp->Compare(iter->key(), bounds.end()) < 0) {
|
||||||
rocksdb::Status s = rtrx->Delete(iter->key());
|
rocksdb::Status s = rtrx->Delete(iter->key());
|
||||||
if (!s.ok()) {
|
if (!s.ok()) {
|
||||||
trx->abort();
|
THROW_ARANGO_EXCEPTION(rocksutils::convertStatus(s, rocksutils::StatusHint::document));
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TRI_voc_rid_t revisionId = RocksDBKey::revisionId(iter->key());
|
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())) {
|
while (iter->Valid() && -1 == cmp->Compare(iter->key(), bounds.end())) {
|
||||||
rocksdb::Status s = rtrx->Delete(iter->key());
|
rocksdb::Status s = rtrx->Delete(iter->key());
|
||||||
if (!s.ok()) {
|
if (!s.ok()) {
|
||||||
trx->abort();
|
THROW_ARANGO_EXCEPTION(rocksutils::convertStatus(s, rocksutils::StatusHint::document));
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
iter->Next();
|
iter->Next();
|
||||||
}
|
}
|
||||||
|
@ -480,6 +478,7 @@ int RocksDBCollection::read(transaction::Methods* trx,
|
||||||
return TRI_ERROR_NO_ERROR;
|
return TRI_ERROR_NO_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// not found
|
// not found
|
||||||
return TRI_ERROR_ARANGO_DOCUMENT_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);
|
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;
|
auto indexes = _indexes;
|
||||||
size_t const n = indexes.size();
|
size_t const n = indexes.size();
|
||||||
|
@ -1106,9 +1110,9 @@ arangodb::Result RocksDBCollection::lookupRevisionVPack(
|
||||||
auto key = RocksDBKey::Document(_objectId, revisionId);
|
auto key = RocksDBKey::Document(_objectId, revisionId);
|
||||||
std::string value;
|
std::string value;
|
||||||
auto* state = toRocksTransactionState(trx);
|
auto* state = toRocksTransactionState(trx);
|
||||||
rocksdb::Status status = state->rocksTransaction()->Get(state->readOptions(),
|
auto& options = state->readOptions();
|
||||||
key.string(), &value);
|
TRI_ASSERT(options.snapshot != nullptr);
|
||||||
TRI_ASSERT(value.data());
|
rocksdb::Status status = state->rocksTransaction()->Get(options, key.string(), &value);
|
||||||
auto result = convertStatus(status);
|
auto result = convertStatus(status);
|
||||||
if (result.ok()) {
|
if (result.ok()) {
|
||||||
mdr.setManaged(std::move(value), revisionId);
|
mdr.setManaged(std::move(value), revisionId);
|
||||||
|
|
|
@ -62,10 +62,13 @@ arangodb::Result convertStatus(rocksdb::Status const& status, StatusHint hint) {
|
||||||
case rocksdb::Status::Code::kCorruption:
|
case rocksdb::Status::Code::kCorruption:
|
||||||
return {TRI_ERROR_ARANGO_CORRUPTED_DATAFILE, status.ToString()};
|
return {TRI_ERROR_ARANGO_CORRUPTED_DATAFILE, status.ToString()};
|
||||||
case rocksdb::Status::Code::kNotSupported:
|
case rocksdb::Status::Code::kNotSupported:
|
||||||
return {TRI_ERROR_ILLEGAL_OPTION, status.ToString()};
|
return {TRI_ERROR_NOT_IMPLEMENTED, status.ToString()};
|
||||||
case rocksdb::Status::Code::kInvalidArgument:
|
case rocksdb::Status::Code::kInvalidArgument:
|
||||||
return {TRI_ERROR_BAD_PARAMETER, status.ToString()};
|
return {TRI_ERROR_BAD_PARAMETER, status.ToString()};
|
||||||
case rocksdb::Status::Code::kIOError:
|
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()};
|
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, status.ToString()};
|
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:
|
case rocksdb::Status::Code::kShutdownInProgress:
|
||||||
return {TRI_ERROR_SHUTTING_DOWN, status.ToString()};
|
return {TRI_ERROR_SHUTTING_DOWN, status.ToString()};
|
||||||
case rocksdb::Status::Code::kTimedOut:
|
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()};
|
return {TRI_ERROR_LOCK_TIMEOUT, status.ToString()};
|
||||||
case rocksdb::Status::Code::kAborted:
|
case rocksdb::Status::Code::kAborted:
|
||||||
return {TRI_ERROR_TRANSACTION_ABORTED, status.ToString()};
|
return {TRI_ERROR_TRANSACTION_ABORTED, status.ToString()};
|
||||||
case rocksdb::Status::Code::kBusy:
|
case rocksdb::Status::Code::kBusy:
|
||||||
|
if (status.subcode() == rocksdb::Status::SubCode::kDeadlock) {
|
||||||
|
return {TRI_ERROR_DEADLOCK};
|
||||||
|
}
|
||||||
return {TRI_ERROR_ARANGO_BUSY, status.ToString()};
|
return {TRI_ERROR_ARANGO_BUSY, status.ToString()};
|
||||||
case rocksdb::Status::Code::kExpired:
|
case rocksdb::Status::Code::kExpired:
|
||||||
return {TRI_ERROR_INTERNAL, "key expired; TTL was set in error"};
|
return {TRI_ERROR_INTERNAL, "key expired; TTL was set in error"};
|
||||||
|
|
Loading…
Reference in New Issue