Skip to content

Commit e4d54e9

Browse files
committed
Fix condition to pick next candidate
1 parent aa69bcf commit e4d54e9

File tree

2 files changed

+35
-3
lines changed

2 files changed

+35
-3
lines changed

batch/scheduler/scheduler.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,13 +142,17 @@ Scheduler.prototype.acquire = function(callback) {
142142
self.once('add', addListener);
143143
}
144144

145-
var isRunningAny = self.tasks.some(is(STATUS.RUNNING));
146-
if (isRunningAny || running.length >= capacity) {
145+
if (running.length >= capacity) {
147146
debug('Waiting for slot');
148147
return self.once('release', releaseListener);
149148
}
150149

150+
var isRunningAny = self.tasks.some(is(STATUS.RUNNING));
151151
var candidate = self.tasksTree.min();
152+
if (isRunningAny && candidate === null) {
153+
debug('Waiting for last task to finish');
154+
return self.once('release', releaseListener);
155+
}
152156

153157
return callback(null, candidate);
154158
});

test/integration/batch/scheduler.js

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,41 @@ describe('scheduler', function() {
1515
TaskRunner.prototype.run = function(user, callback) {
1616
this.results.push(user);
1717
this.userTasks[user]--;
18-
return callback(null, this.userTasks[user] === 0);
18+
setTimeout(function() {
19+
return callback(null, this.userTasks[user] === 0);
20+
}.bind(this), 50);
1921
};
2022

2123
// simulate one by one or infinity capacity
2224
var capacities = [new FixedCapacity(1), new FixedCapacity(Infinity)];
2325

2426
capacities.forEach(function(capacity) {
27+
28+
it('regression', function (done) {
29+
var taskRunner = new TaskRunner({
30+
userA: 2,
31+
userB: 2
32+
});
33+
var scheduler = new Scheduler(capacity, taskRunner);
34+
scheduler.add('userA');
35+
scheduler.add('userB');
36+
37+
scheduler.on('done', function() {
38+
var results = taskRunner.results;
39+
40+
assert.equal(results.length, 4);
41+
42+
assert.equal(results[0], 'userA');
43+
assert.equal(results[1], 'userB');
44+
assert.equal(results[2], 'userA');
45+
assert.equal(results[3], 'userB');
46+
47+
return done();
48+
});
49+
50+
scheduler.schedule();
51+
});
52+
2553
it('should run tasks', function (done) {
2654
var taskRunner = new TaskRunner({
2755
userA: 1

0 commit comments

Comments
 (0)