1
0
Fork 0

issue #662: ArangoDB on Windows hanging...

fix unloading of collections which prevented some collections from being dropped
This commit is contained in:
Jan Steemann 2013-11-11 13:51:58 +01:00
parent d7b90bb7df
commit dc82642998
4 changed files with 13 additions and 10 deletions

View File

@ -6971,7 +6971,7 @@ static v8::Handle<v8::Value> JS_UnloadVocbaseCol (v8::Arguments const& argv) {
TRI_V8_EXCEPTION_INTERNAL(scope, "cannot extract collection"); 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) { if (res != TRI_ERROR_NO_ERROR) {
TRI_V8_EXCEPTION_MESSAGE(scope, res, "cannot unload collection"); TRI_V8_EXCEPTION_MESSAGE(scope, res, "cannot unload collection");

View File

@ -1461,7 +1461,7 @@ static void DatabaseManager (void* data) {
} }
// found a database to delete // found a database to delete
database = TRI_RemoveVectorPointer(&server->_droppedDatabases, i); database = (TRI_vocbase_t*) TRI_RemoveVectorPointer(&server->_droppedDatabases, i);
break; break;
} }

View File

@ -1513,6 +1513,11 @@ void TRI_DestroyVocBase (TRI_vocbase_t* vocbase) {
int res; int res;
size_t i; size_t i;
// stop replication
TRI_StopReplicationApplier(vocbase->_replicationApplier, false);
TRI_StopReplicationLogger(vocbase->_replicationLogger);
TRI_InitVectorPointer(&collections, TRI_UNKNOWN_MEM_ZONE); TRI_InitVectorPointer(&collections, TRI_UNKNOWN_MEM_ZONE);
TRI_WRITE_LOCK_COLLECTIONS_VOCBASE(vocbase); TRI_WRITE_LOCK_COLLECTIONS_VOCBASE(vocbase);
@ -1527,15 +1532,11 @@ void TRI_DestroyVocBase (TRI_vocbase_t* vocbase) {
TRI_vocbase_col_t* collection; TRI_vocbase_col_t* collection;
collection = (TRI_vocbase_col_t*) vocbase->_collections._buffer[i]; collection = (TRI_vocbase_col_t*) vocbase->_collections._buffer[i];
TRI_UnloadCollectionVocBase(vocbase, collection); TRI_UnloadCollectionVocBase(vocbase, collection, true);
} }
TRI_DestroyVectorPointer(&collections); 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 // this will signal the synchroniser and the compactor threads to do one last iteration
vocbase->_state = 2; vocbase->_state = 2;
@ -1945,8 +1946,9 @@ TRI_vocbase_col_t* TRI_CreateCollectionVocBase (TRI_vocbase_t* vocbase,
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int TRI_UnloadCollectionVocBase (TRI_vocbase_t* vocbase, int TRI_UnloadCollectionVocBase (TRI_vocbase_t* vocbase,
TRI_vocbase_col_t* collection) { TRI_vocbase_col_t* collection,
if (! collection->_canUnload) { bool force) {
if (! collection->_canUnload && ! force) {
return TRI_set_errno(TRI_ERROR_FORBIDDEN); return TRI_set_errno(TRI_ERROR_FORBIDDEN);
} }

View File

@ -535,7 +535,8 @@ TRI_vocbase_col_t* TRI_CreateCollectionVocBase (TRI_vocbase_t*,
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int TRI_UnloadCollectionVocBase (TRI_vocbase_t*, int TRI_UnloadCollectionVocBase (TRI_vocbase_t*,
TRI_vocbase_col_t*); TRI_vocbase_col_t*,
bool);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief drops a (document) collection /// @brief drops a (document) collection