int i;
static time_t last_progress = 0L;
static int is_running = 0;
+
if (is_running) return; // Concurrency check - only one can run
is_running = 1;
// Don't do this if the site doesn't have it enabled.
if (!CtdlGetConfigInt("c_enable_fulltext")) {
+ is_running = 0;
return;
}
// If we've switched wordbreaker modules, burn the index and start over.
// Silently return if our fulltext index is up to date with new messages.
if ((CtdlGetConfigLong("MMfulltext") >= CtdlGetConfigLong("MMhighest"))) {
+ is_running = 0;
return; // nothing to do!
}
long msgnum = 0;
long prev_msgnum = 0;
time_t started_indexing_at = time(NULL);
- for (i=0; i<array_len(messages_to_be_indexed); ++i) {
+ int yielded = 0;
+ for (i=0; ((i<array_len(messages_to_be_indexed)) && (yielded == 0)); ++i) {
memcpy(&msgnum, array_get_element_at(messages_to_be_indexed, i), sizeof(long));
if (msgnum != prev_msgnum) { // careful to avoid dupes
ft_index_message(msgnum, 1);
}
-
prev_msgnum = msgnum;
+
+ // If we run too long, yield the thread so the server can do other things. We'll be back.
if (time(NULL) - started_indexing_at >= MAXIMUM_INDEXER_RUN_TIME) {
- syslog(LOG_DEBUG, "fulltext: indexer has run for %ld seconds; yielding the thread", time(NULL) - started_indexing_at);
- i = array_len(messages_to_be_indexed); // go out of scope to make it stop
+ yielded = 1;
}
}
array_free(messages_to_be_indexed);
-
CtdlSetConfigInt("MM_fulltext_wordbreaker", FT_WORDBREAKER_ID);
+ syslog(LOG_DEBUG, "fulltext: indexer has run for %ld seconds; yielded=%d", time(NULL) - started_indexing_at, yielded);
+
+ // This keeps the indexer from starting up over and over if the highest message in the list was deleted
+ // before we had a chance to index it.
+ if (!yielded) {
+ CtdlSetConfigLong("MMfulltext", highest_msg_to_be_indexed);
+ }
- syslog(LOG_DEBUG, "fulltext: indexing finished");
is_running = 0;
return;
}