mirror of https://gitee.com/bigwinds/arangodb
move away from mutex to atomic variables
This commit is contained in:
parent
790dae1c52
commit
dc53e9fe95
|
@ -123,6 +123,7 @@ TRI_document_collection_t::TRI_document_collection_t ()
|
||||||
_headersPtr(nullptr),
|
_headersPtr(nullptr),
|
||||||
_keyGenerator(nullptr),
|
_keyGenerator(nullptr),
|
||||||
_uncollectedLogfileEntries(0),
|
_uncollectedLogfileEntries(0),
|
||||||
|
_currentWriterThread(0),
|
||||||
_cleanupIndexes(0) {
|
_cleanupIndexes(0) {
|
||||||
|
|
||||||
_tickMax = 0;
|
_tickMax = 0;
|
||||||
|
@ -199,13 +200,8 @@ int TRI_document_collection_t::beginWrite () {
|
||||||
// std::cout << "BeginWrite: " << document->_info._name << std::endl;
|
// std::cout << "BeginWrite: " << document->_info._name << std::endl;
|
||||||
TRI_WRITE_LOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(this);
|
TRI_WRITE_LOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(this);
|
||||||
|
|
||||||
try {
|
// register writer
|
||||||
_vocbase->_deadlockDetector.setWriterStarted(this);
|
_currentWriterThread.store(TRI_CurrentThreadId());
|
||||||
}
|
|
||||||
catch (...) {
|
|
||||||
TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(this);
|
|
||||||
return TRI_ERROR_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRI_ERROR_NO_ERROR;
|
return TRI_ERROR_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
@ -229,11 +225,8 @@ int TRI_document_collection_t::endWrite () {
|
||||||
// std::cout << "EndWrite: " << document->_info._name << std::endl;
|
// std::cout << "EndWrite: " << document->_info._name << std::endl;
|
||||||
TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(this);
|
TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(this);
|
||||||
|
|
||||||
try {
|
// unregister writer
|
||||||
_vocbase->_deadlockDetector.setWriterFinished(this);
|
_currentWriterThread.store(0);
|
||||||
}
|
|
||||||
catch (...) {
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRI_ERROR_NO_ERROR;
|
return TRI_ERROR_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
@ -390,14 +383,9 @@ int TRI_document_collection_t::beginWriteTimed (uint64_t timeout,
|
||||||
if (wasBlocked) {
|
if (wasBlocked) {
|
||||||
_vocbase->_deadlockDetector.setReaderUnblocked(this);
|
_vocbase->_deadlockDetector.setReaderUnblocked(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
// register writer
|
||||||
_vocbase->_deadlockDetector.setWriterStarted(this);
|
_currentWriterThread.store(TRI_CurrentThreadId());
|
||||||
}
|
|
||||||
catch (...) {
|
|
||||||
TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(this);
|
|
||||||
return TRI_ERROR_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRI_ERROR_NO_ERROR;
|
return TRI_ERROR_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
|
@ -357,6 +357,7 @@ TRI_doc_collection_info_t;
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
struct TRI_document_collection_t : public TRI_collection_t {
|
struct TRI_document_collection_t : public TRI_collection_t {
|
||||||
|
|
||||||
// ...........................................................................
|
// ...........................................................................
|
||||||
// this lock protects the indexes and _headers attributes
|
// this lock protects the indexes and _headers attributes
|
||||||
// ...........................................................................
|
// ...........................................................................
|
||||||
|
@ -380,6 +381,10 @@ public:
|
||||||
VocShaper* getShaper () const;
|
VocShaper* getShaper () const;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
inline TRI_tid_t getCurrentWriterThread () const {
|
||||||
|
return _currentWriterThread.load();
|
||||||
|
}
|
||||||
|
|
||||||
inline bool useSecondaryIndexes () const {
|
inline bool useSecondaryIndexes () const {
|
||||||
return _useSecondaryIndexes;
|
return _useSecondaryIndexes;
|
||||||
}
|
}
|
||||||
|
@ -421,6 +426,8 @@ public:
|
||||||
TRI_read_write_lock_t _compactionLock;
|
TRI_read_write_lock_t _compactionLock;
|
||||||
double _lastCompaction;
|
double _lastCompaction;
|
||||||
|
|
||||||
|
std::atomic<TRI_tid_t> _currentWriterThread;
|
||||||
|
|
||||||
// ...........................................................................
|
// ...........................................................................
|
||||||
// this condition variable protects the _journalsCondition
|
// this condition variable protects the _journalsCondition
|
||||||
// ...........................................................................
|
// ...........................................................................
|
||||||
|
|
|
@ -69,18 +69,10 @@ namespace triagens {
|
||||||
|
|
||||||
std::vector<TRI_tid_t> stack;
|
std::vector<TRI_tid_t> stack;
|
||||||
|
|
||||||
TRI_tid_t writerTid;
|
TRI_tid_t writerTid = value->getCurrentWriterThread();
|
||||||
|
|
||||||
{
|
if (writerTid == 0) {
|
||||||
MUTEX_LOCKER(_writersLock);
|
return false;
|
||||||
// find responsible writer
|
|
||||||
auto it = _writers.find(value);
|
|
||||||
|
|
||||||
if (it == _writers.end()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
writerTid = (*it).second;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
stack.push_back(writerTid);
|
stack.push_back(writerTid);
|
||||||
|
@ -121,18 +113,10 @@ namespace triagens {
|
||||||
|
|
||||||
std::vector<TRI_tid_t> stack;
|
std::vector<TRI_tid_t> stack;
|
||||||
|
|
||||||
TRI_tid_t writerTid;
|
TRI_tid_t writerTid = value->getCurrentWriterThread();
|
||||||
|
|
||||||
{
|
if (writerTid == 0) {
|
||||||
MUTEX_LOCKER(_writersLock);
|
return false;
|
||||||
// find responsible writer
|
|
||||||
auto it = _writers.find(value);
|
|
||||||
|
|
||||||
if (it == _writers.end()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
writerTid = (*it).second;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
stack.push_back(writerTid);
|
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
|
// --SECTION-- private variables
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
/// @brief lock for managing the writers
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
triagens::basics::Mutex _writersLock;
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
/// @brief all operating writers
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
std::unordered_map<T const*, TRI_tid_t> _writers;
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief lock for managing the readers
|
/// @brief lock for managing the readers
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
Loading…
Reference in New Issue