mirror of
https://github.com/nextcloud/server.git
synced 2026-06-11 01:30:50 -04:00
fix(cron): Fix infinite loop on ParallelAware blocked jobs
Signed-off-by: Joas Schilling <coding@schilljs.com>
This commit is contained in:
parent
d7f7b6c89d
commit
57651bba13
1 changed files with 13 additions and 0 deletions
|
|
@ -23,6 +23,9 @@ use function json_encode;
|
|||
use function strlen;
|
||||
|
||||
class JobList implements IJobList {
|
||||
/** @var array<string, int> */
|
||||
protected array $alreadyVisitedParallelBlocked = [];
|
||||
|
||||
public function __construct(
|
||||
protected IDBConnection $connection,
|
||||
protected IConfig $config,
|
||||
|
|
@ -197,6 +200,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();
|
||||
|
|
@ -209,6 +218,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)]);
|
||||
}
|
||||
|
||||
$update = $this->connection->getQueryBuilder();
|
||||
$update->update('jobs')
|
||||
->set('reserved_at', $update->createNamedParameter($this->timeFactory->getTime()))
|
||||
|
|
|
|||
Loading…
Reference in a new issue