Skip to content

Commit

Permalink
Allow sysadmins to define a maintenance window where heavier jobs can…
Browse files Browse the repository at this point in the history
… run

Signed-off-by: Joas Schilling <coding@schilljs.com>
  • Loading branch information
nickvergessen committed Feb 22, 2022
1 parent c437302 commit ba0134c
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 1 deletion.
14 changes: 14 additions & 0 deletions config/config.sample.php
Original file line number Diff line number Diff line change
Expand Up @@ -1209,6 +1209,20 @@
*/
'maintenance' => false,

/**
* UTC Hour for maintenance windows
*
* Some background jobs only run once a day. When an hour is defined for this config,
* the background jobs which advertise themselves as not time sensitive will be
* delayed during the "working" hours and only run in the 4 hours after the given time.
* This is e.g. used for activity expiration, suspicious login training and update checks.
*
* A value of 1 e.g. will only run these background jobs between 01:00am UTC and 05:00am UTC.
*
* Defaults to ``100`` which disables the feature
*/
'maintenance_window_start' => 1,


/**
* SSL
Expand Down
24 changes: 23 additions & 1 deletion cron.php
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,28 @@
$config->setAppValue('core', 'backgroundjobs_mode', 'cron');
}

// Low-load hours
$onlyTimeSensitive = false;
$startHour = $config->getSystemValueInt('maintenance_window_start', 100);
if ($startHour <= 23) {
$date = new \DateTime('now', new \DateTimeZone('UTC'));
$currentHour = (int) $date->format('G');
$endHour = $startHour + 4;

if ($startHour <= 20) {
// Start time: 01:00
// End time: 05:00
// Only run sensitive tasks when it's before the start or after the end
$onlyTimeSensitive = $currentHour < $startHour || $currentHour > $endHour;
} else {
// Start time: 23:00
// End time: 03:00
$endHour -= 24; // Correct the end time from 27:00 to 03:00
// Only run sensitive tasks when it's after the end and before the start
$onlyTimeSensitive = $currentHour > $endHour && $currentHour < $startHour;
}
}

// Work
$jobList = \OC::$server->getJobList();

Expand All @@ -118,7 +140,7 @@
$endTime = time() + 14 * 60;

$executedJobs = [];
while ($job = $jobList->getNext()) {
while ($job = $jobList->getNext($onlyTimeSensitive)) {
if (isset($executedJobs[$job->getId()])) {
$jobList->unlockJob($job);
break;
Expand Down

0 comments on commit ba0134c

Please sign in to comment.