X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fhousekeeping.c;h=dae17c3eab220770de5ad614244704063adb3f7d;hb=7b92376d3c819cfe849b92dfc5c312084408af9c;hp=11be04e0092133b4cbee41498bce0abfe67cec04;hpb=655de5af64c89584fbdd0110a27053a9f3bfd138;p=citadel.git diff --git a/citadel/housekeeping.c b/citadel/housekeeping.c index 11be04e00..dae17c3ea 100644 --- a/citadel/housekeeping.c +++ b/citadel/housekeeping.c @@ -1,7 +1,7 @@ /* * This file contains miscellaneous housekeeping tasks. * - * Copyright (c) 1987-2011 by the citadel.org team + * Copyright (c) 1987-2017 by the citadel.org team * * This program is open source software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 3. @@ -23,13 +23,12 @@ void check_sched_shutdown(void) { if ((ScheduledShutdown == 1) && (ContextList == NULL)) { - syslog(LOG_NOTICE, "Scheduled shutdown initiating.\n"); + syslog(LOG_NOTICE, "housekeeping: scheduled shutdown initiating"); server_shutting_down = 1; } } - /* * Check (and fix) floor reference counts. This doesn't need to be done * very often, since the counts should remain correct during normal operation. @@ -43,13 +42,14 @@ void check_ref_counts_backend(struct ctdlroom *qrbuf, void *data) { ++new_refcounts[(int)qrbuf->QRfloor]; } + void check_ref_counts(void) { struct floor flbuf; int a; int new_refcounts[MAXFLOORS]; - syslog(LOG_DEBUG, "Checking floor reference counts\n"); + syslog(LOG_DEBUG, "housekeeping: checking floor reference counts"); for (a=0; a (time_t)300 ) { + syslog(LOG_WARNING, + "housekeeping: WARNING: housekeeping loop has not run for %ld minutes. Is something stuck?", + ((now - last_timer) / 60) + ); + } return; } @@ -106,7 +114,6 @@ void do_housekeeping(void) { * loop. Everything below this point is real work. */ - now = time(NULL); if ( (now - last_timer) > (time_t)60 ) { do_perminute_housekeeping_now = 1; last_timer = time(NULL); @@ -129,3 +136,62 @@ void do_housekeeping(void) { housekeeping_in_progress = 0; end_critical_section(S_HOUSEKEEPING); } + + +void CtdlDisableHouseKeeping(void) +{ + int ActiveBackgroundJobs; + int do_housekeeping_now = 0; + struct CitContext *nptr; + int nContexts, i; + +retry_block_housekeeping: + syslog(LOG_INFO, "housekeeping: trying to disable services"); + begin_critical_section(S_HOUSEKEEPING); + if (housekeeping_in_progress == 0) { + do_housekeeping_now = 1; + housekeeping_in_progress = 1; + } + end_critical_section(S_HOUSEKEEPING); + if (do_housekeeping_now == 0) { + usleep(1000000); + goto retry_block_housekeeping; + } + + syslog(LOG_INFO, "housekeeping: checking for running server jobs"); + +retry_wait_for_contexts: + /* So that we don't keep the context list locked for a long time + * we create a copy of it first + */ + ActiveBackgroundJobs = 0; + nptr = CtdlGetContextArray(&nContexts) ; + if (nptr) + { + for (i=0; i