X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fhousekeeping.c;h=0ca383202c2bb1f27275e2d92cedb5f7d5a860f5;hb=fa2dd842abb5feedea3e2253255722fcaecc3c6f;hp=139ada05ee63915e6716285c2f2d7791e8df2e69;hpb=6b7ec622dd2a18715d3c0f353d23ade3f463f3f3;p=citadel.git diff --git a/citadel/housekeeping.c b/citadel/housekeeping.c index 139ada05e..0ca383202 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 +} /* @@ -98,7 +110,14 @@ void do_housekeeping(void) { } end_critical_section(S_HOUSEKEEPING); - if (do_housekeeping_now == 0) { + now = time(NULL); + 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?", + ((now - last_timer) / 60) + ); + } return; } @@ -107,7 +126,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); @@ -119,8 +137,18 @@ 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 + +#ifdef HAVE_LDAP // 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); + } +#endif + + keep_an_eye_on_memory_usage(); } /* @@ -132,8 +160,7 @@ void do_housekeeping(void) { } -void CtdlDisableHouseKeeping(void) -{ +void CtdlDisableHouseKeeping(void) { int ActiveBackgroundJobs; int do_housekeeping_now = 0; struct CitContext *nptr; @@ -164,7 +191,7 @@ retry_wait_for_contexts: { for (i=0; i