1
0
Fork 0

fix potential deadlock

This commit is contained in:
jsteemann 2017-02-16 12:04:36 +01:00
parent 8b63f116e9
commit e7a0b181e6
2 changed files with 39 additions and 2 deletions

View File

@ -60,6 +60,8 @@
#include "VocBase/replication-applier.h"
#include "VocBase/ticks.h"
#include <thread>
using namespace arangodb;
using namespace arangodb::basics;
@ -475,9 +477,37 @@ int TRI_vocbase_t::dropCollectionWorker(arangodb::LogicalCollection* collection,
state = DROP_EXIT;
std::string const colName(collection->name());
WRITE_LOCKER(writeLocker, _collectionsLock);
// do not acquire these locks instantly
CONDITIONAL_WRITE_LOCKER(writeLocker, _collectionsLock, false);
CONDITIONAL_WRITE_LOCKER(locker, collection->_lock, false);
WRITE_LOCKER_EVENTUAL(locker, collection->_lock, 1000);
while (true) {
TRI_ASSERT(!writeLocker.isLocked());
TRI_ASSERT(!locker.isLocked());
// block until we have acquired this lock
writeLocker.lock();
// we now have the one lock
TRI_ASSERT(writeLocker.isLocked());
if (locker.tryLock()) {
// we now have both locks and can continue outside of this loop
break;
}
// unlock the write locker so we don't block other operations
writeLocker.unlock();
TRI_ASSERT(!writeLocker.isLocked());
TRI_ASSERT(!locker.isLocked());
// sleep for a while
std::this_thread::yield();
}
TRI_ASSERT(writeLocker.isLocked());
TRI_ASSERT(locker.isLocked());
arangodb::aql::QueryCache::instance()->invalidate(this);

View File

@ -293,6 +293,13 @@ class ConditionalWriteLocker {
}
_isLocked = true;
}
bool tryLock() {
if (!_isLocked && _readWriteLock->tryWriteLock()) {
_isLocked = true;
}
return _isLocked;
}
/// @brief acquire the write lock, blocking
void lock() {