From 703e2206a3de6ffa8898ec874ce22214d804d2b6 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Mon, 28 Aug 2023 23:53:58 -0400 Subject: [PATCH] cdb_tick() called periodically --- .../server/backends/berkeley_db/berkeley_db.c | 19 +++++++++++++++++ citadel/server/backends/common/database.c | 1 + citadel/server/database.h | 1 + citadel/server/housekeeping.c | 1 + citadel/server/room_ops.c | 21 +++++++++---------- citadel/server/sysdep.c | 6 +++--- citadel/server/threads.c | 11 ++++++++++ 7 files changed, 46 insertions(+), 14 deletions(-) diff --git a/citadel/server/backends/berkeley_db/berkeley_db.c b/citadel/server/backends/berkeley_db/berkeley_db.c index 4d77a0b14..3e7d2af90 100644 --- a/citadel/server/backends/berkeley_db/berkeley_db.c +++ b/citadel/server/backends/berkeley_db/berkeley_db.c @@ -621,6 +621,24 @@ void bdb_compact(void) { } +// periodically called for maintenance +void bdb_tick(void) { + int ret; + int rejected; + + ret = bdb_env->lock_detect(bdb_env, 0, DB_LOCK_DEFAULT, &rejected); + if (ret) { + syslog(LOG_ERR, "bdb: lock_detect: %s", db_strerror(ret)); + } + else if (rejected) { + syslog(LOG_DEBUG, "bdb: rejected lock %d", rejected); + bdb_abort(); // FIXME remove this, we want to unlock, not abort + } + + syslog(LOG_DEBUG, "bdb: tick..."); +} + + // Calling this function activates the Berkeley DB back end. void bdb_init_backend(void) { @@ -639,6 +657,7 @@ void bdb_init_backend(void) { cdb_end_transaction = bdb_end_transaction; cdb_check_handles = bdb_check_handles; cdb_trunc = bdb_trunc; + cdb_tick = bdb_tick; // Some functions in this backend need to store some per-thread data. // We crerate the key here, during module initialization. diff --git a/citadel/server/backends/common/database.c b/citadel/server/backends/common/database.c index ac1ebbad6..934d5553e 100644 --- a/citadel/server/backends/common/database.c +++ b/citadel/server/backends/common/database.c @@ -37,6 +37,7 @@ void (*check_handles)(void *) = NULL; void (*cdb_compact)(void) = NULL; void (*cdb_checkpoint)(void) = NULL; void (*cdb_rewind)(int) = NULL; +void (*cdb_tick)(void) = NULL; // This function is responsible for choosing and initializing a back end. void cdb_init_backends(void) { diff --git a/citadel/server/database.h b/citadel/server/database.h index c8345b8fd..a83211d39 100644 --- a/citadel/server/database.h +++ b/citadel/server/database.h @@ -25,5 +25,6 @@ extern struct cdbdata (*cdb_fetch)(int, const void *, int); extern void (*cdb_checkpoint)(void); extern void (*cdb_compact)(void); extern void (*cdb_rewind)(int); +extern void (*cdb_tick)(void); #endif diff --git a/citadel/server/housekeeping.c b/citadel/server/housekeeping.c index 8b13b9552..55e7e77d6 100644 --- a/citadel/server/housekeeping.c +++ b/citadel/server/housekeeping.c @@ -124,6 +124,7 @@ void do_housekeeping(void) { // First, do the "as often as needed" stuff... JournalRunQueue(); PerformSessionHooks(EVT_HOUSE); + cdb_tick(); // Then, do the "once per minute" stuff... if (do_perminute_housekeeping_now) { diff --git a/citadel/server/room_ops.c b/citadel/server/room_ops.c index f61e1f126..301f59872 100644 --- a/citadel/server/room_ops.c +++ b/citadel/server/room_ops.c @@ -886,17 +886,6 @@ int CtdlRenameRoom(char *old_name, char *new_name, int new_floor) { qrbuf.QRfloor = new_floor; CtdlPutRoom(&qrbuf); - begin_critical_section(S_CONFIG); - - // If baseroom/aideroom name changes, update config - if (!strncasecmp(old_name, CtdlGetConfigStr("c_baseroom"), ROOMNAMELEN)) { - CtdlSetConfigStr("c_baseroom", new_name); - } - if (!strncasecmp(old_name, CtdlGetConfigStr("c_aideroom"), ROOMNAMELEN)) { - CtdlSetConfigStr("c_aideroom", new_name); - } - - end_critical_section(S_CONFIG); // If the room name changed, then there are now two room // records, so we have to delete the old one. @@ -909,6 +898,16 @@ int CtdlRenameRoom(char *old_name, char *new_name, int new_floor) { end_critical_section(S_ROOMS); + // If baseroom/aideroom name changes, update config + begin_critical_section(S_CONFIG); + if (!strncasecmp(old_name, CtdlGetConfigStr("c_baseroom"), ROOMNAMELEN)) { + CtdlSetConfigStr("c_baseroom", new_name); + } + if (!strncasecmp(old_name, CtdlGetConfigStr("c_aideroom"), ROOMNAMELEN)) { + CtdlSetConfigStr("c_aideroom", new_name); + } + end_critical_section(S_CONFIG); + // Adjust the floor reference counts if necessary if (new_floor != old_floor) { lgetfloor(&flbuf, old_floor); diff --git a/citadel/server/sysdep.c b/citadel/server/sysdep.c index ee69a19c7..ada01885f 100644 --- a/citadel/server/sysdep.c +++ b/citadel/server/sysdep.c @@ -46,7 +46,7 @@ static RETSIGTYPE signal_cleanup(int signum) { signal(SIGINT, SIG_DFL); signal(SIGHUP, SIG_DFL); signal(SIGTERM, SIG_DFL); - signal(SIGSEGV, SIG_DFL); + //signal(SIGSEGV, SIG_DFL); exit_signal = signum; server_shutting_down = 1; master_cleanup(signum); @@ -83,13 +83,13 @@ void init_sysdep(void) { sigaddset(&set, SIGINT); sigaddset(&set, SIGHUP); sigaddset(&set, SIGTERM); - sigaddset(&set, SIGSEGV); + //sigaddset(&set, SIGSEGV); sigprocmask(SIG_UNBLOCK, &set, NULL); signal(SIGINT, signal_cleanup); signal(SIGHUP, signal_cleanup); signal(SIGTERM, signal_cleanup); - signal(SIGSEGV, signal_cleanup); + //signal(SIGSEGV, signal_cleanup); // Do not shut down the server on broken pipe signals, otherwise the // whole Citadel service would come down whenever a single client diff --git a/citadel/server/threads.c b/citadel/server/threads.c index 8c1866498..78ded25de 100644 --- a/citadel/server/threads.c +++ b/citadel/server/threads.c @@ -21,6 +21,7 @@ int active_workers = 0; // Number of ACTIVE worker threads pthread_mutex_t Critters[MAX_SEMAPHORES]; // Things needing locking int server_shutting_down = 0; // set to nonzero during shutdown pthread_mutex_t ThreadCountMutex; +char locks[MAX_SEMAPHORES+1]; void InitializeSemaphores(void) { int i; @@ -28,7 +29,9 @@ void InitializeSemaphores(void) { // Set up a bunch of semaphores to be used for critical sections for (i=0; i