static void CompactifySimCollection (TRI_sim_collection_t* sim) { TRI_vector_t vector; size_t n; size_t i; TRI_InitVector(&vector, TRI_UNKNOWN_MEM_ZONE, sizeof(TRI_doc_datafile_info_t)); // copy datafile information TRI_READ_LOCK_DATAFILES_SIM_COLLECTION(sim); n = sim->base.base._datafiles._length; for (i = 0; i < n; ++i) { TRI_datafile_t* df; TRI_doc_datafile_info_t* dfi; df = sim->base.base._datafiles._buffer[i]; dfi = TRI_FindDatafileInfoDocCollection(&sim->base, df->_fid); TRI_PushBackVector(&vector, dfi); } TRI_READ_UNLOCK_DATAFILES_SIM_COLLECTION(sim); // handle datafiles with dead objects for (i = 0; i < vector._length; ++i) { TRI_doc_datafile_info_t* dfi; dfi = TRI_AtVector(&vector, i); if (dfi->_numberDead == 0) { continue; } LOG_DEBUG("datafile = %lu, alive = %lu / %lu, dead = %lu / %lu, deletions = %lu", (unsigned long) dfi->_fid, (unsigned long) dfi->_numberAlive, (unsigned long) dfi->_sizeAlive, (unsigned long) dfi->_numberDead, (unsigned long) dfi->_sizeDead, (unsigned long) dfi->_numberDeletion); CompactifyDatafile(sim, dfi->_fid); } // cleanup local variables TRI_DestroyVector(&vector); }
static void CompactifyDatafile (TRI_sim_collection_t* sim, TRI_voc_fid_t fid) { TRI_datafile_t* df; bool ok; size_t n; size_t i; // locate the datafile TRI_READ_LOCK_DATAFILES_SIM_COLLECTION(sim); n = sim->base.base._datafiles._length; for (i = 0; i < n; ++i) { df = sim->base.base._datafiles._buffer[i]; if (df->_fid == fid) { break; } } TRI_READ_UNLOCK_DATAFILES_SIM_COLLECTION(sim); if (i == n) { return; } // now compactify the datafile LOG_DEBUG("starting to compactify datafile '%s'", df->_filename); ok = TRI_IterateDatafile(df, Compactifier, sim, false); if (! ok) { LOG_WARNING("failed to compactify the datafile '%s'", df->_filename); return; } // wait for the journals to sync WaitCompactSync(sim, df); // remove the datafile from the list of datafiles TRI_WRITE_LOCK_DATAFILES_SIM_COLLECTION(sim); n = sim->base.base._datafiles._length; for (i = 0; i < n; ++i) { df = sim->base.base._datafiles._buffer[i]; if (df->_fid == fid) { TRI_RemoveVectorPointer(&sim->base.base._datafiles, i); break; } } TRI_WRITE_UNLOCK_DATAFILES_SIM_COLLECTION(sim); if (i == n) { LOG_WARNING("failed to locate the datafile '%lu'", (unsigned long) df->_fid); return; } // add a deletion marker to the result set container TRI_CreateBarrierDatafile(&sim->base._barrierList, df, RemoveDatafileCallback, &sim->base.base); }