Make sure we don't try to merge a deleted index

This commit is contained in:
Ai Lin Chia
2017-03-06 16:36:07 +01:00
parent 93e0dbb4b5
commit eeaf3a69d1
2 changed files with 18 additions and 1 deletions

@ -35,6 +35,8 @@ RdbIndex::RdbIndex()
, m_docIds(new docids_t)
, m_docIdsMtx()
, m_pendingDocIdsMtx()
, m_pendingMergeCond(PTHREAD_COND_INITIALIZER)
, m_pendingMerge(false)
, m_pendingDocIds(new docids_t)
, m_prevPendingDocId(MAX_DOCID + 1)
, m_lastMergeTime(gettimeofdayInMilliseconds())
@ -48,6 +50,11 @@ RdbIndex::~RdbIndex() {
if (m_registeredCallback) {
g_loop.unregisterSleepCallback(this, &timedMerge);
}
ScopedLock sl(m_pendingDocIdsMtx);
if (m_pendingMerge) {
pthread_cond_wait(&m_pendingMergeCond, &(m_pendingDocIdsMtx.mtx));
}
}
void RdbIndex::reset() {
@ -68,9 +75,14 @@ void RdbIndex::timedMerge(int /*fd*/, void *state) {
ScopedLock sl(index->m_pendingDocIdsMtx);
// make sure there is only a single merge job at one time
if (index->m_pendingMerge) {
return;
}
if ((index->m_pendingDocIds->size() >= (index->m_generatingIndex ? s_generateMaxPendingSize : s_defaultMaxPendingSize)) ||
(gettimeofdayInMilliseconds() - index->m_lastMergeTime >= s_defaultMaxPendingTimeMs)) {
g_jobScheduler.submit(mergePendingDocIds, NULL, state, thread_type_index_merge, 0);
index->m_pendingMerge = g_jobScheduler.submit(mergePendingDocIds, NULL, state, thread_type_index_merge, 0);
}
}
@ -84,6 +96,9 @@ void RdbIndex::mergePendingDocIds(void *state) {
(gettimeofdayInMilliseconds() - index->m_lastMergeTime >= s_defaultMaxPendingTimeMs)) {
(void)index->mergePendingDocIds_unlocked();
}
index->m_pendingMerge = false;
pthread_cond_signal(&(index->m_pendingMergeCond));
}
/// @todo ALC collapse RdbIndex::set into constructor

@ -106,6 +106,8 @@ private:
// newest record pending merge into m_docIds
GbMutex m_pendingDocIdsMtx;
pthread_cond_t m_pendingMergeCond;
bool m_pendingMerge;
docids_ptr_t m_pendingDocIds;
uint64_t m_prevPendingDocId;