@@ -187,6 +187,24 @@ static bool EqualKeyCollectionName (TRI_associative_pointer_t* array, void const
187
187
188
188
return TRI_EqualString (k , e -> _name );
189
189
}
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
+ }
190
208
191
209
////////////////////////////////////////////////////////////////////////////////
192
210
/// @brief unloads a collection
@@ -1553,14 +1571,6 @@ int TRI_UnloadCollectionVocBase (TRI_vocbase_t* vocbase, TRI_vocbase_col_t* coll
1553
1571
int TRI_DropCollectionVocBase (TRI_vocbase_t * vocbase , TRI_vocbase_col_t * collection ) {
1554
1572
int res ;
1555
1573
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
-
1564
1574
// mark collection as deleted
1565
1575
TRI_WRITE_LOCK_STATUS_VOCBASE_COL (collection );
1566
1576
@@ -1569,6 +1579,8 @@ int TRI_DropCollectionVocBase (TRI_vocbase_t* vocbase, TRI_vocbase_col_t* collec
1569
1579
// .............................................................................
1570
1580
1571
1581
if (collection -> _status == TRI_VOC_COL_STATUS_DELETED ) {
1582
+ UnregisterCollection (vocbase , collection );
1583
+
1572
1584
TRI_WRITE_UNLOCK_STATUS_VOCBASE_COL (collection );
1573
1585
return TRI_ERROR_NO_ERROR ;
1574
1586
}
@@ -1579,6 +1591,9 @@ int TRI_DropCollectionVocBase (TRI_vocbase_t* vocbase, TRI_vocbase_col_t* collec
1579
1591
1580
1592
else if (collection -> _status == TRI_VOC_COL_STATUS_NEW_BORN ) {
1581
1593
collection -> _status = TRI_VOC_COL_STATUS_DELETED ;
1594
+
1595
+ UnregisterCollection (vocbase , collection );
1596
+
1582
1597
TRI_WRITE_UNLOCK_STATUS_VOCBASE_COL (collection );
1583
1598
return TRI_ERROR_NO_ERROR ;
1584
1599
}
@@ -1620,6 +1635,8 @@ int TRI_DropCollectionVocBase (TRI_vocbase_t* vocbase, TRI_vocbase_col_t* collec
1620
1635
}
1621
1636
1622
1637
collection -> _status = TRI_VOC_COL_STATUS_DELETED ;
1638
+
1639
+ UnregisterCollection (vocbase , collection );
1623
1640
1624
1641
TRI_WRITE_UNLOCK_STATUS_VOCBASE_COL (collection );
1625
1642
@@ -1643,6 +1660,7 @@ int TRI_DropCollectionVocBase (TRI_vocbase_t* vocbase, TRI_vocbase_col_t* collec
1643
1660
}
1644
1661
1645
1662
collection -> _status = TRI_VOC_COL_STATUS_DELETED ;
1663
+ UnregisterCollection (vocbase , collection );
1646
1664
1647
1665
TRI_WRITE_UNLOCK_STATUS_VOCBASE_COL (collection );
1648
1666
@@ -1666,6 +1684,8 @@ int TRI_DropCollectionVocBase (TRI_vocbase_t* vocbase, TRI_vocbase_col_t* collec
1666
1684
1667
1685
else {
1668
1686
TRI_WRITE_UNLOCK_STATUS_VOCBASE_COL (collection );
1687
+ LOG_WARNING ("internal error in TRI_DropCollectionVocBase" );
1688
+
1669
1689
return TRI_set_errno (TRI_ERROR_INTERNAL );
1670
1690
}
1671
1691
}
0 commit comments