From dc53e9fe95f2cf93ad0fd64ce84be9b2372afdfd Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Thu, 5 Nov 2015 10:58:35 +0100 Subject: [PATCH] move away from mutex to atomic variables --- arangod/VocBase/document-collection.cpp | 28 ++++------- arangod/VocBase/document-collection.h | 7 +++ lib/Basics/DeadlockDetector.h | 64 +++---------------------- 3 files changed, 21 insertions(+), 78 deletions(-) diff --git a/arangod/VocBase/document-collection.cpp b/arangod/VocBase/document-collection.cpp index 066f1d6155..1c1d9afad2 100644 --- a/arangod/VocBase/document-collection.cpp +++ b/arangod/VocBase/document-collection.cpp @@ -123,6 +123,7 @@ TRI_document_collection_t::TRI_document_collection_t () _headersPtr(nullptr), _keyGenerator(nullptr), _uncollectedLogfileEntries(0), + _currentWriterThread(0), _cleanupIndexes(0) { _tickMax = 0; @@ -199,13 +200,8 @@ int TRI_document_collection_t::beginWrite () { // std::cout << "BeginWrite: " << document->_info._name << std::endl; TRI_WRITE_LOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(this); - try { - _vocbase->_deadlockDetector.setWriterStarted(this); - } - catch (...) { - TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(this); - return TRI_ERROR_OUT_OF_MEMORY; - } + // register writer + _currentWriterThread.store(TRI_CurrentThreadId()); return TRI_ERROR_NO_ERROR; } @@ -229,11 +225,8 @@ int TRI_document_collection_t::endWrite () { // std::cout << "EndWrite: " << document->_info._name << std::endl; TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(this); - try { - _vocbase->_deadlockDetector.setWriterFinished(this); - } - catch (...) { - } + // unregister writer + _currentWriterThread.store(0); return TRI_ERROR_NO_ERROR; } @@ -390,14 +383,9 @@ int TRI_document_collection_t::beginWriteTimed (uint64_t timeout, if (wasBlocked) { _vocbase->_deadlockDetector.setReaderUnblocked(this); } - - try { - _vocbase->_deadlockDetector.setWriterStarted(this); - } - catch (...) { - TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(this); - return TRI_ERROR_OUT_OF_MEMORY; - } + + // register writer + _currentWriterThread.store(TRI_CurrentThreadId()); return TRI_ERROR_NO_ERROR; } diff --git a/arangod/VocBase/document-collection.h b/arangod/VocBase/document-collection.h index 28e5209453..1dc9515365 100644 --- a/arangod/VocBase/document-collection.h +++ b/arangod/VocBase/document-collection.h @@ -357,6 +357,7 @@ TRI_doc_collection_info_t; //////////////////////////////////////////////////////////////////////////////// struct TRI_document_collection_t : public TRI_collection_t { + // ........................................................................... // this lock protects the indexes and _headers attributes // ........................................................................... @@ -380,6 +381,10 @@ public: VocShaper* getShaper () const; #endif + inline TRI_tid_t getCurrentWriterThread () const { + return _currentWriterThread.load(); + } + inline bool useSecondaryIndexes () const { return _useSecondaryIndexes; } @@ -421,6 +426,8 @@ public: TRI_read_write_lock_t _compactionLock; double _lastCompaction; + std::atomic _currentWriterThread; + // ........................................................................... // this condition variable protects the _journalsCondition // ........................................................................... diff --git a/lib/Basics/DeadlockDetector.h b/lib/Basics/DeadlockDetector.h index 4d2dc3bee6..f30ef88ac0 100644 --- a/lib/Basics/DeadlockDetector.h +++ b/lib/Basics/DeadlockDetector.h @@ -69,18 +69,10 @@ namespace triagens { std::vector stack; - TRI_tid_t writerTid; + TRI_tid_t writerTid = value->getCurrentWriterThread(); - { - MUTEX_LOCKER(_writersLock); - // find responsible writer - auto it = _writers.find(value); - - if (it == _writers.end()) { - return false; - } - - writerTid = (*it).second; + if (writerTid == 0) { + return false; } stack.push_back(writerTid); @@ -121,18 +113,10 @@ namespace triagens { std::vector stack; - TRI_tid_t writerTid; + TRI_tid_t writerTid = value->getCurrentWriterThread(); - { - MUTEX_LOCKER(_writersLock); - // find responsible writer - auto it = _writers.find(value); - - if (it == _writers.end()) { - return false; - } - - writerTid = (*it).second; + if (writerTid == 0) { + return false; } stack.push_back(writerTid); @@ -186,48 +170,12 @@ namespace triagens { } } -//////////////////////////////////////////////////////////////////////////////// -/// @brief inserts a writer into the list of writers -//////////////////////////////////////////////////////////////////////////////// - - void setWriterStarted (T const* value) { - auto tid = TRI_CurrentThreadId(); - - MUTEX_LOCKER(_writersLock); - _writers.emplace(value, tid); - } - -//////////////////////////////////////////////////////////////////////////////// -/// @brief removes a writers from the list of writers -//////////////////////////////////////////////////////////////////////////////// - - void setWriterFinished (T const* value) noexcept { - try { - MUTEX_LOCKER(_writersLock); - _writers.erase(value); - } - catch (...) { - } - } - // ----------------------------------------------------------------------------- // --SECTION-- private variables // ----------------------------------------------------------------------------- private: -//////////////////////////////////////////////////////////////////////////////// -/// @brief lock for managing the writers -//////////////////////////////////////////////////////////////////////////////// - - triagens::basics::Mutex _writersLock; - -//////////////////////////////////////////////////////////////////////////////// -/// @brief all operating writers -//////////////////////////////////////////////////////////////////////////////// - - std::unordered_map _writers; - //////////////////////////////////////////////////////////////////////////////// /// @brief lock for managing the readers ////////////////////////////////////////////////////////////////////////////////