Race condition on close worker
zainulbr opened this issue · 3 comments
zainulbr commented
hi All, i got race condition on calling close worker function. i was try worker code example, but race condition reproduced also.o.
zainul@zainul-bahar:~/Documents/GOPATH/src/github.com/mikespook/gearman-go/example/worker$ ./worker
2019/05/27 13:30:48 Starting ...
^C==================
WARNING: DATA RACE
Read at 0x00c0000aa210 by main goroutine:
github.com/mikespook/gearman-go/worker.(*Worker).Close()
/home/zainul/Documents/GOPATH/src/github.com/mikespook/gearman-go/worker/worker.go:223 +0x7f
main.main()
/home/zainul/Documents/GOPATH/src/github.com/mikespook/gearman-go/example/worker/worker.go:74 +0x78f
Previous write at 0x00c0000aa210 by goroutine 8:
github.com/mikespook/gearman-go/worker.(*Worker).Work()
/home/zainul/Documents/GOPATH/src/github.com/mikespook/gearman-go/worker/worker.go:200 +0x5e
Goroutine 8 (running) created at:
main.main()
/home/zainul/Documents/GOPATH/src/github.com/mikespook/gearman-go/example/worker/worker.go:71 +0x704
==================
2019/05/27 13:30:52 read tcp4 127.0.0.1:41870->127.0.0.1:4730: use of closed network connection
==================
WARNING: DATA RACE
Write at 0x00c0000ae0a8 by main goroutine:
github.com/mikespook/gearman-go/worker.(*agent).Close()
/home/zainul/Documents/GOPATH/src/github.com/mikespook/gearman-go/worker/agent.go:128 +0xd3
github.com/mikespook/gearman-go/worker.(*Worker).Close()
/home/zainul/Documents/GOPATH/src/github.com/mikespook/gearman-go/worker/worker.go:225 +0xdf
main.main()
/home/zainul/Documents/GOPATH/src/github.com/mikespook/gearman-go/example/worker/worker.go:74 +0x78f
Previous read at 0x00c0000ae0a8 by goroutine 7:
github.com/mikespook/gearman-go/worker.(*agent).disconnect_error()
/home/zainul/Documents/GOPATH/src/github.com/mikespook/gearman-go/worker/agent.go:114 +0x42
github.com/mikespook/gearman-go/worker.(*agent).work()
/home/zainul/Documents/GOPATH/src/github.com/mikespook/gearman-go/worker/agent.go:63 +0x4b5
Goroutine 7 (running) created at:
github.com/mikespook/gearman-go/worker.(*agent).Connect()
/home/zainul/Documents/GOPATH/src/github.com/mikespook/gearman-go/worker/agent.go:42 +0x5f7
github.com/mikespook/gearman-go/worker.(*Worker).Ready()
/home/zainul/Documents/GOPATH/src/github.com/mikespook/gearman-go/worker/worker.go:178 +0x139
main.main()
/home/zainul/Documents/GOPATH/src/github.com/mikespook/gearman-go/example/worker/worker.go:67 +0x64d
==================
2019/05/27 13:30:52 Shutdown complete!
Found 2 data race(s)
galihrivanto commented
it seem adding synchronization on disconnect_error
and Work
solve the issue
func (a *agent) disconnect_error(err error) {
a.Lock()
defer a.Unlock()
if a.conn != nil {
err = &WorkerDisconnectError{
err: err,
agent: a,
}
a.worker.err(err)
}
}
func (worker *Worker) Work() {
...
worker.Lock()
worker.running = true
worker.Unlock()
...
}
sadlil commented
@galihrivanto can please open a PR?
galihrivanto commented
sure #89