From d460cf1291842e2cb2242eb11ae63353eae3faca Mon Sep 17 00:00:00 2001 From: Katharina Irrgang Date: Tue, 5 Sep 2017 20:23:11 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20=20Fixed=20post=20scheduling=20(?= =?UTF-8?q?#8976)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit closes #8975 - recursive logic was broken - caused via https://github.com/TryGhost/Ghost/commit/bf47397ac2f54192d36e76bac9a329cf76fa5805 --- .../adapters/scheduling/SchedulingDefault.js | 40 ++++++++++--------- .../scheduling/SchedulingDefault_spec.js | 14 +++++++ 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/core/server/adapters/scheduling/SchedulingDefault.js b/core/server/adapters/scheduling/SchedulingDefault.js index 0df83c4b9e..7a527edd46 100644 --- a/core/server/adapters/scheduling/SchedulingDefault.js +++ b/core/server/adapters/scheduling/SchedulingDefault.js @@ -54,7 +54,8 @@ SchedulingDefault.prototype.unschedule = function (object) { */ SchedulingDefault.prototype.run = function () { var self = this, - timeout = null; + timeout = null, + recursiveRun; if (this.isRunning) { return; @@ -62,27 +63,30 @@ SchedulingDefault.prototype.run = function () { this.isRunning = true; - timeout = setTimeout(function () { - var times = Object.keys(self.allJobs), - nextJobs = {}; + recursiveRun = function recursiveRun() { + timeout = setTimeout(function () { + var times = Object.keys(self.allJobs), + nextJobs = {}; - times.every(function (time) { - if (moment(Number(time)).diff(moment(), 'minutes') <= self.offsetInMinutes) { - nextJobs[time] = self.allJobs[time]; - delete self.allJobs[time]; - return true; - } + times.every(function (time) { + if (moment(Number(time)).diff(moment(), 'minutes') <= self.offsetInMinutes) { + nextJobs[time] = self.allJobs[time]; + delete self.allJobs[time]; + return true; + } - // break! - return false; - }); + // break! + return false; + }); - clearTimeout(timeout); - self._execute(nextJobs); + clearTimeout(timeout); + self._execute(nextJobs); - // recursive! - self.run(); - }, self.runTimeoutInMs); + recursiveRun(); + }, self.runTimeoutInMs); + }; + + recursiveRun(); }; /** diff --git a/core/test/unit/adapters/scheduling/SchedulingDefault_spec.js b/core/test/unit/adapters/scheduling/SchedulingDefault_spec.js index df6576b3b6..e8fb8d30d2 100644 --- a/core/test/unit/adapters/scheduling/SchedulingDefault_spec.js +++ b/core/test/unit/adapters/scheduling/SchedulingDefault_spec.js @@ -84,6 +84,20 @@ describe('Scheduling Default Adapter', function () { scope.adapter.run(); }); + it('ensure recursive run works', function (done) { + sandbox.spy(scope.adapter, '_execute'); + + scope.adapter.allJobs = {}; + scope.adapter.runTimeoutInMs = 500; + scope.adapter.offsetInMinutes = 2; + scope.adapter.run(); + + setTimeout(function () { + scope.adapter._execute.callCount.should.be.greaterThan(1); + done(); + }, 2000); + }); + it('execute', function (done) { var pinged = 0, jobs = 3,