1
0
Fork 0

turn off deadlock detector in obvious cases in which it is not necessary

This commit is contained in:
jsteemann 2017-04-27 13:16:52 +02:00
parent 22028f14b7
commit 66ec078bd5
4 changed files with 14 additions and 8 deletions

View File

@ -54,6 +54,7 @@
#include "StorageEngine/EngineSelectorFeature.h"
#include "StorageEngine/StorageEngine.h"
#include "Transaction/Helpers.h"
#include "Transaction/Hints.h"
#include "Transaction/Methods.h"
#include "Transaction/StandaloneContext.h"
#include "Utils/CollectionNameResolver.h"
@ -1889,7 +1890,7 @@ int MMFilesCollection::read(transaction::Methods* trx, VPackSlice const key,
}
bool const useDeadlockDetector =
(lock && !trx->isSingleOperationTransaction());
(lock && !trx->isSingleOperationTransaction() && !trx->state()->hasHint(transaction::Hints::Hint::NO_DLD));
MMFilesCollectionReadLocker collectionLocker(this, useDeadlockDetector, lock);
int res = lookupDocument(trx, key, result);
@ -2772,7 +2773,7 @@ int MMFilesCollection::insert(transaction::Methods* trx, VPackSlice const slice,
{
// use lock?
bool const useDeadlockDetector =
(lock && !trx->isSingleOperationTransaction());
(lock && !trx->isSingleOperationTransaction() && !trx->state()->hasHint(transaction::Hints::Hint::NO_DLD));
try {
// TODO Do we use the CollectionLocker on LogicalCollections
// or do we use it on the SE specific one?
@ -3115,7 +3116,7 @@ int MMFilesCollection::update(
TRI_IF_FAILURE("UpdateDocumentNoLock") { return TRI_ERROR_DEBUG; }
bool const useDeadlockDetector =
(lock && !trx->isSingleOperationTransaction());
(lock && !trx->isSingleOperationTransaction() && !trx->state()->hasHint(transaction::Hints::Hint::NO_DLD));
arangodb::MMFilesCollectionWriteLocker collectionLocker(
this, useDeadlockDetector, lock);
@ -3253,7 +3254,7 @@ int MMFilesCollection::replace(
}
bool const useDeadlockDetector =
(lock && !trx->isSingleOperationTransaction());
(lock && !trx->isSingleOperationTransaction() && !trx->state()->hasHint(transaction::Hints::Hint::NO_DLD));
arangodb::MMFilesCollectionWriteLocker collectionLocker(
this, useDeadlockDetector, lock);
@ -3420,7 +3421,7 @@ int MMFilesCollection::remove(arangodb::transaction::Methods* trx,
TRI_VOC_DOCUMENT_OPERATION_REMOVE);
bool const useDeadlockDetector =
(lock && !trx->isSingleOperationTransaction());
(lock && !trx->isSingleOperationTransaction() && !trx->state()->hasHint(transaction::Hints::Hint::NO_DLD));
arangodb::MMFilesCollectionWriteLocker collectionLocker(
this, useDeadlockDetector, lock);

View File

@ -343,7 +343,8 @@ int MMFilesTransactionCollection::doLock(AccessMode::Type type, int nestingLevel
timeout = 0.00000001;
}
bool const useDeadlockDetector = !_transaction->hasHint(transaction::Hints::Hint::SINGLE_OPERATION);
bool const useDeadlockDetector = (!_transaction->hasHint(transaction::Hints::Hint::SINGLE_OPERATION) &&
!_transaction->hasHint(transaction::Hints::Hint::NO_DLD));
int res;
if (!AccessMode::isWriteOrExclusive(type)) {
@ -404,7 +405,8 @@ int MMFilesTransactionCollection::doUnlock(AccessMode::Type type, int nestingLev
return TRI_ERROR_INTERNAL;
}
bool const useDeadlockDetector = !_transaction->hasHint(transaction::Hints::Hint::SINGLE_OPERATION);
bool const useDeadlockDetector = (!_transaction->hasHint(transaction::Hints::Hint::SINGLE_OPERATION) &&
!_transaction->hasHint(transaction::Hints::Hint::NO_DLD));
LogicalCollection* collection = _collection;
TRI_ASSERT(collection != nullptr);

View File

@ -45,7 +45,8 @@ class Hints {
TRY_LOCK = 64,
NO_COMPACTION_LOCK = 128,
NO_USAGE_LOCK = 256,
RECOVERY = 512
RECOVERY = 512,
NO_DLD = 1024 // disable deadlock detection
};
Hints() : _value(0) {}

View File

@ -44,6 +44,7 @@ SingleCollectionTransaction::SingleCollectionTransaction(
// add the (sole) collection
addCollection(cid, _accessType);
addHint(transaction::Hints::Hint::NO_DLD);
}
/// @brief create the transaction, using a collection name
@ -58,6 +59,7 @@ SingleCollectionTransaction::SingleCollectionTransaction(
// add the (sole) collection
_cid = resolver()->getCollectionId(name);
addCollection(_cid, name.c_str(), _accessType);
addHint(transaction::Hints::Hint::NO_DLD);
}
/// @brief get the underlying transaction collection