diff options
author | Joas Schilling <coding@schilljs.com> | 2022-01-31 17:59:09 +0100 |
---|---|---|
committer | Joas Schilling <coding@schilljs.com> | 2022-02-22 11:56:17 +0100 |
commit | ba0134c54f2042344bc7f074130d5909dd8aae8f (patch) | |
tree | bcb4895977fbb4b2ba3dd95c86055383793cbfd7 | |
parent | c43730238fb648b2943762da172f55cbfd28114d (diff) | |
download | nextcloud-server-ba0134c54f2042344bc7f074130d5909dd8aae8f.tar.gz nextcloud-server-ba0134c54f2042344bc7f074130d5909dd8aae8f.zip |
Allow sysadmins to define a maintenance window where heavier jobs can run
Signed-off-by: Joas Schilling <coding@schilljs.com>
-rw-r--r-- | config/config.sample.php | 14 | ||||
-rw-r--r-- | cron.php | 24 |
2 files changed, 37 insertions, 1 deletions
diff --git a/config/config.sample.php b/config/config.sample.php index 783d9daea39..521aa28598a 100644 --- a/config/config.sample.php +++ b/config/config.sample.php @@ -1209,6 +1209,20 @@ $CONFIG = [ */ '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 @@ -109,6 +109,28 @@ try { $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(); @@ -118,7 +140,7 @@ try { $endTime = time() + 14 * 60; $executedJobs = []; - while ($job = $jobList->getNext()) { + while ($job = $jobList->getNext($onlyTimeSensitive)) { if (isset($executedJobs[$job->getId()])) { $jobList->unlockJob($job); break; |