timgit / pg-boss

Queueing jobs in Node.js using PostgreSQL like a boss
MIT License
1.73k stars 144 forks source link

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

Open StarpTech opened 10 months ago

StarpTech commented 10 months 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 10 months ago

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

StarpTech commented 10 months 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 10 months ago

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

StarpTech commented 10 months ago

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

StarpTech commented 10 months ago

@timgit friendly ping.

timgit commented 10 months ago

Hold off on the PR. v10 will include this

StarpTech commented 10 months ago

@timgit thank you. Any eta?

timgit commented 10 months ago

Interested in the beta?

StarpTech commented 10 months ago

Sure