1
0
Fork 0

Merge branch 'devel' of https://github.com/triAGENS/ArangoDB into devel

This commit is contained in:
Heiko Kernbach 2013-10-18 10:32:03 +02:00
commit c1baf166bd
14 changed files with 91 additions and 16 deletions

View File

@ -1,6 +1,9 @@
v1.4.0-XXXXX (2013-XX-XX) v1.4.0-XXXXX (2013-XX-XX)
------------------------- -------------------------
* improved server shutdown time by signalling shutdown to applicationserver,
logging, cleanup and compactor threads
* added foxx-manager `replace` command * added foxx-manager `replace` command
* added foxx-manager `installed` command (a more intuitive alias for `list`) * added foxx-manager `installed` command (a more intuitive alias for `list`)

View File

@ -305,9 +305,11 @@ void TRI_CleanupVocBase (void* data) {
// clean up expired compactor locks // clean up expired compactor locks
TRI_CleanupCompactorVocBase(vocbase); TRI_CleanupCompactorVocBase(vocbase);
TRI_LockCondition(&vocbase->_cleanupCondition); if (state == 1) {
TRI_TimedWaitCondition(&vocbase->_cleanupCondition, (uint64_t) CLEANUP_INTERVAL); TRI_LockCondition(&vocbase->_cleanupCondition);
TRI_UnlockCondition(&vocbase->_cleanupCondition); TRI_TimedWaitCondition(&vocbase->_cleanupCondition, (uint64_t) CLEANUP_INTERVAL);
TRI_UnlockCondition(&vocbase->_cleanupCondition);
}
} }
if (state == 3) { if (state == 3) {

View File

@ -1476,9 +1476,11 @@ void TRI_CompactorVocBase (void* data) {
} }
if (vocbase->_state == 1) { if (state != 2 && vocbase->_state == 1) {
// only sleep while server is still running // only sleep while server is still running
usleep(COMPACTOR_INTERVAL); TRI_LockCondition(&vocbase->_compactorCondition);
TRI_TimedWaitCondition(&vocbase->_compactorCondition, (uint64_t) COMPACTOR_INTERVAL);
TRI_UnlockCondition(&vocbase->_compactorCondition);
} }
if (state == 2) { if (state == 2) {

View File

@ -592,6 +592,11 @@ static int OpenDatabases (TRI_server_t* server) {
res = TRI_ERROR_NO_ERROR; res = TRI_ERROR_NO_ERROR;
files = TRI_FilesDirectory(server->_databasePath); files = TRI_FilesDirectory(server->_databasePath);
n = files._length; n = files._length;
// open databases in defined order
if (n > 1) {
qsort(files._buffer, n, sizeof(char**), &NameComparator);
}
for (i = 0; i < n; ++i) { for (i = 0; i < n; ++i) {
TRI_vocbase_t* vocbase; TRI_vocbase_t* vocbase;
@ -825,7 +830,7 @@ static int OpenDatabases (TRI_server_t* server) {
static int CloseDatabases (TRI_server_t* server) { static int CloseDatabases (TRI_server_t* server) {
size_t i, n; size_t i, n;
TRI_WriteLockReadWriteLock(&server->_databasesLock); TRI_WriteLockReadWriteLock(&server->_databasesLock);
n = server->_databases._nrAlloc; n = server->_databases._nrAlloc;

View File

@ -1340,6 +1340,7 @@ TRI_vocbase_t* TRI_OpenVocBase (TRI_server_t* server,
vocbase->_syncWaiters = 0; vocbase->_syncWaiters = 0;
TRI_InitCondition(&vocbase->_syncWaitersCondition); TRI_InitCondition(&vocbase->_syncWaitersCondition);
TRI_InitCondition(&vocbase->_compactorCondition);
TRI_InitCondition(&vocbase->_cleanupCondition); TRI_InitCondition(&vocbase->_cleanupCondition);
// ............................................................................. // .............................................................................
@ -1489,10 +1490,18 @@ void TRI_DestroyVocBase (TRI_vocbase_t* vocbase) {
// wait until synchroniser and compactor are finished // wait until synchroniser and compactor are finished
TRI_JoinThread(&vocbase->_synchroniser); TRI_JoinThread(&vocbase->_synchroniser);
TRI_LockCondition(&vocbase->_compactorCondition);
TRI_SignalCondition(&vocbase->_compactorCondition);
TRI_UnlockCondition(&vocbase->_compactorCondition);
TRI_JoinThread(&vocbase->_compactor); TRI_JoinThread(&vocbase->_compactor);
// this will signal the cleanup thread to do one last iteration // this will signal the cleanup thread to do one last iteration
vocbase->_state = 3; vocbase->_state = 3;
TRI_LockCondition(&vocbase->_cleanupCondition);
TRI_SignalCondition(&vocbase->_cleanupCondition);
TRI_UnlockCondition(&vocbase->_cleanupCondition);
TRI_JoinThread(&vocbase->_cleanup); TRI_JoinThread(&vocbase->_cleanup);
// free replication // free replication
@ -1513,9 +1522,7 @@ void TRI_DestroyVocBase (TRI_vocbase_t* vocbase) {
// free collections // free collections
for (i = 0; i < vocbase->_collections._length; ++i) { for (i = 0; i < vocbase->_collections._length; ++i) {
TRI_vocbase_col_t* collection; TRI_vocbase_col_t* collection = (TRI_vocbase_col_t*) vocbase->_collections._buffer[i];
collection = (TRI_vocbase_col_t*) vocbase->_collections._buffer[i];
TRI_FreeCollectionVocBase(collection); TRI_FreeCollectionVocBase(collection);
} }
@ -1544,6 +1551,7 @@ void TRI_DestroyVocBase (TRI_vocbase_t* vocbase) {
TRI_DestroyReadWriteLock(&vocbase->_lock); TRI_DestroyReadWriteLock(&vocbase->_lock);
TRI_DestroyCondition(&vocbase->_syncWaitersCondition); TRI_DestroyCondition(&vocbase->_syncWaitersCondition);
TRI_DestroyCondition(&vocbase->_cleanupCondition); TRI_DestroyCondition(&vocbase->_cleanupCondition);
TRI_DestroyCondition(&vocbase->_compactorCondition);
// free name and path // free name and path
TRI_Free(TRI_CORE_MEM_ZONE, vocbase->_path); TRI_Free(TRI_CORE_MEM_ZONE, vocbase->_path);

View File

@ -367,6 +367,7 @@ typedef struct TRI_vocbase_s {
} }
_compactionBlockers; _compactionBlockers;
TRI_condition_t _compactorCondition;
TRI_condition_t _cleanupCondition; TRI_condition_t _cleanupCondition;
TRI_condition_t _syncWaitersCondition; TRI_condition_t _syncWaitersCondition;
int64_t _syncWaiters; int64_t _syncWaiters;

View File

@ -39,6 +39,7 @@
#endif #endif
#include "ApplicationServer/ApplicationFeature.h" #include "ApplicationServer/ApplicationFeature.h"
#include "Basics/ConditionLocker.h"
#include "Basics/FileUtils.h" #include "Basics/FileUtils.h"
#include "Basics/RandomGenerator.h" #include "Basics/RandomGenerator.h"
#include "Basics/StringUtils.h" #include "Basics/StringUtils.h"
@ -144,7 +145,8 @@ ApplicationServer::ApplicationServer (std::string const& name, std::string const
_logLineNumber(false), _logLineNumber(false),
_logSourceFilter(), _logSourceFilter(),
_logContentFilter(), _logContentFilter(),
_randomGenerator(5) { _randomGenerator(5),
_finishedCondition() {
} }
#else #else
@ -185,7 +187,8 @@ ApplicationServer::ApplicationServer (std::string const& name, std::string const
_logLineNumber(false), _logLineNumber(false),
_logSourceFilter(), _logSourceFilter(),
_logContentFilter(), _logContentFilter(),
_randomGenerator(3) { _randomGenerator(3),
_finishedCondition() {
storeRealPrivileges(); storeRealPrivileges();
} }
@ -623,7 +626,9 @@ void ApplicationServer::wait () {
running = false; running = false;
break; break;
} }
sleep(1);
CONDITION_LOCKER(locker, _finishedCondition);
locker.wait((uint64_t) (1000 * 1000));
} }
} }
@ -645,6 +650,8 @@ void ApplicationServer::beginShutdown () {
void ApplicationServer::stop () { void ApplicationServer::stop () {
beginShutdown(); beginShutdown();
CONDITION_LOCKER(locker, _finishedCondition);
locker.signal();
// close all features // close all features
for (vector<ApplicationFeature*>::iterator i = _features.begin(); i != _features.end(); ++i) { for (vector<ApplicationFeature*>::iterator i = _features.begin(); i != _features.end(); ++i) {
@ -664,8 +671,6 @@ void ApplicationServer::stop () {
feature->stop(); feature->stop();
LOGGER_TRACE("shut down server feature '" << feature->getName() << "'"); LOGGER_TRACE("shut down server feature '" << feature->getName() << "'");
} }
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////

View File

@ -31,6 +31,7 @@
#include "Basics/Common.h" #include "Basics/Common.h"
#include "Basics/ProgramOptions.h" #include "Basics/ProgramOptions.h"
#include "Basics/ConditionVariable.h"
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// --SECTION-- forward declarations // --SECTION-- forward declarations
@ -840,6 +841,12 @@ namespace triagens {
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
uint32_t _randomGenerator; uint32_t _randomGenerator;
////////////////////////////////////////////////////////////////////////////////
/// @brief condition variable for done
////////////////////////////////////////////////////////////////////////////////
triagens::basics::ConditionVariable _finishedCondition;
}; };
} }
} }

View File

@ -111,6 +111,14 @@ void ConditionLocker::broadcast () {
_conditionVariable->broadcast(); _conditionVariable->broadcast();
} }
////////////////////////////////////////////////////////////////////////////////
/// @brief signals an event
////////////////////////////////////////////////////////////////////////////////
void ConditionLocker::signal () {
_conditionVariable->signal();
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @} /// @}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////

View File

@ -150,6 +150,12 @@ namespace triagens {
void broadcast (); void broadcast ();
////////////////////////////////////////////////////////////////////////////////
/// @brief signals an event
////////////////////////////////////////////////////////////////////////////////
void signal ();
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @} /// @}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////

View File

@ -109,6 +109,14 @@ void ConditionVariable::broadcast () {
TRI_BroadcastCondition(&_condition); TRI_BroadcastCondition(&_condition);
} }
////////////////////////////////////////////////////////////////////////////////
/// @brief signals a waiting thread
////////////////////////////////////////////////////////////////////////////////
void ConditionVariable::signal () {
TRI_SignalCondition(&_condition);
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @} /// @}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////

View File

@ -151,6 +151,12 @@ namespace triagens {
void broadcast (); void broadcast ();
////////////////////////////////////////////////////////////////////////////////
/// @brief signals a waiting thread
////////////////////////////////////////////////////////////////////////////////
void signal ();
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @} /// @}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////

View File

@ -151,6 +151,12 @@ static TRI_log_buffer_t BufferOutput[OUTPUT_LOG_LEVELS][OUTPUT_BUFFER_SIZE];
static TRI_mutex_t BufferLock; static TRI_mutex_t BufferLock;
////////////////////////////////////////////////////////////////////////////////
/// @brief condition variable for the logger
////////////////////////////////////////////////////////////////////////////////
static TRI_condition_t LogCondition;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief message queue lock /// @brief message queue lock
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -790,7 +796,9 @@ static void MessageQueueWorker (void* data) {
} }
if (LoggingActive) { if (LoggingActive) {
usleep(sl); TRI_LockCondition(&LogCondition);
TRI_TimedWaitCondition(&LogCondition, (uint64_t) sl);
TRI_UnlockCondition(&LogCondition);
} }
else { else {
TRI_LockMutex(&LogMessageQueueLock); TRI_LockMutex(&LogMessageQueueLock);
@ -1905,6 +1913,7 @@ void TRI_InitialiseLogging (bool threaded) {
ThreadedLogging = threaded; ThreadedLogging = threaded;
if (threaded) { if (threaded) {
TRI_InitCondition(&LogCondition);
TRI_InitMutex(&LogMessageQueueLock); TRI_InitMutex(&LogMessageQueueLock);
TRI_InitVector(&LogMessageQueue, TRI_CORE_MEM_ZONE, sizeof(log_message_t)); TRI_InitVector(&LogMessageQueue, TRI_CORE_MEM_ZONE, sizeof(log_message_t));
@ -1943,9 +1952,14 @@ bool TRI_ShutdownLogging (bool clearBuffers) {
// join with the logging thread // join with the logging thread
if (ThreadedLogging) { if (ThreadedLogging) {
TRI_LockCondition(&LogCondition);
TRI_SignalCondition(&LogCondition);
TRI_UnlockCondition(&LogCondition);
TRI_JoinThread(&LoggingThread); TRI_JoinThread(&LoggingThread);
TRI_DestroyMutex(&LogMessageQueueLock); TRI_DestroyMutex(&LogMessageQueueLock);
TRI_DestroyVector(&LogMessageQueue); TRI_DestroyVector(&LogMessageQueue);
TRI_DestroyCondition(&LogCondition);
} }
// cleanup appenders // cleanup appenders

View File

@ -574,7 +574,7 @@ void ApplicationScheduler::stop () {
for (size_t count = 0; count < MAX_TRIES && _scheduler->isRunning(); ++count) { for (size_t count = 0; count < MAX_TRIES && _scheduler->isRunning(); ++count) {
LOGGER_TRACE("waiting for scheduler to stop"); LOGGER_TRACE("waiting for scheduler to stop");
usleep(1000000); usleep(100000);
} }
_scheduler->shutdown(); _scheduler->shutdown();