diff options
author | Jörn Friedrich Dreyer <jfd@butonic.de> | 2017-04-07 13:53:44 +0300 |
---|---|---|
committer | Morris Jobke <hey@morrisjobke.de> | 2017-04-07 21:03:16 +0300 |
commit | 1bc28261d5d8f9124ef36ebad9a48abab98ccc63 (patch) | |
tree | 1c77c80cdee5099f92cd0937b68692fb4f78867b /lib/private | |
parent | 35b1f23d1129ad05f6b6e27f390264c1f7112ecd (diff) |
make JobList::next() lock free
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Diffstat (limited to 'lib/private')
-rw-r--r-- | lib/private/BackgroundJob/JobList.php | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/lib/private/BackgroundJob/JobList.php b/lib/private/BackgroundJob/JobList.php index b6a235e9e40..0de5dfecc8b 100644 --- a/lib/private/BackgroundJob/JobList.php +++ b/lib/private/BackgroundJob/JobList.php @@ -187,18 +187,24 @@ class JobList implements IJobList { $update->update('jobs') ->set('reserved_at', $update->createNamedParameter($this->timeFactory->getTime())) ->set('last_checked', $update->createNamedParameter($this->timeFactory->getTime())) - ->where($update->expr()->eq('id', $update->createParameter('jobid'))); + ->where($update->expr()->eq('id', $update->createParameter('jobid'))) + ->andWhere($update->expr()->eq('reserved_at', $update->createParameter('reserved_at'))) + ->andWhere($update->expr()->eq('last_checked', $update->createParameter('last_checked'))); - $this->connection->lockTable('jobs'); $result = $query->execute(); $row = $result->fetch(); $result->closeCursor(); if ($row) { $update->setParameter('jobid', $row['id']); - $update->execute(); - $this->connection->unlockTable(); + $update->setParameter('reserved_at', $row['reserved_at']); + $update->setParameter('last_checked', $row['last_checked']); + $count = $update->execute(); + if ($count === 0) { + // Background job already executed elsewhere, try again. + return $this->getNext(); + } $job = $this->buildJob($row); if ($job === null) { @@ -208,7 +214,6 @@ class JobList implements IJobList { return $job; } else { - $this->connection->unlockTable(); return null; } } |