From f4097df68b2317c95e1687b88098e2593971c68f Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Fri, 1 Sep 2023 15:07:42 +0000 Subject: [PATCH] fulltext: after the indexer runs for 60 seconds (tunable), yield the thread --- citadel/server/modules/fulltext/serv_fulltext.c | 8 ++++++-- citadel/server/modules/fulltext/serv_fulltext.h | 4 ++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/citadel/server/modules/fulltext/serv_fulltext.c b/citadel/server/modules/fulltext/serv_fulltext.c index 7f7dd7959..ea374542e 100644 --- a/citadel/server/modules/fulltext/serv_fulltext.c +++ b/citadel/server/modules/fulltext/serv_fulltext.c @@ -34,7 +34,6 @@ #include "../../context.h" #include "../../ctdl_module.h" - // These can be global variables because only one indexer runs at a time. Array *messages_to_be_indexed = NULL; long highest_msg_already_indexed = 0; @@ -226,6 +225,7 @@ void do_fulltext_indexing(void) { // Here it is ... do each message! long msgnum = 0; long prev_msgnum = 0; + time_t started_indexing_at = time(NULL); for (i=0; i= 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 + } } array_free(messages_to_be_indexed); @@ -344,7 +348,7 @@ char *ctdl_module_init_fulltext(void) { if (!threading) { CtdlRegisterProtoHook(cmd_srch, "SRCH", "Full text search"); CtdlRegisterDeleteHook(ft_delete_remove); - CtdlRegisterSessionHook(do_fulltext_indexing, EVT_TIMER, PRIO_CLEANUP + 300); + CtdlRegisterSessionHook(do_fulltext_indexing, EVT_HOUSE, PRIO_CLEANUP + 300); } // return our module name for the log return "fulltext"; diff --git a/citadel/server/modules/fulltext/serv_fulltext.h b/citadel/server/modules/fulltext/serv_fulltext.h index e96a8f60c..32f5d5f99 100644 --- a/citadel/server/modules/fulltext/serv_fulltext.h +++ b/citadel/server/modules/fulltext/serv_fulltext.h @@ -5,3 +5,7 @@ void ft_index_message(long msgnum, int op); Array *CtdlFullTextSearch(const char *search_string); + +// After this many seconds, the indexer will stop and yield the housekeeping thread. +// On the next cycle it will run again and pick up where it left off. +#define MAXIMUM_INDEXER_RUN_TIME 60 -- 2.39.2