1
0
Fork 0

update the tick counter on startup with ticks from journals

This commit is contained in:
Jan Steemann 2013-04-04 10:08:05 +02:00
parent b3b2602885
commit addf02a97b
3 changed files with 74 additions and 33 deletions

View File

@ -571,6 +571,36 @@ static bool CloseDataFiles (const TRI_vector_pointer_t* const files) {
return result;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief iterate over a set of datafiles
/// note: the files will be opened and closed
////////////////////////////////////////////////////////////////////////////////
static bool IterateFiles (TRI_vector_string_t* vector,
bool (*iterator)(TRI_df_marker_t const*, void*, TRI_datafile_t*, bool)) {
size_t i, n;
n = vector->_length;
for (i = 0; i < n ; ++i) {
TRI_datafile_t* datafile;
char* filename;
filename = TRI_AtVectorString(vector, i);
LOG_DEBUG("iterating over collection journal file '%s'", filename);
datafile = TRI_OpenDatafile(filename);
if (datafile != NULL) {
TRI_IterateDatafile(datafile, iterator, NULL, true);
TRI_CloseDatafile(datafile);
TRI_FreeDatafile(datafile);
}
}
return true;
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
@ -1290,36 +1320,22 @@ void TRI_DestroyFileStructureCollection (TRI_col_file_structure_t* info) {
////////////////////////////////////////////////////////////////////////////////
/// @brief iterate over the markers incollection journals journal
///
/// we do this on startup to find the most recent tick values
/// this function is called on server startup for all collections
////////////////////////////////////////////////////////////////////////////////
bool TRI_IterateJournalsCollection (const char* const path,
bool (*iterator)(TRI_df_marker_t const*, void*, TRI_datafile_t*, bool)) {
bool TRI_IterateStartupCollection (const char* const path,
bool (*iterator)(TRI_df_marker_t const*, void*, TRI_datafile_t*, bool)) {
TRI_col_file_structure_t structure = ScanCollectionDirectory(path);
TRI_vector_string_t* vector = &structure._journals;
size_t n = vector->_length;
if (n > 0) {
size_t i;
for (i = 0; i < n ; ++i) {
TRI_datafile_t* datafile;
char* filename;
filename = TRI_AtVectorString(vector, i);
LOG_DEBUG("iterating over collection journal file '%s'", filename);
datafile = TRI_OpenDatafile(filename);
if (datafile != NULL) {
TRI_IterateDatafile(datafile, iterator, NULL, true);
TRI_CloseDatafile(datafile);
TRI_FreeDatafile(datafile);
}
}
}
bool result;
// iterate of journals & compactors, not datafiles
result = IterateFiles(&structure._journals, iterator);
result &= IterateFiles(&structure._compactors, iterator);
TRI_DestroyFileStructureCollection(&structure);
return true;
return result;
}
////////////////////////////////////////////////////////////////////////////////

View File

@ -427,9 +427,10 @@ void TRI_DestroyFileStructureCollection (TRI_col_file_structure_t*);
////////////////////////////////////////////////////////////////////////////////
/// @brief iterate over markers in collection journals
/// this function is called on server startup for all collections
////////////////////////////////////////////////////////////////////////////////
bool TRI_IterateJournalsCollection (const char* const,
bool TRI_IterateStartupCollection (const char* const,
bool (*)(TRI_df_marker_t const*, void*, TRI_datafile_t*, bool));
////////////////////////////////////////////////////////////////////////////////

View File

@ -211,6 +211,18 @@ static bool EqualKeyCollectionName (TRI_associative_pointer_t* array, void const
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief updates the tick counter, without using a lock
////////////////////////////////////////////////////////////////////////////////
static void UpdateTick (TRI_voc_tick_t tick) {
TRI_voc_tick_t s = tick >> 16;
if (CurrentTick < s) {
CurrentTick = s;
}
}
////////////////////////////////////////////////////////////////////////////////
/// @brief free the memory associated with a collection
////////////////////////////////////////////////////////////////////////////////
@ -611,6 +623,22 @@ static TRI_vocbase_col_t* AddCollection (TRI_vocbase_t* vocbase,
return collection;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief this iterator is called on startup for journal and compactor file
/// of a collection
/// it will check the ticks of all markers and update the internal tick
/// counter accordingly
////////////////////////////////////////////////////////////////////////////////
static bool StartupIterator (TRI_df_marker_t const* marker,
void* data,
TRI_datafile_t* datafile,
bool journal) {
UpdateTick(marker->_tick);
return true;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief scans a directory and loads all collections
////////////////////////////////////////////////////////////////////////////////
@ -667,7 +695,7 @@ static int ScanPath (TRI_vocbase_t* vocbase, char const* path) {
res = TRI_LoadCollectionInfo(file, &info, true);
if (res == TRI_ERROR_NO_ERROR) {
TRI_UpdateTickVocBase(info._cid);
UpdateTick(info._cid);
}
if (res != TRI_ERROR_NO_ERROR) {
@ -724,6 +752,8 @@ static int ScanPath (TRI_vocbase_t* vocbase, char const* path) {
TRI_vocbase_col_t* c;
c = AddCollection(vocbase, type, info._name, info._cid, file);
TRI_IterateStartupCollection(file, StartupIterator);
if (c == NULL) {
LOG_ERROR("failed to add document collection from '%s'", file);
@ -971,14 +1001,8 @@ TRI_voc_tick_t TRI_NewTickVocBase () {
////////////////////////////////////////////////////////////////////////////////
void TRI_UpdateTickVocBase (TRI_voc_tick_t tick) {
TRI_voc_tick_t s = tick >> 16;
TRI_LockSpin(&TickLock);
if (CurrentTick < s) {
CurrentTick = s;
}
UpdateTick(tick);
TRI_UnlockSpin(&TickLock);
}