Merge pull request #2984 from annando/1611-frontend

The frontend worker is now a full replacement of the crontab call
This commit is contained in:
Tobias Diekershoff 2016-12-01 08:47:31 +01:00 committed by GitHub
commit ac954278a5
2 changed files with 55 additions and 28 deletions

View file

@ -35,14 +35,21 @@ function poller_run($argv, $argc){
$a->start_process();
if ($a->max_processes_reached())
if (poller_max_connections_reached()) {
return;
}
if (poller_max_connections_reached())
if (App::maxload_reached()) {
return;
}
if (App::maxload_reached())
if(($argc <= 1) OR ($argv[1] != "no_cron")) {
poller_run_cron();
}
if ($a->max_processes_reached()) {
return;
}
// Checking the number of workers
if (poller_too_much_workers()) {
@ -50,16 +57,6 @@ function poller_run($argv, $argc){
return;
}
if(($argc <= 1) OR ($argv[1] != "no_cron")) {
poller_run_cron();
} else
// Sleep four seconds before checking for running processes again to avoid having too many workers
sleep(4);
// Checking number of workers
if (poller_too_much_workers())
return;
$starttime = time();
while ($r = poller_worker_process()) {
@ -193,9 +190,7 @@ function poller_max_connections_reached() {
$max = get_config("system", "max_connections");
// Fetch the percentage level where the poller will get active
$maxlevel = get_config("system", "max_connections_level");
if ($maxlevel == 0)
$maxlevel = 75;
$maxlevel = Config::get("system", "max_connections_level", 75);
if ($max == 0) {
// the maximum number of possible user connections can be a system variable
@ -317,12 +312,7 @@ function poller_kill_stale_workers() {
* @return bool Are there too much workers running?
*/
function poller_too_much_workers() {
$queues = get_config("system", "worker_queues");
if ($queues == 0)
$queues = 4;
$queues = Config::get("system", "worker_queues", 4);
$maxqueues = $queues;
@ -331,9 +321,7 @@ function poller_too_much_workers() {
// Decrease the number of workers at higher load
$load = current_load();
if($load) {
$maxsysload = intval(get_config('system','maxloadavg'));
if($maxsysload < 1)
$maxsysload = 50;
$maxsysload = intval(Config::get("system", "maxloadavg", 50));
$maxworkers = $queues;
@ -492,7 +480,7 @@ function poller_worker_process() {
* @brief Call the front end worker
*/
function call_worker() {
if (!get_config("system", "frontend_worker")) {
if (!Config::get("system", "frontend_worker") OR !Config::get("system", "worker")) {
return;
}
@ -504,10 +492,42 @@ function call_worker() {
* @brief Call the front end worker if there aren't any active
*/
function call_worker_if_idle() {
if (!get_config("system", "frontend_worker")) {
if (!Config::get("system", "frontend_worker") OR !Config::get("system", "worker")) {
return;
}
// Do we have "proc_open"? Then we can fork the poller
if (function_exists("proc_open")) {
// When was the last time that we called the worker?
// Less than one minute? Then we quit
if ((time() - get_config("system", "worker_started")) < 60) {
return;
}
set_config("system", "worker_started", time());
// Do we have enough running workers? Then we quit here.
if (poller_too_much_workers()) {
// Cleaning dead processes
poller_kill_stale_workers();
get_app()->remove_inactive_processes();
return;
}
poller_run_cron();
logger('Call poller', LOGGER_DEBUG);
$args = array("php", "include/poller.php", "no_cron");
$a = get_app();
$a->proc_run($args);
return;
}
// We cannot execute background processes.
// We now run the processes from the frontend.
// This won't work with long running processes.
poller_run_cron();
clear_worker_processes();
@ -534,6 +554,8 @@ function clear_worker_processes() {
* @brief Runs the cron processes
*/
function poller_run_cron() {
logger('Add cron entries', LOGGER_DEBUG);
// Run the cron job that calls all other jobs
proc_run(PRIORITY_MEDIUM, "include/cron.php");

View file

@ -10,7 +10,12 @@ use \Friendica\Core\PConfig;
function worker_init($a){
if (!Config::get("system", "frontend_worker")) {
if (!Config::get("system", "frontend_worker") OR !Config::get("system", "worker")) {
return;
}
// We don't need the following lines if we can execute background jobs
if (function_exists("proc_open")) {
return;
}