mikespook / gearman-go

This package is a Gearman API for Golang. It was implemented a native protocol for both worker and client API.
MIT License
291 stars 83 forks source link

WorkerConnection freezes due to racecondition. #56

Open lath opened 9 years ago

lath commented 9 years ago

Hello.

I've noticed that the worker-connection sometimes freezes. The reason for this is an unhandled io.ErrShortWrite error caused inside agent.write().

The writer throws this error when a worker-go-routine writes "dtWorkComplete" just after the main-thread receives a "dtNoop" but before sending "dtPreSleep". In other words:

dtNoop dtWorkComplete dtPreSleep

This causes the issue because the go-routine is missing a synclock inside worker.exec(). I've solved this by changing:

inpack.a.write(outpack)

into

inpack.a.Lock()
err := inpack.a.write(outpack)
inpack.a.Unlock()
parkr commented 9 years ago

Is this closed?

mikespook commented 9 years ago

Already fixed, but I think it still needs more testing.

lath commented 9 years ago

I have not updated my codebase for a long time but the patch has worked for me without any problems since I implemented it.

Best regards