From: Andrew Dolgov Date: Wed, 25 Aug 2010 14:16:07 +0000 (+0400) Subject: daemon2: properly abort stuck children X-Git-Tag: 1.4.3-proper~10 X-Git-Url: https://git.wh0rd.org/?a=commitdiff_plain;h=c90a028cdc9548a4ef1f6359b53b2c9d96c3a7a8;p=tt-rss.git daemon2: properly abort stuck children --- diff --git a/functions.php b/functions.php index 627055f8..7fc5aa7e 100644 --- a/functions.php +++ b/functions.php @@ -5895,13 +5895,6 @@ if($debug) _debug("Feed: " . $line["feed_url"] . ", " . $line["last_updated"]); - // We setup a alarm to alert if the feed take more than 300s to update. - // => HANG alarm. - if(!$from_http && function_exists('pcntl_alarm')) pcntl_alarm(300); - update_rss_feed($link, $line["id"], true); - // Cancel the alarm (the update went well) - if(!$from_http && function_exists('pcntl_alarm')) pcntl_alarm(0); - sleep(1); // prevent flood (FIXME make this an option?) } diff --git a/update_daemon2.php b/update_daemon2.php index 431f0b6a..9747d523 100755 --- a/update_daemon2.php +++ b/update_daemon2.php @@ -17,11 +17,13 @@ } define('PURGE_INTERVAL', 3600); // seconds + define('MAX_CHILD_RUNTIME', 600); // seconds require_once "sanity_check.php"; require_once "config.php"; define('MAX_JOBS', 2); + define('SPAWN_INTERVAL', 1); define('SPAWN_INTERVAL', DAEMON_SLEEP_INTERVAL); @@ -41,6 +43,7 @@ error_reporting(DEFAULT_ERROR_LEVEL); $children = array(); + $ctimes = array(); $last_checkpoint = -1; @@ -54,6 +57,7 @@ array_push($tmp, $pid); } else { _debug("[SIGCHLD] child $pid reaped."); + unset($ctimes[$pid]); } } @@ -62,8 +66,17 @@ return count($tmp); } - function sigalrm_handler() { - die("[SIGALRM] hang in feed update?\n"); + function check_ctimes() { + global $ctimes; + + foreach (array_keys($ctimes) as $pid) { + $started = $ctimes[$pid]; + + if (time() - $started > MAX_CHILD_RUNTIME) { + _debug("[MASTER] child process $pid seems to be stuck, aborting..."); + posix_kill($pid, SIGINT); + } + } } function sigchld_handler($signal) { @@ -79,7 +92,6 @@ die("[SIGINT] removing lockfile and exiting.\n"); } - pcntl_signal(SIGALRM, 'sigalrm_handler'); pcntl_signal(SIGCHLD, 'sigchld_handler'); if (file_is_locked("update_daemon.lock")) { @@ -128,6 +140,7 @@ if ($last_checkpoint + SPAWN_INTERVAL < time()) { + check_ctimes(); reap_children(); for ($j = count($children); $j < MAX_JOBS; $j++) { @@ -137,6 +150,7 @@ } else if ($pid) { _debug("[MASTER] spawned client $j [PID:$pid]..."); array_push($children, $pid); + $ctimes[$pid] = time(); } else { pcntl_signal(SIGCHLD, SIG_IGN); pcntl_signal(SIGINT, SIG_DFL);