2

I have a beanstalkd instance with two workers picking jobs from one tube.

I've noticed that occasionally one of the workers will reserve a job that has already been reserved (and being worked on) by the other worker.

I know there aren't duplicate jobs in the queue.

Why does beanstalkd allow the same job to be reserved twice?

user489176
  • 113
  • 9
  • 1
    How long between the two jobs being picked up? Could the job have failed and been put back into the queue? What is the jobs TTR? – Alister Bulman Jul 15 '14 at 13:09

2 Answers2

2

It sounds to me that you didn't implemented the protocol properly. You need to handle DEADLINE_SOON, and do TOUCH.

What does DEADLINE_SOON mean?

DEADLINE_SOON is a response to a reserve command indicating that you have a job reserved whose deadline is real soon (current safety margin is approximately 1 second).

If you are frequently receiving DEADLINE_SOON errors on reserve, you should probably consider increasing the TTR on your jobs as it generally indicates you aren’t completing them in time. It may also be that you are failing to delete tasks when you have completed them.

See the mailing list discussion for more information.

How does TTR work?

TTR only applies to a job at the moment it becomes reserved. At that event, a timer (called “time-left” in the job stats) starts counting down from the job’s TTR.

  • If the timer reaches zero, the job gets put back in the ready queue.
  • If the job is buried, deleted, or released before the timer runs out, the timer ceases to exist.
  • If the job is touch"ed before the timer reaches zero, the timer starts over counting down from TTR.

The "touch" command

Allows a worker to request more time to work on a job. This is useful for jobs that potentially take a long time, but you still want the benefits of a TTR pulling a job away from an unresponsive worker. A worker may periodically tell the server that it's still alive and processing a job (e.g. it may do this on DEADLINE_SOON). The command postpones the auto release of a reserved job until TTR seconds from when the command is issued.

Pentium10
  • 204,586
  • 122
  • 423
  • 502
1

The jobs take longer to run than the TTR, so it was being returned back to the queue and picked up by the other worker.

I now set a larger TTR on the job.

user489176
  • 113
  • 9