From b276416014e4ea27a523c63d912c925dd53675c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edwin=20T=C3=B6r=C3=B6k?= Date: Fri, 21 Feb 2025 14:16:51 +0000 Subject: [PATCH 1/3] Update .gitignore with CodeChecker files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Edwin Török --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 8a1ce60..f581313 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ include/mtcerrno.h scripts/generr scripts/generr.o scripts/ha_errnorc +compile_commands.json +.cache/ From 3b50a2a4183fd845420dee9cabee4875be9c4a50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edwin=20T=C3=B6r=C3=B6k?= Date: Tue, 18 Feb 2025 17:34:14 +0000 Subject: [PATCH 2/3] CA-407106: Fix build with clang: remove nested functions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nested functions are a GCC-only extension and are not supported by clang and clangd at all. Signed-off-by: Edwin Török --- daemon/sm.c | 80 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 47 insertions(+), 33 deletions(-) diff --git a/daemon/sm.c b/daemon/sm.c index b347f00..42cd027 100755 --- a/daemon/sm.c +++ b/daemon/sm.c @@ -808,16 +808,13 @@ sm( } -MTC_STATIC void -rendezvous( - SM_PHASE phase1, - SM_PHASE phase2, - SM_PHASE phase3, - MTC_BOOLEAN on_heartbeat, - MTC_BOOLEAN on_statefile) -{ #if RENDEZVOUS_FAULT_HANDLING - void rendezvous_wait(SM_PHASE p1, SM_PHASE p2) +MTC_STATIC void +rendezvous_wait( + SM_PHASE p1, + SM_PHASE p2, + MTC_BOOLEAN on_heartbeat, + MTC_BOOLEAN on_statefile) { PCOM_DATA_SM psm; PCOM_DATA_HB phb; @@ -898,12 +895,22 @@ rendezvous( hb_SF_cancel_accelerate(); } } +#endif +MTC_STATIC void +rendezvous( + SM_PHASE phase1, + SM_PHASE phase2, + SM_PHASE phase3, + MTC_BOOLEAN on_heartbeat, + MTC_BOOLEAN on_statefile) +{ +#if RENDEZVOUS_FAULT_HANDLING set_sm_phase(phase1); - rendezvous_wait(phase1, phase2); + rendezvous_wait(phase1, phase2, on_heartbeat, on_statefile); set_sm_phase(phase2); - rendezvous_wait(phase2, phase3); + rendezvous_wait(phase2, phase3, on_heartbeat, on_statefile); #else set_sm_phase(phase2); #endif @@ -1863,15 +1870,11 @@ check_pool_state() MTC_STATIC MTC_BOOLEAN -update_sfdomain() -{ - MTC_CLOCK now; - MTC_S8 hostmap[MAX_HOST_NUM + 1] = {0}; - MTC_BOOLEAN changed = FALSE; - - MTC_BOOLEAN update_sfdomain_sub( +update_sfdomain_sub( + MTC_CLOCK now, + MTC_S8 hostmap[MAX_HOST_NUM + 1], MTC_BOOLEAN writable) - { +{ PCOM_DATA_SF psf; MTC_BOOLEAN changed = FALSE; MTC_S32 index; @@ -1960,14 +1963,21 @@ update_sfdomain() } return changed; - } +} + +MTC_STATIC MTC_BOOLEAN +update_sfdomain() +{ + MTC_CLOCK now; + MTC_S8 hostmap[MAX_HOST_NUM + 1] = {0}; + MTC_BOOLEAN changed = FALSE; now = _getms(); - changed = update_sfdomain_sub(FALSE); + changed = update_sfdomain_sub(now, hostmap, FALSE); if (changed) { - changed = update_sfdomain_sub(TRUE); + changed = update_sfdomain_sub(now, hostmap, TRUE); if (changed) { log_message(MTC_LOG_DEBUG, @@ -2777,18 +2787,12 @@ sm_send_signals_sm_hb_sf( } -MTC_STATIC MTC_BOOLEAN -sm_wait_signals_sm_hb_sf( +static MTC_BOOLEAN +check_sigs( MTC_BOOLEAN sm_sig, MTC_BOOLEAN hb_sig, - MTC_BOOLEAN sf_sig, - MTC_CLOCK timeout) + MTC_BOOLEAN sf_sig) { - MTC_BOOLEAN signaled; - MTC_CLOCK start = _getms(); - - MTC_BOOLEAN check_sigs() - { MTC_BOOLEAN signaled = FALSE; if (sm_sig && smvar.sm_sig) @@ -2808,7 +2812,17 @@ sm_wait_signals_sm_hb_sf( } return signaled; - } +} + +MTC_STATIC MTC_BOOLEAN +sm_wait_signals_sm_hb_sf( + MTC_BOOLEAN sm_sig, + MTC_BOOLEAN hb_sig, + MTC_BOOLEAN sf_sig, + MTC_CLOCK timeout) +{ + MTC_BOOLEAN signaled; + MTC_CLOCK start = _getms(); if (timeout == 0) { @@ -2816,7 +2830,7 @@ sm_wait_signals_sm_hb_sf( } pthread_mutex_lock(&smvar.mutex); - while (!(signaled = check_sigs()) && + while (!(signaled = check_sigs(sm_sig, hb_sig, sf_sig)) && ((timeout < 0)? TRUE: (_getms() - start < timeout))) { if (timeout < 0) From f73bcd6beb065466925aa615fc677def2291a9ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edwin=20T=C3=B6r=C3=B6k?= Date: Tue, 18 Feb 2025 17:57:38 +0000 Subject: [PATCH 3/3] Use pthread_cond_timewait instead of waking up every 100ms MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TODO: use pthread_condattr_setclock and switch to a monotonic clock instead Signed-off-by: Edwin Török --- daemon/sm.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/daemon/sm.c b/daemon/sm.c index 42cd027..d4d953d 100755 --- a/daemon/sm.c +++ b/daemon/sm.c @@ -2814,6 +2814,8 @@ check_sigs( return signaled; } +#define NSEC_PER_SEC 1000000000 + MTC_STATIC MTC_BOOLEAN sm_wait_signals_sm_hb_sf( MTC_BOOLEAN sm_sig, @@ -2822,16 +2824,23 @@ sm_wait_signals_sm_hb_sf( MTC_CLOCK timeout) { MTC_BOOLEAN signaled; - MTC_CLOCK start = _getms(); + + struct timespec deadline; if (timeout == 0) { return FALSE; } + struct timespec timeout_ts = mstots(timeout); + clock_gettime(CLOCK_REALTIME, &deadline); + deadline.tv_nsec += timeout_ts.tv_nsec; + deadline.tv_sec += timeout_ts.tv_sec; + deadline.tv_sec += deadline.tv_nsec / NSEC_PER_SEC; + deadline.tv_nsec %= NSEC_PER_SEC; + pthread_mutex_lock(&smvar.mutex); - while (!(signaled = check_sigs(sm_sig, hb_sig, sf_sig)) && - ((timeout < 0)? TRUE: (_getms() - start < timeout))) + while (!(signaled = check_sigs(sm_sig, hb_sig, sf_sig))) { if (timeout < 0) { @@ -2839,10 +2848,8 @@ sm_wait_signals_sm_hb_sf( } else { - pthread_mutex_unlock(&smvar.mutex); - mssleep(100); - pthread_mutex_lock(&smvar.mutex); - } + pthread_cond_timedwait(&smvar.cond, &smvar.mutex, &deadline); + } } pthread_mutex_unlock(&smvar.mutex);