8000 issue #194: potential race condition between creating and dropping co… · arangodb/arangodb@9d98da4 · GitHub
[go: up one dir, main page]

Skip to content

Commit 9d98da4

Browse files
committed
issue #194: potential race condition between creating and dropping collections
1 parent 5b52685 commit 9d98da4

File tree

1 file changed

+28
-8
lines changed

1 file changed

+28
-8
lines changed

arangod/VocBase/vocbase.c

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,24 @@ static bool EqualKeyCollectionName (TRI_associative_pointer_t* array, void const
187187

188188
return TRI_EqualString(k, e->_name);
189189
}
190+
191+
////////////////////////////////////////////////////////////////////////////////
192+
/// @brief remove a collection name from the global list of collections
193+
///
194+
/// this is called when a collection is dropped. it is necessary that the
195+
/// caller also holds a write-lock using TRI_WRITE_LOCK_STATUS_VOCBASE_COL().
196+
////////////////////////////////////////////////////////////////////////////////
197+
198+
static bool UnregisterCollection (TRI_vocbase_t* vocbase, TRI_vocbase_col_t* collection) {
199+
TRI_WRITE_LOCK_COLLECTIONS_VOCBASE(vocbase);
200+
201+
TRI_RemoveKeyAssociativePointer(&vocbase->_collectionsByName, collection->_name);
202+
TRI_RemoveKeyAssociativePointer(&vocbase->_collectionsById, &collection->_cid);
203+
204+
TRI_WRITE_UNLOCK_COLLECTIONS_VOCBASE(vocbase);
205+
206+
return true;
207+
}
190208

191209
////////////////////////////////////////////////////////////////////////////////
192210
/// @brief unloads a collection
@@ -1553,14 +1571,6 @@ int TRI_UnloadCollectionVocBase (TRI_vocbase_t* vocbase, TRI_vocbase_col_t* coll
15531571
int TRI_DropCollectionVocBase (TRI_vocbase_t* vocbase, TRI_vocbase_col_t* collection) {
15541572
int res;
15551573

1556-
// remove name and id
1557-
TRI_WRITE_LOCK_COLLECTIONS_VOCBASE(vocbase);
1558-
1559-
TRI_RemoveKeyAssociativePointer(&vocbase->_collectionsByName, collection->_name);
1560-
TRI_RemoveKeyAssociativePointer(&vocbase->_collectionsById, &collection->_cid);
1561-
1562-
TRI_WRITE_UNLOCK_COLLECTIONS_VOCBASE(vocbase);
1563-
15641574
// mark collection as deleted
15651575
TRI_WRITE_LOCK_STATUS_VOCBASE_COL(collection);
15661576

@@ -1569,6 +1579,8 @@ int TRI_DropCollectionVocBase (TRI_vocbase_t* vocbase, TRI_vocbase_col_t* collec
15691579
// .............................................................................
15701580

15711581
if (collection->_status == TRI_VOC_COL_STATUS_DELETED) {
1582+
UnregisterCollection(vocbase, collection);
1583+
15721584
TRI_WRITE_UNLOCK_STATUS_VOCBASE_COL(collection);
15731585
return TRI_ERROR_NO_ERROR;
15741586
}
@@ -1579,6 +1591,9 @@ int TRI_DropCollectionVocBase (TRI_vocbase_t* vocbase, TRI_vocbase_col_t* collec
15791591

15801592
else if (collection->_status == TRI_VOC_COL_STATUS_NEW_BORN) {
15811593
collection->_status = TRI_VOC_COL_STATUS_DELETED;
1594+
1595+
UnregisterCollection(vocbase, collection);
1596+
15821597
TRI_WRITE_UNLOCK_STATUS_VOCBASE_COL(collection);
15831598
return TRI_ERROR_NO_ERROR;
15841599
}
@@ -1620,6 +1635,8 @@ int TRI_DropCollectionVocBase (TRI_vocbase_t* vocbase, TRI_vocbase_col_t* collec
16201635
}
16211636

16221637
collection->_status = TRI_VOC_COL_STATUS_DELETED;
1638+
1639+
UnregisterCollection(vocbase, collection);
16231640

16241641
TRI_WRITE_UNLOCK_STATUS_VOCBASE_COL(collection);
16251642

@@ -1643,6 +1660,7 @@ int TRI_DropCollectionVocBase (TRI_vocbase_t* vocbase, TRI_vocbase_col_t* collec
16431660
}
16441661

16451662
collection->_status = TRI_VOC_COL_STATUS_DELETED;
1663+
UnregisterCollection(vocbase, collection);
16461664

16471665
TRI_WRITE_UNLOCK_STATUS_VOCBASE_COL(collection);
16481666

@@ -1666,6 +1684,8 @@ int TRI_DropCollectionVocBase (TRI_vocbase_t* vocbase, TRI_vocbase_col_t* collec
16661684

16671685
else {
16681686
TRI_WRITE_UNLOCK_STATUS_VOCBASE_COL(collection);
1687+
LOG_WARNING("internal error in TRI_DropCollectionVocBase");
1688+
16691689
return TRI_set_errno(TRI_ERROR_INTERNAL);
16701690
}
16711691
}

0 commit comments

Comments
 (0)
0