Merge pull request #54068 from nextcloud/bugfix/noid/fix-infinite-loop-on-parallelaware-block

fix(cron): Fix infinite loop on ParallelAware blocked jobs
pull/54009/head
Joas Schilling 2025-07-28 08:22:52 +07:00 committed by GitHub
commit d0865ed924
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 13 additions and 0 deletions

@ -24,6 +24,9 @@ use function min;
use function strlen;
class JobList implements IJobList {
/** @var array<string, int> */
protected array $alreadyVisitedParallelBlocked = [];
public function __construct(
protected IDBConnection $connection,
protected IConfig $config,
@ -198,6 +201,12 @@ class JobList implements IJobList {
$job = $this->buildJob($row);
if ($job instanceof IParallelAwareJob && !$job->getAllowParallelRuns() && $this->hasReservedJob(get_class($job))) {
if (!isset($this->alreadyVisitedParallelBlocked[get_class($job)])) {
$this->alreadyVisitedParallelBlocked[get_class($job)] = $job->getId();
} elseif ($this->alreadyVisitedParallelBlocked[get_class($job)] === $job->getId()) {
$this->logger->info('Skipped through all jobs and revisited a IParallelAwareJob blocked job again, giving up.', ['app' => 'cron']);
return null;
}
$this->logger->info('Skipping ' . get_class($job) . ' job with ID ' . $job->getId() . ' because another job with the same class is already running', ['app' => 'cron']);
$update = $this->connection->getQueryBuilder();
@ -210,6 +219,10 @@ class JobList implements IJobList {
return $this->getNext($onlyTimeSensitive, $jobClasses);
}
if ($job !== null && isset($this->alreadyVisitedParallelBlocked[get_class($job)])) {
unset($this->alreadyVisitedParallelBlocked[get_class($job)]);
}
if ($job instanceof \OCP\BackgroundJob\TimedJob) {
$now = $this->timeFactory->getTime();
$nextPossibleRun = $job->getLastRun() + $job->getInterval();