Merge pull request #2701 from annando/1608-cronjobs-fastlane
Split cron jobs in cronjobs, introduce fastlane for high priority tasks
This commit is contained in:
commit
626340146b
3 changed files with 144 additions and 32 deletions
|
@ -80,43 +80,38 @@ function cron_run(&$argv, &$argc){
|
||||||
|
|
||||||
proc_run(PRIORITY_LOW,"include/discover_poco.php", "checkcontact");
|
proc_run(PRIORITY_LOW,"include/discover_poco.php", "checkcontact");
|
||||||
|
|
||||||
// expire any expired accounts
|
// Expire and remove user entries
|
||||||
|
cron_expire_and_remove_users();
|
||||||
|
|
||||||
q("UPDATE user SET `account_expired` = 1 where `account_expired` = 0
|
// If the worker is active, split the jobs in several sub processes
|
||||||
AND `account_expires_on` != '0000-00-00 00:00:00'
|
if (get_config("system", "worker")) {
|
||||||
AND `account_expires_on` < UTC_TIMESTAMP() ");
|
// Check OStatus conversations
|
||||||
|
proc_run(PRIORITY_MEDIUM, "include/cronjobs.php", "ostatus_mentions");
|
||||||
|
|
||||||
// delete user and contact records for recently removed accounts
|
// Check every conversation
|
||||||
|
proc_run(PRIORITY_MEDIUM, "include/cronjobs.php", "ostatus_conversations");
|
||||||
|
|
||||||
$r = q("SELECT * FROM `user` WHERE `account_removed` = 1 AND `account_expires_on` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
|
// Call possible post update functions
|
||||||
if ($r) {
|
proc_run(PRIORITY_LOW, "include/cronjobs.php", "post_update");
|
||||||
foreach($r as $user) {
|
|
||||||
q("DELETE FROM `contact` WHERE `uid` = %d", intval($user['uid']));
|
// update nodeinfo data
|
||||||
q("DELETE FROM `user` WHERE `uid` = %d", intval($user['uid']));
|
proc_run(PRIORITY_LOW, "include/cronjobs.php", "nodeinfo");
|
||||||
}
|
} else {
|
||||||
|
// Check OStatus conversations
|
||||||
|
// Check only conversations with mentions (for a longer time)
|
||||||
|
ostatus::check_conversations(true);
|
||||||
|
|
||||||
|
// Check every conversation
|
||||||
|
ostatus::check_conversations(false);
|
||||||
|
|
||||||
|
// Call possible post update functions
|
||||||
|
// see include/post_update.php for more details
|
||||||
|
post_update();
|
||||||
|
|
||||||
|
// update nodeinfo data
|
||||||
|
nodeinfo_cron();
|
||||||
}
|
}
|
||||||
|
|
||||||
$abandon_days = intval(get_config('system','account_abandon_days'));
|
|
||||||
if($abandon_days < 1)
|
|
||||||
$abandon_days = 0;
|
|
||||||
|
|
||||||
// Check OStatus conversations
|
|
||||||
// Check only conversations with mentions (for a longer time)
|
|
||||||
ostatus::check_conversations(true);
|
|
||||||
|
|
||||||
// Check every conversation
|
|
||||||
ostatus::check_conversations(false);
|
|
||||||
|
|
||||||
// Call possible post update functions
|
|
||||||
// see include/post_update.php for more details
|
|
||||||
post_update();
|
|
||||||
|
|
||||||
// update nodeinfo data
|
|
||||||
nodeinfo_cron();
|
|
||||||
|
|
||||||
/// @TODO Regenerate usage statistics
|
|
||||||
// q("ANALYZE TABLE `item`");
|
|
||||||
|
|
||||||
// once daily run birthday_updates and then expire in background
|
// once daily run birthday_updates and then expire in background
|
||||||
|
|
||||||
$d1 = get_config('system','last_expire_day');
|
$d1 = get_config('system','last_expire_day');
|
||||||
|
@ -152,6 +147,25 @@ function cron_run(&$argv, &$argc){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Expire and remove user entries
|
||||||
|
*/
|
||||||
|
function cron_expire_and_remove_users() {
|
||||||
|
// expire any expired accounts
|
||||||
|
q("UPDATE user SET `account_expired` = 1 where `account_expired` = 0
|
||||||
|
AND `account_expires_on` != '0000-00-00 00:00:00'
|
||||||
|
AND `account_expires_on` < UTC_TIMESTAMP() ");
|
||||||
|
|
||||||
|
// delete user and contact records for recently removed accounts
|
||||||
|
$r = q("SELECT * FROM `user` WHERE `account_removed` AND `account_expires_on` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
|
||||||
|
if ($r) {
|
||||||
|
foreach($r as $user) {
|
||||||
|
q("DELETE FROM `contact` WHERE `uid` = %d", intval($user['uid']));
|
||||||
|
q("DELETE FROM `user` WHERE `uid` = %d", intval($user['uid']));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Poll contacts for unreceived messages
|
* @brief Poll contacts for unreceived messages
|
||||||
*
|
*
|
||||||
|
@ -197,6 +211,10 @@ function cron_poll_contacts($argc, $argv) {
|
||||||
// and which have a polling address and ignore Diaspora since
|
// and which have a polling address and ignore Diaspora since
|
||||||
// we are unable to match those posts with a Diaspora GUID and prevent duplicates.
|
// we are unable to match those posts with a Diaspora GUID and prevent duplicates.
|
||||||
|
|
||||||
|
$abandon_days = intval(get_config('system','account_abandon_days'));
|
||||||
|
if($abandon_days < 1)
|
||||||
|
$abandon_days = 0;
|
||||||
|
|
||||||
$abandon_sql = (($abandon_days)
|
$abandon_sql = (($abandon_days)
|
||||||
? sprintf(" AND `user`.`login_date` > UTC_TIMESTAMP() - INTERVAL %d DAY ", intval($abandon_days))
|
? sprintf(" AND `user`.`login_date` > UTC_TIMESTAMP() - INTERVAL %d DAY ", intval($abandon_days))
|
||||||
: ''
|
: ''
|
||||||
|
|
78
include/cronjobs.php
Normal file
78
include/cronjobs.php
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
<?php
|
||||||
|
if (!file_exists("boot.php") AND (sizeof($_SERVER["argv"]) != 0)) {
|
||||||
|
$directory = dirname($_SERVER["argv"][0]);
|
||||||
|
|
||||||
|
if (substr($directory, 0, 1) != "/")
|
||||||
|
$directory = $_SERVER["PWD"]."/".$directory;
|
||||||
|
|
||||||
|
$directory = realpath($directory."/..");
|
||||||
|
|
||||||
|
chdir($directory);
|
||||||
|
}
|
||||||
|
|
||||||
|
require_once("boot.php");
|
||||||
|
|
||||||
|
|
||||||
|
function cronjobs_run(&$argv, &$argc){
|
||||||
|
global $a, $db;
|
||||||
|
|
||||||
|
if(is_null($a)) {
|
||||||
|
$a = new App;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(is_null($db)) {
|
||||||
|
@include(".htconfig.php");
|
||||||
|
require_once("include/dba.php");
|
||||||
|
$db = new dba($db_host, $db_user, $db_pass, $db_data);
|
||||||
|
unset($db_host, $db_user, $db_pass, $db_data);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
require_once('include/session.php');
|
||||||
|
require_once('include/datetime.php');
|
||||||
|
require_once('include/ostatus.php');
|
||||||
|
require_once('include/post_update.php');
|
||||||
|
require_once('mod/nodeinfo.php');
|
||||||
|
|
||||||
|
load_config('config');
|
||||||
|
load_config('system');
|
||||||
|
|
||||||
|
$a->set_baseurl(get_config('system','url'));
|
||||||
|
|
||||||
|
// No parameter set? So return
|
||||||
|
if ($argc <= 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Check OStatus conversations
|
||||||
|
// Check only conversations with mentions (for a longer time)
|
||||||
|
if ($argv[1] == 'ostatus_mentions') {
|
||||||
|
ostatus::check_conversations(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check every conversation
|
||||||
|
if ($argv[1] == 'ostatus_conversations') {
|
||||||
|
ostatus::check_conversations(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call possible post update functions
|
||||||
|
// see include/post_update.php for more details
|
||||||
|
if ($argv[1] == 'post_update') {
|
||||||
|
post_update();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// update nodeinfo data
|
||||||
|
if ($argv[1] == 'nodeinfo') {
|
||||||
|
nodeinfo_cron();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_search(__file__,get_included_files())===0){
|
||||||
|
cronjobs_run($_SERVER["argv"],$_SERVER["argc"]);
|
||||||
|
killme();
|
||||||
|
}
|
|
@ -270,6 +270,22 @@ function poller_too_much_workers() {
|
||||||
$slope = $maxworkers / pow($maxsysload, $exponent);
|
$slope = $maxworkers / pow($maxsysload, $exponent);
|
||||||
$queues = ceil($slope * pow(max(0, $maxsysload - $load), $exponent));
|
$queues = ceil($slope * pow(max(0, $maxsysload - $load), $exponent));
|
||||||
|
|
||||||
|
if (Config::get("system", "worker_fastlane", false) AND ($queues > 0) AND ($active >= $queues)) {
|
||||||
|
$s = q("SELECT COUNT(*) AS `total` FROM `workerqueue` WHERE `priority` = %d AND `executed` = '0000-00-00 00:00:00'",
|
||||||
|
intval(PRIORITY_HIGH));
|
||||||
|
$high_waiting = $s[0]["total"];
|
||||||
|
|
||||||
|
$s = q("SELECT COUNT(*) AS `total` FROM `workerqueue` WHERE `priority` = %d AND `executed` != '0000-00-00 00:00:00'",
|
||||||
|
intval(PRIORITY_HIGH));
|
||||||
|
$high_running = $s[0]["total"];
|
||||||
|
|
||||||
|
/// @todo define maximum number of fastlanes
|
||||||
|
if (($high_waiting > 0) AND ($high_running == 0)) {
|
||||||
|
logger("There are ".$high_waiting." high priority jobs waiting but none is executed. Open a fastlane.", LOGGER_DEBUG);
|
||||||
|
$queues = $active + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$s = q("SELECT COUNT(*) AS `total` FROM `workerqueue` WHERE `executed` = '0000-00-00 00:00:00'");
|
$s = q("SELECT COUNT(*) AS `total` FROM `workerqueue` WHERE `executed` = '0000-00-00 00:00:00'");
|
||||||
$entries = $s[0]["total"];
|
$entries = $s[0]["total"];
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue