From 7dcbe7bda688e0523ab889fd09f2736beb6e3858 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 29 Mar 2011 21:05:04 -0500 Subject: [PATCH] FS-3189 ok, patch added, but have you discovered why you trigger this because its not typical and is the sign of a problem I would assume? --- conf/sip_profiles/internal.xml | 6 ++++-- src/mod/endpoints/mod_sofia/sofia.c | 9 +++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/conf/sip_profiles/internal.xml b/conf/sip_profiles/internal.xml index b78ea20070..b803bcea6d 100644 --- a/conf/sip_profiles/internal.xml +++ b/conf/sip_profiles/internal.xml @@ -47,8 +47,8 @@ Sometimes, in extremely rare edge cases, the Sofia SIP stack may stop responding. These options allow you to enable and control a watchdog on the Sofia SIP stack so that if it stops responding for the - specified number of milliseconds, it will cause FreeSWITCH to shut - down immediately. This is useful if you run in an HA environment and + specified number of milliseconds, it will cause FreeSWITCH to crash + immediately. This is useful if you run in an HA environment and need to ensure automated recovery from such a condition. Note that if your server is idle a lot, the watchdog may fire due to not receiving any SIP messages. Thus, if you expect your system to be idle, you @@ -57,6 +57,8 @@ globally for all profiles. So, if you run in an HA environment with a master and slave, you should use the CLI to make sure the watchdog is only enabled on the master. + If such crash occurs, FreeSWITCH will dump core if allowed. The + stacktrace will include function watchdog_triggered_abort(). --> diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index ca9b0cd974..5a3ad76680 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -1275,6 +1275,11 @@ static void sofia_perform_profile_start_failure(sofia_profile_t *profile, char * } } +/* not a static function so that it's still visible on stacktraces */ +void watchdog_triggered_abort(void) { + abort(); +} + #define sofia_profile_start_failure(p, xp) sofia_perform_profile_start_failure(p, xp, __FILE__, __LINE__) @@ -1390,10 +1395,10 @@ void *SWITCH_THREAD_FUNC sofia_profile_worker_thread_run(switch_thread_t *thread } if (event_fail || step_fail) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Profile %s: SIP STACK FAILURE DETECTED!\n" + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Profile %s: SIP STACK FAILURE DETECTED BY WATCHDOG!\n" "GOODBYE CRUEL WORLD, I'M LEAVING YOU TODAY....GOODBYE, GOODBYE, GOOD BYE\n", profile->name); switch_yield(2000000); - abort(); + watchdog_triggered_abort(); } }