Automattic / kue

Kue is a priority job queue backed by redis, built for node.js.
http://automattic.github.io/kue
MIT License
9.46k stars 867 forks source link

Process won't exit after queue shutdown if client is saving a job #1078

Open olalonde opened 7 years ago

olalonde commented 7 years ago

kue@0.11.6

Test case:

const test = require('blue-tape')
const kue = require('kue')

let queue

test('create queue', (t) => {
  queue = kue.createQueue({
    prefix: 'test-shutdown',
    redis: {
      host: 'localhost',
      port: 6379
    },
  })
  t.end()
})

test('enqueue', (t) => {
  // don't block
  queue
    .create('job-type', { foo: 'bar' })
    .save((err) => {
      t.ok(!!err)
      console.error(err)
    })
  t.end()
})

test('shutdown queue', (t) => {
  queue.shutdown(0, (err) => {
    t.error(err)
    t.end()
  })
})

test('the process will not exit :(', (t) => {
  t.end()
})

Output (process does not exit):

$ tape test.js
TAP version 13
# create queue
# enqueue
# shutdown queue
ok 1 undefined
# the process will not exit :(
ok 2 should be truthy
{ AbortError
    at handle_offline_command (/Users/olalonde/code/kue-shutdown-test/node_modules/redis/index.js:846:15)
    at RedisClient.internal_send_command (/Users/olalonde/code/kue-shutdown-test/node_modules/redis/index.js:880:9)
    at Multi.exec_transaction (/Users/olalonde/code/kue-shutdown-test/node_modules/redis/lib/multi.js:115:18)
    at Job.state (/Users/olalonde/code/kue-shutdown-test/node_modules/kue/lib/queue/job.js:702:9)
    at Job.<anonymous> (/Users/olalonde/code/kue-shutdown-test/node_modules/kue/lib/queue/job.js:869:10)
    at callbackOrEmit (/Users/olalonde/code/kue-shutdown-test/node_modules/redis/lib/utils.js:89:9)
    at /Users/olalonde/code/kue-shutdown-test/node_modules/redis/lib/utils.js:107:13
    at _combinedTickCallback (internal/process/next_tick.js:95:7)
    at process._tickCallback (internal/process/next_tick.js:161:9)
  command: 'EXEC',
  code: 'NR_CLOSED',
  errors:
   [ { AbortError
         at handle_offline_command (/Users/olalonde/code/kue-shutdown-test/node_modules/redis/index.js:846:15)
         at RedisClient.internal_send_command (/Users/olalonde/code/kue-shutdown-test/node_modules/redis/index.js:880:9)
         at pipeline_transaction_command (/Users/olalonde/code/kue-shutdown-test/node_modules/redis/lib/multi.js:41:18)
         at Multi.exec_transaction (/Users/olalonde/code/kue-shutdown-test/node_modules/redis/lib/multi.js:112:9)
         at Job.state (/Users/olalonde/code/kue-shutdown-test/node_modules/kue/lib/queue/job.js:702:9)
         at Job.<anonymous> (/Users/olalonde/code/kue-shutdown-test/node_modules/kue/lib/queue/job.js:869:10)
         at callbackOrEmit (/Users/olalonde/code/kue-shutdown-test/node_modules/redis/lib/utils.js:89:9)
         at /Users/olalonde/code/kue-shutdown-test/node_modules/redis/lib/utils.js:107:13
         at _combinedTickCallback (internal/process/next_tick.js:95:7)
         at process._tickCallback (internal/process/next_tick.js:161:9) command: 'HSET', code: 'NR_CLOSED', args: [Array], position: 0 },
     { AbortError
         at handle_offline_command (/Users/olalonde/code/kue-shutdown-test/node_modules/redis/index.js:846:15)
         at RedisClient.internal_send_command (/Users/olalonde/code/kue-shutdown-test/node_modules/redis/index.js:880:9)
         at pipeline_transaction_command (/Users/olalonde/code/kue-shutdown-test/node_modules/redis/lib/multi.js:41:18)
         at Multi.exec_transaction (/Users/olalonde/code/kue-shutdown-test/node_modules/redis/lib/multi.js:112:9)
         at Job.state (/Users/olalonde/code/kue-shutdown-test/node_modules/kue/lib/queue/job.js:702:9)
         at Job.<anonymous> (/Users/olalonde/code/kue-shutdown-test/node_modules/kue/lib/queue/job.js:869:10)
         at callbackOrEmit (/Users/olalonde/code/kue-shutdown-test/node_modules/redis/lib/utils.js:89:9)
         at /Users/olalonde/code/kue-shutdown-test/node_modules/redis/lib/utils.js:107:13
         at _combinedTickCallback (internal/process/next_tick.js:95:7)
         at process._tickCallback (internal/process/next_tick.js:161:9) command: 'ZADD', code: 'NR_CLOSED', args: [Array], position: 1 },
     { AbortError
         at handle_offline_command (/Users/olalonde/code/kue-shutdown-test/node_modules/redis/index.js:846:15)
         at RedisClient.internal_send_command (/Users/olalonde/code/kue-shutdown-test/node_modules/redis/index.js:880:9)
         at pipeline_transaction_command (/Users/olalonde/code/kue-shutdown-test/node_modules/redis/lib/multi.js:41:18)
         at Multi.exec_transaction (/Users/olalonde/code/kue-shutdown-test/node_modules/redis/lib/multi.js:112:9)
         at Job.state (/Users/olalonde/code/kue-shutdown-test/node_modules/kue/lib/queue/job.js:702:9)
         at Job.<anonymous> (/Users/olalonde/code/kue-shutdown-test/node_modules/kue/lib/queue/job.js:869:10)
         at callbackOrEmit (/Users/olalonde/code/kue-shutdown-test/node_modules/redis/lib/utils.js:89:9)
         at /Users/olalonde/code/kue-shutdown-test/node_modules/redis/lib/utils.js:107:13
         at _combinedTickCallback (internal/process/next_tick.js:95:7)
         at process._tickCallback (internal/process/next_tick.js:161:9) command: 'ZADD', code: 'NR_CLOSED', args: [Array], position: 2 },
     { AbortError
         at handle_offline_command (/Users/olalonde/code/kue-shutdown-test/node_modules/redis/index.js:846:15)
         at RedisClient.internal_send_command (/Users/olalonde/code/kue-shutdown-test/node_modules/redis/index.js:880:9)
         at pipeline_transaction_command (/Users/olalonde/code/kue-shutdown-test/node_modules/redis/lib/multi.js:41:18)
         at Multi.exec_transaction (/Users/olalonde/code/kue-shutdown-test/node_modules/redis/lib/multi.js:112:9)
         at Job.state (/Users/olalonde/code/kue-shutdown-test/node_modules/kue/lib/queue/job.js:702:9)
         at Job.<anonymous> (/Users/olalonde/code/kue-shutdown-test/node_modules/kue/lib/queue/job.js:869:10)
         at callbackOrEmit (/Users/olalonde/code/kue-shutdown-test/node_modules/redis/lib/utils.js:89:9)
         at /Users/olalonde/code/kue-shutdown-test/node_modules/redis/lib/utils.js:107:13
         at _combinedTickCallback (internal/process/next_tick.js:95:7)
         at process._tickCallback (internal/process/next_tick.js:161:9)
       command: 'LPUSH',
       code: 'NR_CLOSED',
       args: [Array],
       position: 3 } ] }
olalonde commented 7 years ago

Created this repo to reproduce: https://github.com/olalonde/kue-shutdown-test

behrad commented 7 years ago

Thank you @olalonde , I will try to check this ASAP

orenherman commented 6 years ago

Any update regarding this ? Im experiencing something similar with AWS Lambda runtime. After a "hot" start, kue tries to create a new client without being initiated first, which fails the execution.

cassiodias commented 6 years ago

Hello! Any update regarding this?