summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoas Schilling <nickvergessen@owncloud.com>2016-04-22 10:49:55 +0200
committerJoas Schilling <nickvergessen@owncloud.com>2016-04-22 10:49:55 +0200
commit04cee6a7db2bc6cf48f6d873d92865c988539a86 (patch)
tree40c32c38463cfbe380abb7d536166c70866cdc42
parent7be1094ba5bdfedb15489b45ed4f561b2590fe6a (diff)
downloadnextcloud-server-04cee6a7db2bc6cf48f6d873d92865c988539a86.tar.gz
nextcloud-server-04cee6a7db2bc6cf48f6d873d92865c988539a86.zip
Change the sort order of background jobs to be DESC instead of ASC
In theory, if your instance ever creates more jobs then your system cron can handle, the default background jobs get never executed anymore. Because everytime when the joblist returns the next job it looks for the next ID, however there is always a new next ID, so it will never wrap back to execute the low IDs. But when we change the sort order to be DESC, we make sure that these low IDs are always executed, before the system jumps back up to execute the new IDs.
-rw-r--r--lib/private/backgroundjob/joblist.php6
-rw-r--r--tests/lib/backgroundjob/joblist.php17
2 files changed, 16 insertions, 7 deletions
diff --git a/lib/private/backgroundjob/joblist.php b/lib/private/backgroundjob/joblist.php
index b8230fca4de..2429b830446 100644
--- a/lib/private/backgroundjob/joblist.php
+++ b/lib/private/backgroundjob/joblist.php
@@ -172,8 +172,8 @@ class JobList implements IJobList {
$query = $this->connection->getQueryBuilder();
$query->select('*')
->from('jobs')
- ->where($query->expr()->gt('id', $query->createNamedParameter($lastId, IQueryBuilder::PARAM_INT)))
- ->orderBy('id', 'ASC')
+ ->where($query->expr()->lt('id', $query->createNamedParameter($lastId, IQueryBuilder::PARAM_INT)))
+ ->orderBy('id', 'DESC')
->setMaxResults(1);
$result = $query->execute();
$row = $result->fetch();
@@ -187,7 +187,7 @@ class JobList implements IJobList {
$query = $this->connection->getQueryBuilder();
$query->select('*')
->from('jobs')
- ->orderBy('id', 'ASC')
+ ->orderBy('id', 'DESC')
->setMaxResults(1);
$result = $query->execute();
$row = $result->fetch();
diff --git a/tests/lib/backgroundjob/joblist.php b/tests/lib/backgroundjob/joblist.php
index c0796d8253a..fcc3c440818 100644
--- a/tests/lib/backgroundjob/joblist.php
+++ b/tests/lib/backgroundjob/joblist.php
@@ -9,6 +9,7 @@
namespace Test\BackgroundJob;
use OCP\BackgroundJob\IJob;
+use OCP\IDBConnection;
use Test\TestCase;
/**
@@ -28,10 +29,17 @@ class JobList extends TestCase {
parent::setUp();
$connection = \OC::$server->getDatabaseConnection();
+ $this->clearJobsList($connection);
$this->config = $this->getMock('\OCP\IConfig');
$this->instance = new \OC\BackgroundJob\JobList($connection, $this->config);
}
+ protected function clearJobsList(IDBConnection $connection) {
+ $query = $connection->getQueryBuilder();
+ $query->delete('jobs');
+ $query->execute();
+ }
+
protected function getAllSorted() {
$jobs = $this->instance->getAll();
@@ -149,11 +157,11 @@ class JobList extends TestCase {
$this->config->expects($this->once())
->method('getAppValue')
->with('backgroundjob', 'lastjob', 0)
- ->will($this->returnValue($savedJob1->getId()));
+ ->will($this->returnValue($savedJob2->getId()));
$nextJob = $this->instance->getNext();
- $this->assertEquals($savedJob2, $nextJob);
+ $this->assertEquals($savedJob1, $nextJob);
$this->instance->remove($job, 1);
$this->instance->remove($job, 2);
@@ -166,16 +174,17 @@ class JobList extends TestCase {
$jobs = $this->getAllSorted();
+ $savedJob1 = $jobs[count($jobs) - 2];
$savedJob2 = $jobs[count($jobs) - 1];
$this->config->expects($this->once())
->method('getAppValue')
->with('backgroundjob', 'lastjob', 0)
- ->will($this->returnValue($savedJob2->getId()));
+ ->will($this->returnValue($savedJob1->getId()));
$nextJob = $this->instance->getNext();
- $this->assertEquals($jobs[0], $nextJob);
+ $this->assertEquals($savedJob2, $nextJob);
$this->instance->remove($job, 1);
$this->instance->remove($job, 2);