mirror of https://gitee.com/bigwinds/arangodb
155 lines
5.5 KiB
Diff
155 lines
5.5 KiB
Diff
diff --git a/arangod/VocBase/compactor.c b/arangod/VocBase/compactor.c
|
|
index 2809b17..19a81e0 100644
|
|
--- a/arangod/VocBase/compactor.c
|
|
+++ b/arangod/VocBase/compactor.c
|
|
@@ -404,11 +404,13 @@ static void CompactifySimCollection (TRI_sim_collection_t* sim) {
|
|
size_t n;
|
|
size_t i;
|
|
|
|
+ if (! TRI_TRY_READ_LOCK_DATAFILES_SIM_COLLECTION(sim)) {
|
|
+ return;
|
|
+ }
|
|
+
|
|
TRI_InitVector(&vector, TRI_UNKNOWN_MEM_ZONE, sizeof(TRI_doc_datafile_info_t));
|
|
|
|
// copy datafile information
|
|
- TRI_READ_LOCK_DATAFILES_SIM_COLLECTION(sim);
|
|
-
|
|
n = sim->base.base._datafiles._length;
|
|
|
|
for (i = 0; i < n; ++i) {
|
|
diff --git a/arangod/VocBase/simple-collection.h b/arangod/VocBase/simple-collection.h
|
|
index 1a8c2e7..73132b5 100644
|
|
--- a/arangod/VocBase/simple-collection.h
|
|
+++ b/arangod/VocBase/simple-collection.h
|
|
@@ -53,6 +53,13 @@ extern "C" {
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
+/// @brief tries to read lock the journal files and the parameter file
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
+
|
|
+#define TRI_TRY_READ_LOCK_DATAFILES_SIM_COLLECTION(a) \
|
|
+ TRI_TryReadLockReadWriteLock(&(a)->_lock)
|
|
+
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief read locks the journal files and the parameter file
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
diff --git a/arangod/VocBase/synchroniser.c b/arangod/VocBase/synchroniser.c
|
|
index fb0e496..cb5eb91 100644
|
|
--- a/arangod/VocBase/synchroniser.c
|
|
+++ b/arangod/VocBase/synchroniser.c
|
|
@@ -138,7 +138,7 @@ static bool CheckJournalSimCollection (TRI_sim_collection_t* sim) {
|
|
bool worked;
|
|
size_t i;
|
|
size_t n;
|
|
-
|
|
+
|
|
worked = false;
|
|
base = &sim->base.base;
|
|
|
|
@@ -205,7 +205,7 @@ static bool CheckSyncCompactorSimCollection (TRI_sim_collection_t* sim) {
|
|
double ti;
|
|
size_t i;
|
|
size_t n;
|
|
-
|
|
+
|
|
worked = false;
|
|
base = &sim->base.base;
|
|
|
|
@@ -266,7 +266,7 @@ static bool CheckCompactorSimCollection (TRI_sim_collection_t* sim) {
|
|
bool worked;
|
|
size_t i;
|
|
size_t n;
|
|
-
|
|
+
|
|
worked = false;
|
|
base = &sim->base.base;
|
|
|
|
@@ -365,8 +365,10 @@ void TRI_SynchroniserVocBase (void* data) {
|
|
bool result;
|
|
|
|
collection = collections._buffer[i];
|
|
-
|
|
- TRI_READ_LOCK_STATUS_VOCBASE_COL(collection);
|
|
+
|
|
+ if (! TRI_TRY_READ_LOCK_DATAFILES_SIM_COLLECTION(collection)) {
|
|
+ continue;
|
|
+ }
|
|
|
|
if (collection->_status != TRI_VOC_COL_STATUS_LOADED) {
|
|
TRI_READ_UNLOCK_STATUS_VOCBASE_COL(collection);
|
|
diff --git a/lib/BasicsC/locks-posix.c b/lib/BasicsC/locks-posix.c
|
|
index 6ea05f9..150d727 100644
|
|
--- a/lib/BasicsC/locks-posix.c
|
|
+++ b/lib/BasicsC/locks-posix.c
|
|
@@ -230,6 +230,18 @@ void TRI_DestroyReadWriteLock (TRI_read_write_lock_t* lock) {
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
+/// @brief tries to read lock read-write lock
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
+
|
|
+bool TRI_TryReadLockReadWriteLock (TRI_read_write_lock_t* lock) {
|
|
+ int rc;
|
|
+
|
|
+ rc = pthread_rwlock_tryrdlock(lock);
|
|
+
|
|
+ return (rc == 0);
|
|
+}
|
|
+
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief read locks read-write lock
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
diff --git a/lib/BasicsC/locks-win32.c b/lib/BasicsC/locks-win32.c
|
|
index 73b0a4b..72b720b 100644
|
|
--- a/lib/BasicsC/locks-win32.c
|
|
+++ b/lib/BasicsC/locks-win32.c
|
|
@@ -267,6 +267,27 @@ static void DecrementReaders (TRI_read_write_lock_t* lock) {
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
+/// @brief tries to read lock a read-write lock
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
+
|
|
+bool TRI_TryReadLockReadWriteLock (TRI_read_write_lock_t* lock) {
|
|
+ WaitForSingleObject(lock->_writerEvent, 10); // 10 millis timeout
|
|
+
|
|
+ EnterCriticalSection(&lock->_lockReaders);
|
|
+ IncrementReaders(lock);
|
|
+ LeaveCriticalSection(&lock->_lockReaders);
|
|
+
|
|
+ if (WaitForSingleObject(lock->_writerEvent, 0) != WAIT_OBJECT_0) {
|
|
+ EnterCriticalSection(&lock->_lockReaders);
|
|
+ DecrementReaders(lock);
|
|
+ LeaveCriticalSection(&lock->_lockReaders);
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ return true;
|
|
+}
|
|
+
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief read locks read-write lock
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
diff --git a/lib/BasicsC/locks.h b/lib/BasicsC/locks.h
|
|
index 5b37860..2146416 100644
|
|
--- a/lib/BasicsC/locks.h
|
|
+++ b/lib/BasicsC/locks.h
|
|
@@ -229,6 +229,12 @@ void TRI_DestroyReadWriteLock (TRI_read_write_lock_t* lock);
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
+/// @brief tries to read lock read-write lock
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
+
|
|
+bool TRI_TryReadLockReadWriteLock (TRI_read_write_lock_t* lock);
|
|
+
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief read locks read-write lock
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|