diff --git a/arangod/V8Server/v8-vocbase.cpp b/arangod/V8Server/v8-vocbase.cpp index b6997a2486..f1213367ba 100644 --- a/arangod/V8Server/v8-vocbase.cpp +++ b/arangod/V8Server/v8-vocbase.cpp @@ -6974,7 +6974,7 @@ static v8::Handle JS_UnloadVocbaseCol (v8::Arguments const& argv) { TRI_V8_EXCEPTION_INTERNAL(scope, "cannot extract collection"); } - int res = TRI_UnloadCollectionVocBase(collection->_vocbase, collection); + int res = TRI_UnloadCollectionVocBase(collection->_vocbase, collection, false); if (res != TRI_ERROR_NO_ERROR) { TRI_V8_EXCEPTION_MESSAGE(scope, res, "cannot unload collection"); diff --git a/arangod/VocBase/vocbase.c b/arangod/VocBase/vocbase.c index a439748830..236a49c4db 100644 --- a/arangod/VocBase/vocbase.c +++ b/arangod/VocBase/vocbase.c @@ -1458,7 +1458,12 @@ void TRI_DestroyVocBase (TRI_vocbase_t* vocbase) { TRI_vector_pointer_t collections; int res; size_t i; + + // stop replication + TRI_StopReplicationApplier(vocbase->_replicationApplier, false); + TRI_StopReplicationLogger(vocbase->_replicationLogger); + TRI_InitVectorPointer(&collections, TRI_UNKNOWN_MEM_ZONE); TRI_WRITE_LOCK_COLLECTIONS_VOCBASE(vocbase); @@ -1473,15 +1478,11 @@ void TRI_DestroyVocBase (TRI_vocbase_t* vocbase) { TRI_vocbase_col_t* collection; collection = (TRI_vocbase_col_t*) vocbase->_collections._buffer[i]; - TRI_UnloadCollectionVocBase(vocbase, collection); + TRI_UnloadCollectionVocBase(vocbase, collection, true); } TRI_DestroyVectorPointer(&collections); - // stop replication - TRI_StopReplicationApplier(vocbase->_replicationApplier, false); - TRI_StopReplicationLogger(vocbase->_replicationLogger); - // this will signal the synchroniser and the compactor threads to do one last iteration vocbase->_state = 2; @@ -1891,8 +1892,9 @@ TRI_vocbase_col_t* TRI_CreateCollectionVocBase (TRI_vocbase_t* vocbase, //////////////////////////////////////////////////////////////////////////////// int TRI_UnloadCollectionVocBase (TRI_vocbase_t* vocbase, - TRI_vocbase_col_t* collection) { - if (! collection->_canUnload) { + TRI_vocbase_col_t* collection, + bool force) { + if (! collection->_canUnload && ! force) { return TRI_set_errno(TRI_ERROR_FORBIDDEN); } diff --git a/arangod/VocBase/vocbase.h b/arangod/VocBase/vocbase.h index 9e405f548d..5910a5ee64 100644 --- a/arangod/VocBase/vocbase.h +++ b/arangod/VocBase/vocbase.h @@ -534,7 +534,8 @@ TRI_vocbase_col_t* TRI_CreateCollectionVocBase (TRI_vocbase_t*, //////////////////////////////////////////////////////////////////////////////// int TRI_UnloadCollectionVocBase (TRI_vocbase_t*, - TRI_vocbase_col_t*); + TRI_vocbase_col_t*, + bool); //////////////////////////////////////////////////////////////////////////////// /// @brief drops a (document) collection