timgit / pg-boss

Queueing jobs in Postgres from Node.js like a boss
MIT License
2.15k stars 160 forks source link

Stopping pg-boss gracefully does not wait until stop timeouts #421

Closed StarpTech closed 3 months ago

StarpTech commented 1 year ago

Hi, it looks like pg-boss does not respect graceful nor timeout property. I have a simple worker that needs at least 5 seconds to finish. On SIGTERM I clean up all my server resources but boss.stop does not block until the max timeout of 30s is over.

await fastify.pgboss.send(queue, { some: 'data' });

await fastify.pgboss.work(queue, async function someAsyncJobHandler(job) {
  console.log(`job ${job.id} received with data:`);

  // promise wait
  await new Promise((resolve) => setTimeout(resolve, 5000));

  console.log(job);
});

 const stopOptions: PgBoss.StopOptions = {
     timeout: 30_000,
     graceful: true,
     destroy: false
};
await boss.stop(stopOptions);
StarpTech commented 1 year ago

My fault. I still had a timeout in the shutdown phase. The bug is still valid.

StarpTech commented 1 year ago

I was able to workaround this by

await boss.stop(stopOptions);

await new Promise((resolve) => {
  boss.once('stopped', () => resolve(null));
});

fastify.log.info('PgBoss shutdown complete');

I think it would be more intuitive if this is the default behavior of stop(). Would you accept a PR?

timgit commented 1 year ago

PRs are always welcome. I think it should be opt-in via as a new option on stop(). Thanks!

StarpTech commented 1 year ago

What's the reason for passing it onto the next cycle here? + why is a delay of 1000ms required?

StarpTech commented 1 year ago

@timgit friendly ping.

timgit commented 1 year ago

Hold off on the PR. v10 will include this

StarpTech commented 1 year ago

@timgit thank you. Any eta?

timgit commented 1 year ago

Interested in the beta?

StarpTech commented 1 year ago

Sure