try to be more responsive to user interrupts: do not build the aux databases after an interruption, and check for an interruption during the purge pass

This commit is contained in:
Jean-Francois Dockes 2011-04-28 12:27:06 +02:00
parent a7b1c272a6
commit a4d1689581
2 changed files with 22 additions and 6 deletions

View File

@ -78,22 +78,27 @@ bool ConfIndexer::index(bool resetbefore, ixType typestorun)
if (typestorun == IxTAll) { if (typestorun == IxTAll) {
// Get rid of all database entries that don't exist in the // Get rid of all database entries that don't exist in the
// filesystem anymore. Only if all *configured* indexers ran. // filesystem anymore. Only if all *configured* indexers ran.
if (m_updater) if (m_updater && !m_updater->update(DbIxStatus::DBIXS_PURGE, string()))
m_updater->update(DbIxStatus::DBIXS_PURGE, string()); return false;
m_db.purge(); m_db.purge();
} }
// The close would be done in our destructor, but we want status
// here. Makes no sense to check for cancel, we'll have to close
// anyway
if (m_updater) if (m_updater)
m_updater->update(DbIxStatus::DBIXS_CLOSING, string()); m_updater->update(DbIxStatus::DBIXS_CLOSING, string());
// The close would be done in our destructor, but we want status here
if (!m_db.close()) { if (!m_db.close()) {
LOGERR(("ConfIndexer::index: error closing database in %s\n", LOGERR(("ConfIndexer::index: error closing database in %s\n",
m_config->getDbDir().c_str())); m_config->getDbDir().c_str()));
return false; return false;
} }
if (m_updater && !m_updater->update(DbIxStatus::DBIXS_CLOSING, string()))
return false;
createStemmingDatabases(); createStemmingDatabases();
if (m_updater && !m_updater->update(DbIxStatus::DBIXS_CLOSING, string()))
return false;
createAspellDict(); createAspellDict();
clearMimeHandlerCache(); clearMimeHandlerCache();
return true; return true;
@ -205,8 +210,8 @@ bool ConfIndexer::createStemmingDatabases()
m_db.deleteStemDb(*it); m_db.deleteStemDb(*it);
} }
for (it = langs.begin(); it != langs.end(); it++) { for (it = langs.begin(); it != langs.end(); it++) {
if (m_updater) if (m_updater && !m_updater->update(DbIxStatus::DBIXS_STEMDB, *it))
m_updater->update(DbIxStatus::DBIXS_STEMDB, *it); return false;
m_db.createStemDb(*it); m_db.createStemDb(*it);
} }
} }

View File

@ -50,6 +50,7 @@ using namespace std;
#include "rclquery_p.h" #include "rclquery_p.h"
#include "md5.h" #include "md5.h"
#include "rclversion.h" #include "rclversion.h"
#include "cancelcheck.h"
#ifndef MAX #ifndef MAX
#define MAX(A,B) (A>B?A:B) #define MAX(A,B) (A>B?A:B)
@ -1322,8 +1323,17 @@ bool Db::purge()
// Walk the document array and delete any xapian document whose // Walk the document array and delete any xapian document whose
// flag is not set (we did not see its source during indexing). // flag is not set (we did not see its source during indexing).
int purgecount = 0;
for (Xapian::docid docid = 1; docid < updated.size(); ++docid) { for (Xapian::docid docid = 1; docid < updated.size(); ++docid) {
if (!updated[docid]) { if (!updated[docid]) {
if ((purgecount+1) % 100 == 0) {
try {
CancelCheck::instance().checkCancel();
} catch(CancelExcept) {
LOGINFO(("Db::purge: partially cancelled\n"));
break;
}
}
try { try {
m_ndb->xwdb.delete_document(docid); m_ndb->xwdb.delete_document(docid);
LOGDEB(("Db::purge: deleted document #%d\n", docid)); LOGDEB(("Db::purge: deleted document #%d\n", docid));
@ -1334,6 +1344,7 @@ bool Db::purge()
} catch (...) { } catch (...) {
LOGERR(("Db::purge: document #%d: unknown error\n", docid)); LOGERR(("Db::purge: document #%d: unknown error\n", docid));
} }
purgecount++;
} }
} }