Repository: trafficserver Updated Branches: refs/heads/master 99682fd3a -> e63b4ac69
TS-1461: Update traffic_manager to restart with exponential backoff Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/e63b4ac6 Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/e63b4ac6 Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/e63b4ac6 Branch: refs/heads/master Commit: e63b4ac690ec503c5efb2ad636ac0a4fdce9144a Parents: 99682fd Author: Eric Schwartz <[email protected]> Authored: Fri Dec 12 16:17:11 2014 -0800 Committer: Bryan Call <[email protected]> Committed: Fri Dec 12 16:18:08 2014 -0800 ---------------------------------------------------------------------- cmd/traffic_manager/traffic_manager.cc | 30 ++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e63b4ac6/cmd/traffic_manager/traffic_manager.cc ---------------------------------------------------------------------- diff --git a/cmd/traffic_manager/traffic_manager.cc b/cmd/traffic_manager/traffic_manager.cc index b08cf82..fb3ce44 100644 --- a/cmd/traffic_manager/traffic_manager.cc +++ b/cmd/traffic_manager/traffic_manager.cc @@ -361,6 +361,15 @@ Init_Errata_Logging() { } #endif +static void +millisleep(int ms) { + struct timespec ts; + + ts.tv_sec = ms / 1000; + ts.tv_nsec = (ms - ts.tv_sec * 1000) * 1000 * 1000; + nanosleep(&ts, NULL); //we use nanosleep instead of sleep because it does not interact with signals +} + int main(int argc, char **argv) { @@ -710,6 +719,8 @@ main(int argc, char **argv) RecRegisterStatInt(RECT_NODE, "proxy.node.config.restart_required.manager", 0, RECP_NON_PERSISTENT); RecRegisterStatInt(RECT_NODE, "proxy.node.config.restart_required.cop", 0, RECP_NON_PERSISTENT); + int sleep_time = 0; //sleep_time given in sec + for (;;) { lmgmt->processEventQueue(); lmgmt->pollMgmtProcessServer(); @@ -773,10 +784,19 @@ main(int argc, char **argv) } if (lmgmt->run_proxy && !lmgmt->processRunning()) { /* Make sure we still have a proxy up */ - if (lmgmt->startProxy()) + if (sleep_time) { + mgmt_log(stderr, "Relaunching proxy after %d sec...", sleep_time); + millisleep(1000 * sleep_time); //we use millisleep instead of sleep because it doesnt interfere with signals + sleep_time = (sleep_time > 30) ? 60 : sleep_time * 2; + } else { + sleep_time = 1; + } + if (lmgmt->startProxy()) { just_started = 0; - else + sleep_time = 0; + } else { just_started++; + } } else { /* Give the proxy a chance to fire up */ just_started++; } @@ -792,13 +812,13 @@ main(int argc, char **argv) if (WIFSIGNALED(res)) { int sig = WTERMSIG(res); #ifdef NEED_PSIGNAL - mgmt_log(stderr, "[main] Proxy terminated due to Sig %d\n", sig); + mgmt_log(stderr, "[main] Proxy terminated due to Sig %d. Relaunching after %d sec...\n", sig, sleep_time); #else - mgmt_log(stderr, "[main] Proxy terminated due to Sig %d: %s\n", sig, strsignal(sig)); + mgmt_log(stderr, "[main] Proxy terminated due to Sig %d: %s. Relaunching after %d sec...\n", sig, strsignal(sig), sleep_time); #endif /* NEED_PSIGNAL */ } } - mgmt_log(stderr, "[main] Proxy launch failed, retrying...\n"); + mgmt_log(stderr, "[main] Proxy launch failed, retrying after %d sec...\n", sleep_time); } }
