diff --git a/include/poller.php b/include/poller.php index 60937fb7e..0d0760588 100644 --- a/include/poller.php +++ b/include/poller.php @@ -45,33 +45,32 @@ function poller_run($argv, $argc){ $a->start_process(); if ($a->min_memory_reached()) { + logger('Pre check: Memory limit reached, quitting.', LOGGER_DEBUG); return; } if (poller_max_connections_reached()) { + logger('Pre check: maximum connections reached, quitting.', LOGGER_DEBUG); return; } if ($a->maxload_reached()) { + logger('Pre check: maximum load reached, quitting.', LOGGER_DEBUG); return; } if ($a->max_processes_reached()) { - return; - } - - if (!Lock::set('poller_worker')) { + logger('Pre check: maximum processes reached, quitting.', LOGGER_DEBUG); return; } // Checking the number of workers if (poller_too_much_workers()) { poller_kill_stale_workers(); + logger('Pre check: Active worker limit reached, quitting.', LOGGER_DEBUG); return; } - Lock::remove('poller_worker'); - $starttime = time(); while ($r = poller_worker_process()) { @@ -87,7 +86,9 @@ function poller_run($argv, $argc){ } if (!Lock::set('poller_worker')) { - return; + logger('Cannot get a lock, retrying.', LOGGER_DEBUG); + poller_unclaim_process(); + continue; } // Count active workers and compare them with a maximum value that depends on the load @@ -104,7 +105,7 @@ function poller_run($argv, $argc){ } // Quit the poller once every hour - if (time() > ($starttime + 3600)) { + if (time() > ($starttime + 360)) { logger('Process lifetime reachted, quitting.', LOGGER_DEBUG); return; } @@ -733,7 +734,7 @@ function poller_run_cron() { if (array_search(__file__,get_included_files())===0){ poller_run($_SERVER["argv"],$_SERVER["argc"]); - Lock::removeAll(); + Lock::remove('poller_worker'); poller_unclaim_process(); diff --git a/src/Util/Lock.php b/src/Util/Lock.php index 175ad34e3..e8011bf59 100644 --- a/src/Util/Lock.php +++ b/src/Util/Lock.php @@ -48,20 +48,16 @@ class Lock { * * @param string $fn_name Name of the lock * @param integer $timeout Seconds until we give up - * @param integer $wait_sec Time between to lock attempts * * @return boolean Was the lock successful? */ - public static function set($fn_name, $timeout = 30, $wait_sec = 2) { - if ($wait_sec == 0) { - $wait_sec = 2; - } - + public static function set($fn_name, $timeout = 120) { $got_lock = false; $start = time(); $memcache = self::memcache(); if (is_object($memcache)) { + $wait_sec = 1; $cachekey = get_app()->get_hostname().";lock:".$fn_name; do { @@ -87,6 +83,9 @@ class Lock { return $got_lock; } + + $wait_sec = 2; + do { dba::lock('locks'); $lock = dba::select('locks', array('locked', 'pid'), array('name' => $fn_name), array('limit' => 1));