diff --git a/client/socket_client.go b/client/socket_client.go index fd9d0ae9..1045dea7 100644 --- a/client/socket_client.go +++ b/client/socket_client.go @@ -97,11 +97,11 @@ func (cli *socketClient) OnStop() { // Stop the client and set the error func (cli *socketClient) StopForError(err error) { - cli.mtx.Lock() if !cli.IsRunning() { return } + cli.mtx.Lock() if cli.err == nil { cli.err = err } diff --git a/client/socket_client_test.go b/client/socket_client_test.go new file mode 100644 index 00000000..814d5a68 --- /dev/null +++ b/client/socket_client_test.go @@ -0,0 +1,28 @@ +package abcicli_test + +import ( + "errors" + "testing" + "time" + + "github.com/tendermint/abci/client" +) + +func TestSocketClientStopForErrorDeadlock(t *testing.T) { + c := abcicli.NewSocketClient(":80", false) + err := errors.New("foo-tendermint") + + // See Issue https://github.com/tendermint/abci/issues/114 + doneChan := make(chan bool) + go func() { + defer close(doneChan) + c.StopForError(err) + c.StopForError(err) + }() + + select { + case <-doneChan: + case <-time.After(time.Second * 4): + t.Fatalf("Test took too long, potential deadlock still exists") + } +}