diff --git a/src/index/fsindexer.cpp b/src/index/fsindexer.cpp index cc2f951d..562c09a3 100644 --- a/src/index/fsindexer.cpp +++ b/src/index/fsindexer.cpp @@ -291,6 +291,8 @@ static bool matchesSkipped(const vector& tdl, */ bool FsIndexer::indexFiles(list& files, ConfIndexer::IxFlag flag) { + int ret = false; + if (!init()) return false; @@ -315,7 +317,8 @@ bool FsIndexer::indexFiles(list& files, ConfIndexer::IxFlag flag) // Check path against indexed areas and skipped names/paths if (!(flag&ConfIndexer::IxFIgnoreSkip) && matchesSkipped(m_tdl, walker, *it)) { - it++; continue; + it++; + continue; } struct stat stb; @@ -324,17 +327,20 @@ bool FsIndexer::indexFiles(list& files, ConfIndexer::IxFlag flag) if (ststat != 0) { LOGERR(("FsIndexer::indexFiles: lstat(%s): %s", it->c_str(), strerror(errno))); - it++; continue; + it++; + continue; } if (processone(*it, &stb, FsTreeWalker::FtwRegular) != FsTreeWalker::FtwOk) { LOGERR(("FsIndexer::indexFiles: processone failed\n")); - return false; + goto out; } it = files.erase(it); } + ret = true; +out: #ifdef IDX_THREADS if (m_haveInternQ) m_iwqueue.waitIdle(); @@ -342,14 +348,14 @@ bool FsIndexer::indexFiles(list& files, ConfIndexer::IxFlag flag) m_dwqueue.waitIdle(); m_db->waitUpdIdle(); #endif // IDX_THREADS - - return true; + return ret; } /** Purge docs for given files out of the database */ bool FsIndexer::purgeFiles(list& files) { + bool ret = false; if (!init()) return false; @@ -361,7 +367,7 @@ bool FsIndexer::purgeFiles(list& files) bool existed; if (!m_db->purgeFile(udi, &existed)) { LOGERR(("FsIndexer::purgeFiles: Database error\n")); - return false; + goto out; } // If we actually deleted something, take it off the list if (existed) { @@ -371,7 +377,16 @@ bool FsIndexer::purgeFiles(list& files) } } - return true; + ret = true; +out: +#ifdef IDX_THREADS + if (m_haveInternQ) + m_iwqueue.waitIdle(); + if (m_haveSplitQ) + m_dwqueue.waitIdle(); + m_db->waitUpdIdle(); +#endif // IDX_THREADS + return ret; } // Local fields can be set for fs subtrees in the configuration file diff --git a/src/utils/workqueue.h b/src/utils/workqueue.h index 11dd4f15..8152270c 100644 --- a/src/utils/workqueue.h +++ b/src/utils/workqueue.h @@ -147,6 +147,11 @@ public: * only thread which can call it safely is the client just above * (which can control the task flow), else there could be * tasks in the intermediate queues. + * To rephrase: there is no warranty on return that the queue is actually + * idle EXCEPT if the caller knows that no jobs are still being created. + * It would be possible to transform this into a safe call if some kind + * of suspend condition was set on the queue by waitIdle(), to be reset by + * some kind of "resume" call. Not currently the case. */ bool waitIdle() {