Skip to content
GitLab
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • B bull
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 175
    • Issues 175
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 9
    • Merge requests 9
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Infrastructure Registry
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • OptimalBits
  • bull
  • Issues
  • #1505
Closed
Open
Issue created Oct 14, 2019 by Administrator@rootContributor

Jobs are not respecting priority if the jobs backoff is not specified or delay is 0

Created by: sharma-shweta

Description

Bull jobs are not following the priorities when the options have multiple attempts but 0 delay or no backoff.

Minimal, Working Test code to reproduce the issue.

Jobs setup.

const queue = new Queue('test-jobs', {
    defaultJobOptions: {
        priority: 100,
        removeOnComplete: true
    },
    settings: {
        lockDuration: 5 * 60 * 1000, // 5mins
        stalledInterval: 5 * 60 * 1000, // 5mins
        maxStalledCount: 2
    },
    ...REDIS_CREDENTIALS
});

queue.process('fetch-test-data', 2, async job => {
    console.log(`[JOB: ${job.id}] fetching test data for: ${job.data.id}`);
    await Promise.delay(1000);
    return Promise.reject(new Error('ERROR'));
});

class TestJobsService {
    fetchTestData(id, priority, delay = 5000) {
        return queue.add('fetch-test-data', {
            id: id,
        }, {
            priority: priority,
            attempts: 2,
            backoff: {
                type: 'fixed',
                delay: delay
            }
        })
    }
}

testJobsService = new TestJobsService();
module.exports = testJobsService;

Run the jobs using ->

Promise.all([
    testJobsService.fetchTestData('a1', 1, 0),
    testJobsService.fetchTestData('b1', 1, 0),
    testJobsService.fetchTestData('a2', 2, 0),
    testJobsService.fetchTestData('b2', 2, 0),
    testJobsService.fetchTestData('a3', 3, 0),
    testJobsService.fetchTestData('b3', 3, 0),
    testJobsService.fetchTestData('a4', 4, 0),
    testJobsService.fetchTestData('b4', 4, 0),
    testJobsService.fetchTestData('a5', 5, 0),
    testJobsService.fetchTestData('b5', 5, 0),
    testJobsService.fetchTestData('a6', 6, 0),
    testJobsService.fetchTestData('b6', 6, 0),
]).then(() => testJobsService.listen())

This outputs ->

5:14:18 PM - info: [JOB: 37] fetching test data for: a1
5:14:19 PM - info: [JOB: 38] fetching test data for: b1
5:14:22 PM - info: [JOB: 39] fetching test data for: a2
5:14:23 PM - info: [JOB: 40] fetching test data for: b2
5:14:24 PM - info: [JOB: 41] fetching test data for: a3
5:14:26 PM - info: [JOB: 42] fetching test data for: b3
5:14:27 PM - info: [JOB: 43] fetching test data for: a4
5:14:28 PM - info: [JOB: 44] fetching test data for: b4
5:14:29 PM - info: [JOB: 45] fetching test data for: a5
5:14:30 PM - info: [JOB: 46] fetching test data for: b5
5:14:31 PM - info: [JOB: 47] fetching test data for: a6
5:14:32 PM - info: [JOB: 48] fetching test data for: b6
5:14:33 PM - info: [JOB: 37] fetching test data for: a1
5:14:34 PM - info: [JOB: 38] fetching test data for: b1
5:14:35 PM - info: [JOB: 39] fetching test data for: a2
5:14:36 PM - info: [JOB: 40] fetching test data for: b2
5:14:37 PM - info: [JOB: 41] fetching test data for: a3
5:14:38 PM - info: [JOB: 42] fetching test data for: b3
5:14:39 PM - info: [JOB: 43] fetching test data for: a4
5:14:40 PM - info: [JOB: 44] fetching test data for: b4
5:14:41 PM - info: [JOB: 45] fetching test data for: a5
5:14:42 PM - info: [JOB: 46] fetching test data for: b5
5:14:43 PM - info: [JOB: 47] fetching test data for: a6
5:14:44 PM - info: [JOB: 48] fetching test data for: b6

Bull version

3.11.0

Redis version

Redis server v=4.0.7

Additional information

Running the following code works correctly ->

Promise.all([
    testJobsService.fetchTestData('a1', 1, 1000),
    testJobsService.fetchTestData('b1', 1, 1000),
    testJobsService.fetchTestData('a2', 2, 1000),
    testJobsService.fetchTestData('b2', 2, 1000),
    testJobsService.fetchTestData('a3', 3, 1000),
    testJobsService.fetchTestData('b3', 3, 1000),
    testJobsService.fetchTestData('a4', 4, 1000),
    testJobsService.fetchTestData('b4', 4, 1000),
    testJobsService.fetchTestData('a5', 5, 1000),
    testJobsService.fetchTestData('b5', 5, 1000),
    testJobsService.fetchTestData('a6', 6, 1000),
    testJobsService.fetchTestData('b6', 6, 1000),
]).then(() => testJobsService.listen())

Expected Output ->

5:11:21 PM - info: [JOB: 25] fetching test data for: a1
5:11:22 PM - info: [JOB: 26] fetching test data for: b1
5:11:24 PM - info: [JOB: 25] fetching test data for: a1
5:11:26 PM - info: [JOB: 26] fetching test data for: b1
5:11:27 PM - info: [JOB: 27] fetching test data for: a2
5:11:28 PM - info: [JOB: 28] fetching test data for: b2
5:11:29 PM - info: [JOB: 27] fetching test data for: a2
5:11:30 PM - info: [JOB: 28] fetching test data for: b2
5:11:31 PM - info: [JOB: 29] fetching test data for: a3
5:11:32 PM - info: [JOB: 30] fetching test data for: b3
5:11:33 PM - info: [JOB: 29] fetching test data for: a3
5:11:34 PM - info: [JOB: 30] fetching test data for: b3
......
Assignee
Assign to
Time tracking