X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fhousekeeping.c;h=54cfe11b83fa0888917d8c384c683ef4844748cb;hb=24d1e719dd6b40e0eb4153b928b758abb17863a1;hp=dae17c3eab220770de5ad614244704063adb3f7d;hpb=7b92376d3c819cfe849b92dfc5c312084408af9c;p=citadel.git diff --git a/citadel/housekeeping.c b/citadel/housekeeping.c index dae17c3ea..54cfe11b8 100644 --- a/citadel/housekeeping.c +++ b/citadel/housekeeping.c @@ -1,7 +1,7 @@ /* * This file contains miscellaneous housekeeping tasks. * - * Copyright (c) 1987-2017 by the citadel.org team + * Copyright (c) 1987-2021 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. @@ -19,7 +19,9 @@ #include "serv_extensions.h" #include "room_ops.h" #include "internet_addressing.h" +#include "config.h" #include "journaling.h" +#include "citadel_ldap.h" void check_sched_shutdown(void) { if ((ScheduledShutdown == 1) && (ContextList == NULL)) { @@ -70,7 +72,17 @@ void check_ref_counts(void) { lputfloor(&flbuf, a); syslog(LOG_DEBUG, "housekeeping: floor %d has %d rooms", a, new_refcounts[a]); } -} +} + + +/* + * Provide hints as to whether we have any memory leaks + */ +void keep_an_eye_on_memory_usage(void) { + static void *original_brk = NULL; + if (!original_brk) original_brk = sbrk(0); // Remember the original program break so we can test for leaks + syslog(LOG_DEBUG, "original_brk=%lx, current_brk=%lx, addl=%ld", (long)original_brk, (long)sbrk(0), (long)(sbrk(0)-original_brk)); // FIXME not so noisy please +} /* @@ -80,12 +92,18 @@ void check_ref_counts(void) { * instance to run at a time. */ static int housekeeping_in_progress = 0; +static int housekeeping_disabled = 0; static time_t last_timer = 0L; + void do_housekeeping(void) { int do_housekeeping_now = 0; int do_perminute_housekeeping_now = 0; time_t now; + if (housekeeping_disabled) { + return; + } + /* * We do it this way instead of wrapping the whole loop in an * S_HOUSEKEEPING critical section because it eliminates the need to @@ -99,7 +117,7 @@ void do_housekeeping(void) { end_critical_section(S_HOUSEKEEPING); now = time(NULL); - if (do_housekeeping_now == 0) { + if ( (do_housekeeping_now == 0) && (!CtdlIsSingleUser()) ) { if ( (now - last_timer) > (time_t)300 ) { syslog(LOG_WARNING, "housekeeping: WARNING: housekeeping loop has not run for %ld minutes. Is something stuck?", @@ -125,8 +143,17 @@ void do_housekeeping(void) { /* Then, do the "once per minute" stuff... */ if (do_perminute_housekeeping_now) { - cdb_check_handles(); /* suggested by Justin Case */ - PerformSessionHooks(EVT_TIMER); /* Run any timer hooks */ + cdb_check_handles(); + PerformSessionHooks(EVT_TIMER); // Run all registered TIMER hooks + + // LDAP sync isn't in a module so we can put it here + static time_t last_ldap_sync = 0L; + if ( (now - last_ldap_sync) > (time_t)CtdlGetConfigLong("c_ldap_sync_freq") ) { + CtdlSynchronizeUsersFromLDAP(); + last_ldap_sync = time(NULL); + } + + keep_an_eye_on_memory_usage(); } /* @@ -138,59 +165,26 @@ void do_housekeeping(void) { } -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"); +void CtdlDisableHouseKeeping(void) { + syslog(LOG_INFO, "housekeeping: trying to disable"); + while ( (!housekeeping_disabled) && (!server_shutting_down) && (!housekeeping_in_progress) ) { -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