From a1a29d14c8cdeb3d5a5e541ec73ff3f42f11ee03 Mon Sep 17 00:00:00 2001
From: Morris Jobke <hey@morrisjobke.de>
Date: Tue, 26 Jun 2018 16:24:08 +0200
Subject: [PATCH] Unlock failed cron jobs and set a high "last_checked" value
 to avoid continous re-check

* fixes issue where cronjobs of a not-loaded app are marked as "still running" because there is a "reserved_at" value stored
* fixed #9992

Signed-off-by: Morris Jobke <hey@morrisjobke.de>
---
 lib/private/BackgroundJob/JobList.php | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/lib/private/BackgroundJob/JobList.php b/lib/private/BackgroundJob/JobList.php
index a926194e9df..856354f1590 100644
--- a/lib/private/BackgroundJob/JobList.php
+++ b/lib/private/BackgroundJob/JobList.php
@@ -186,6 +186,7 @@ class JobList implements IJobList {
 		$query->select('*')
 			->from('jobs')
 			->where($query->expr()->lte('reserved_at', $query->createNamedParameter($this->timeFactory->getTime() - $this->jobTimeOut, IQueryBuilder::PARAM_INT)))
+			->andWhere($query->expr()->lte('last_checked', $query->createNamedParameter($this->timeFactory->getTime(), IQueryBuilder::PARAM_INT)))
 			->orderBy('last_checked', 'ASC')
 			->setMaxResults(1);
 
@@ -214,6 +215,14 @@ class JobList implements IJobList {
 			$job = $this->buildJob($row);
 
 			if ($job === null) {
+				// set the last_checked to 12h in the future to not check failing jobs all over again
+				$reset = $this->connection->getQueryBuilder();
+				$reset->update('jobs')
+					->set('reserved_at', $reset->expr()->literal(0, IQueryBuilder::PARAM_INT))
+					->set('last_checked', $reset->createNamedParameter($this->timeFactory->getTime() + 12 * 3600, IQueryBuilder::PARAM_INT))
+					->where($reset->expr()->eq('id', $reset->createNamedParameter($row['id'], IQueryBuilder::PARAM_INT)));
+				$reset->execute();
+
 				// Background job from disabled app, try again.
 				return $this->getNext();
 			}
-- 
GitLab