1
0
Fork 0

fix cluster_sync test

This commit is contained in:
jsteemann 2017-05-04 13:16:47 +02:00
parent 134b4f80ae
commit d892f280ed
5 changed files with 36 additions and 7 deletions

View File

@ -45,7 +45,8 @@ RocksDBTransactionCollection::RocksDBTransactionCollection(
_operationSize(0),
_numInserts(0),
_numUpdates(0),
_numRemoves(0) {}
_numRemoves(0),
_usageLocked(false) {}
RocksDBTransactionCollection::~RocksDBTransactionCollection() {}
@ -153,9 +154,24 @@ int RocksDBTransactionCollection::use(int nestingLevel) {
}
if (_collection == nullptr) {
TRI_vocbase_col_status_e status;
LOG_TRX(_transaction, nestingLevel) << "using collection " << _cid;
_collection = _transaction->vocbase()->useCollection(_cid, status);
// open the collection
if (!_transaction->hasHint(transaction::Hints::Hint::LOCK_NEVER) &&
!_transaction->hasHint(transaction::Hints::Hint::NO_USAGE_LOCK)) {
// use and usage-lock
TRI_vocbase_col_status_e status;
LOG_TRX(_transaction, nestingLevel) << "using collection " << _cid;
_collection = _transaction->vocbase()->useCollection(_cid, status);
if (_collection != nullptr) {
_usageLocked = true;
}
} else {
// use without usage-lock (lock already set externally)
_collection = _transaction->vocbase()->lookupCollection(_cid);
if (_collection == nullptr) {
return TRI_ERROR_ARANGO_COLLECTION_NOT_FOUND;
}
}
if (_collection == nullptr) {
int res = TRI_errno();
@ -206,7 +222,10 @@ void RocksDBTransactionCollection::release() {
// unuse collection, remove usage-lock
LOG_TRX(_transaction, 0) << "unusing collection " << _cid;
_transaction->vocbase()->releaseCollection(_collection);
if (_usageLocked) {
_transaction->vocbase()->releaseCollection(_collection);
_usageLocked = false;
}
_collection = nullptr;
}
}

View File

@ -96,6 +96,7 @@ class RocksDBTransactionCollection final : public TransactionCollection {
uint64_t _numInserts;
uint64_t _numUpdates;
uint64_t _numRemoves;
bool _usageLocked;
};
}

View File

@ -115,6 +115,11 @@ Result RocksDBTransactionState::beginTransaction(transaction::Hints hints) {
LOG_TRX(this, _nestingLevel) << "beginning " << AccessMode::typeString(_type)
<< " transaction";
if (_nestingLevel == 0) {
// set hints
_hints = hints;
}
Result result = useCollections(_nestingLevel);
if (result.ok()) {

View File

@ -77,6 +77,10 @@ class Hints {
unset(static_cast<ValueType>(value));
}
inline ValueType toInt() const {
return static_cast<ValueType>(_value);
}
private:
ValueType _value;
};

View File

@ -1387,7 +1387,7 @@ static void JS_PropertiesVocbaseCol(
SingleCollectionTransaction trx(
transaction::V8Context::Create(collection->vocbase(), true),
collection->cid(),
isModification ? AccessMode::Type::WRITE : AccessMode::Type::READ);
isModification ? AccessMode::Type::EXCLUSIVE : AccessMode::Type::READ);
if (!isModification) {
trx.addHint(transaction::Hints::Hint::NO_USAGE_LOCK);