mikespook/gearman-go

Race condition on close worker

zainulbr opened this issue · 3 comments

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)

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()

	...
}

@galihrivanto can please open a PR?