1
0
Fork 0

honor subcodes in rocksdb statuses

This commit is contained in:
jsteemann 2017-04-07 14:55:55 +02:00
parent 08cd4ced33
commit 4cf5fedca9
2 changed files with 24 additions and 9 deletions

View File

@ -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);

View File

@ -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"};