time sync stuff for vps

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@8122 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Anthony Minessale 2008-04-16 22:02:06 +00:00
parent 04aeb7dedb
commit 412e45dd62
3 changed files with 43 additions and 23 deletions

View File

@ -1597,6 +1597,7 @@ SWITCH_DECLARE(void) switch_time_sync(void);
SWITCH_DECLARE(time_t) switch_timestamp(time_t *t); SWITCH_DECLARE(time_t) switch_timestamp(time_t *t);
SWITCH_DECLARE(void) switch_load_network_lists(switch_bool_t reload); SWITCH_DECLARE(void) switch_load_network_lists(switch_bool_t reload);
SWITCH_DECLARE(switch_bool_t) switch_check_network_list_ip(const char *ip_str, const char *list_name); SWITCH_DECLARE(switch_bool_t) switch_check_network_list_ip(const char *ip_str, const char *list_name);
SWITCH_DECLARE(void) switch_time_set_monotonic(switch_bool_t enable);
///\} ///\}

View File

@ -898,6 +898,8 @@ SWITCH_DECLARE(switch_status_t) switch_core_init(switch_core_flag_t flags, switc
runtime.mailer_app_args = switch_core_strdup(runtime.memory_pool, val); runtime.mailer_app_args = switch_core_strdup(runtime.memory_pool, val);
} else if (!strcasecmp(var, "sessions-per-second")) { } else if (!strcasecmp(var, "sessions-per-second")) {
switch_core_sessions_per_second(atoi(val)); switch_core_sessions_per_second(atoi(val));
} else if (!strcasecmp(var, "disable-monotonic-timing")) {
switch_time_set_monotonic(SWITCH_FALSE);
} else if (!strcasecmp(var, "max-sessions")) { } else if (!strcasecmp(var, "max-sessions")) {
switch_core_session_limit(atoi(val)); switch_core_session_limit(atoi(val));
} }

View File

@ -101,6 +101,13 @@ static int MONO = 1;
static int MONO = 0; static int MONO = 0;
#endif #endif
SWITCH_DECLARE(void) switch_time_set_monotonic(switch_bool_t enable)
{
MONO = enable ? 1 : 0;
switch_time_sync();
}
static switch_time_t time_now(int64_t offset) static switch_time_t time_now(int64_t offset)
{ {
switch_time_t now; switch_time_t now;
@ -112,7 +119,7 @@ static switch_time_t time_now(int64_t offset)
now = ts.tv_sec * APR_USEC_PER_SEC + (ts.tv_nsec/1000) + offset; now = ts.tv_sec * APR_USEC_PER_SEC + (ts.tv_nsec/1000) + offset;
} else { } else {
#endif #endif
now = switch_time_now(); now = switch_time_now();
#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC) #if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC)
} }
@ -179,12 +186,12 @@ static switch_status_t timer_init(switch_timer_t *timer)
return SWITCH_STATUS_MEMERR; return SWITCH_STATUS_MEMERR;
} }
#define check_roll() if (private_info->roll < TIMER_MATRIX[timer->interval].roll) {\ #define check_roll() if (private_info->roll < TIMER_MATRIX[timer->interval].roll) { \
private_info->roll++;\ private_info->roll++; \
private_info->reference = private_info->start = TIMER_MATRIX[timer->interval].tick;\ private_info->reference = private_info->start = TIMER_MATRIX[timer->interval].tick; \
}\ } \
static switch_status_t timer_step(switch_timer_t *timer) static switch_status_t timer_step(switch_timer_t *timer)
{ {
timer_private_t *private_info = timer->private_info; timer_private_t *private_info = timer->private_info;
@ -193,7 +200,7 @@ static switch_status_t timer_step(switch_timer_t *timer)
if (globals.RUNNING != 1 || private_info->ready == 0) { if (globals.RUNNING != 1 || private_info->ready == 0) {
return SWITCH_STATUS_FALSE; return SWITCH_STATUS_FALSE;
} }
check_roll(); check_roll();
samples = timer->samples * (private_info->reference - private_info->start); samples = timer->samples * (private_info->reference - private_info->start);
@ -326,18 +333,23 @@ SWITCH_MODULE_RUNTIME_FUNCTION(softtimer_runtime)
ts = 0; ts = 0;
last = 0; last = 0;
fwd_errs = rev_errs = 0; fwd_errs = rev_errs = 0;
while (globals.RUNNING == 1) { while (globals.RUNNING == 1) {
runtime.reference += STEP_MIC; runtime.reference += STEP_MIC;
while ((ts = time_now(runtime.offset)) < runtime.reference) { while ((ts = time_now(runtime.offset)) < runtime.reference) {
if (ts < last) { if (ts < last) {
int64_t diff = (int64_t)(ts - last); if (MONO) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Reverse Clock Skew Detected!\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Virtual Migration Detected! Syncing Clock\n");
runtime.reference = switch_time_now(); switch_time_sync();
current_ms = 0; } else {
tick = 0; int64_t diff = (int64_t)(ts - last);
runtime.initiated += diff; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Reverse Clock Skew Detected!\n");
rev_errs++; runtime.reference = switch_time_now();
current_ms = 0;
tick = 0;
runtime.initiated += diff;
rev_errs++;
}
} else { } else {
rev_errs = 0; rev_errs = 0;
} }
@ -347,13 +359,18 @@ SWITCH_MODULE_RUNTIME_FUNCTION(softtimer_runtime)
if (ts > (runtime.reference + too_late)) { if (ts > (runtime.reference + too_late)) {
switch_time_t diff = ts - runtime.reference - STEP_MIC; if (MONO) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Forward Clock Skew Detected!\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Virtual Migration Detected! Syncing Clock\n");
fwd_errs++; switch_time_sync();
runtime.reference = switch_time_now(); } else {
current_ms = 0; switch_time_t diff = ts - runtime.reference - STEP_MIC;
tick = 0; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Forward Clock Skew Detected!\n");
runtime.initiated += diff; fwd_errs++;
runtime.reference = switch_time_now();
current_ms = 0;
tick = 0;
runtime.initiated += diff;
}
} else { } else {
fwd_errs = 0; fwd_errs = 0;
} }