Skip to content

Commit 883a709

Browse files
committed
testing: fix data race when reading container state in some handlers
Example of data race found: ``` ================== WARNING: DATA RACE Write at 0x00c420df4468 by goroutine 559: github.com/tsuru/tsuru/vendor/github.com/fsouza/go-dockerclient/testing.(*DockerServer).stopContainer() /home/travis/gopath/src/github.com/tsuru/tsuru/vendor/github.com/fsouza/go-dockerclient/testing/server.go:724 +0x15a github.com/tsuru/tsuru/vendor/github.com/fsouza/go-dockerclient/testing.(*DockerServer).(github.com/tsuru/tsuru/vendor/github.com/fsouza/go-dockerclient/testing.stopContainer)-fm() /home/travis/gopath/src/github.com/tsuru/tsuru/vendor/github.com/fsouza/go-dockerclient/testing/server.go:169 +0x5f github.com/tsuru/tsuru/vendor/github.com/fsouza/go-dockerclient/testing.(*DockerServer).handlerWrapper.func1() /home/travis/gopath/src/github.com/tsuru/tsuru/vendor/github.com/fsouza/go-dockerclient/testing/server.go:379 +0x70a net/http.HandlerFunc.ServeHTTP() /home/travis/.gimme/versions/go1.9.2.linux.amd64/src/net/http/server.go:1918 +0x51 github.com/tsuru/tsuru/vendor/github.com/gorilla/mux.(*Router).ServeHTTP() /home/travis/gopath/src/github.com/tsuru/tsuru/vendor/github.com/gorilla/mux/mux.go:133 +0x18a github.com/tsuru/tsuru/vendor/github.com/fsouza/go-dockerclient/testing.(*DockerServer).ServeHTTP() /home/travis/gopath/src/github.com/tsuru/tsuru/vendor/github.com/fsouza/go-dockerclient/testing/server.go:340 +0x271 net/http.serverHandler.ServeHTTP() /home/travis/.gimme/versions/go1.9.2.linux.amd64/src/net/http/server.go:2619 +0xbc net/http.(*conn).serve() /home/travis/.gimme/versions/go1.9.2.linux.amd64/src/net/http/server.go:1801 +0x83b Previous read at 0x00c420df4468 by goroutine 165: github.com/tsuru/tsuru/vendor/github.com/fsouza/go-dockerclient/testing.(*DockerServer).attachContainer() /home/travis/gopath/src/github.com/tsuru/tsuru/vendor/github.com/fsouza/go-dockerclient/testing/server.go:790 +0x356 github.com/tsuru/tsuru/vendor/github.com/fsouza/go-dockerclient/testing.(*DockerServer).(github.com/tsuru/tsuru/vendor/github.com/fsouza/go-dockerclient/testing.attachContainer)-fm() /home/travis/gopath/src/github.com/tsuru/tsuru/vendor/github.com/fsouza/go-dockerclient/testing/server.go:174 +0x5f github.com/tsuru/tsuru/vendor/github.com/fsouza/go-dockerclient/testing.(*DockerServer).handlerWrapper.func1() /home/travis/gopath/src/github.com/tsuru/tsuru/vendor/github.com/fsouza/go-dockerclient/testing/server.go:379 +0x70a net/http.HandlerFunc.ServeHTTP() /home/travis/.gimme/versions/go1.9.2.linux.amd64/src/net/http/server.go:1918 +0x51 github.com/tsuru/tsuru/vendor/github.com/gorilla/mux.(*Router).ServeHTTP() /home/travis/gopath/src/github.com/tsuru/tsuru/vendor/github.com/gorilla/mux/mux.go:133 +0x18a github.com/tsuru/tsuru/vendor/github.com/fsouza/go-dockerclient/testing.(*DockerServer).ServeHTTP() /home/travis/gopath/src/github.com/tsuru/tsuru/vendor/github.com/fsouza/go-dockerclient/testing/server.go:340 +0x271 net/http.serverHandler.ServeHTTP() /home/travis/.gimme/versions/go1.9.2.linux.amd64/src/net/http/server.go:2619 +0xbc net/http.(*conn).serve() /home/travis/.gimme/versions/go1.9.2.linux.amd64/src/net/http/server.go:1801 +0x83b Goroutine 559 (running) created at: net/http.(*Server).Serve() /home/travis/.gimme/versions/go1.9.2.linux.amd64/src/net/http/server.go:2720 +0x37c net/http.Serve() /home/travis/.gimme/versions/go1.9.2.linux.amd64/src/net/http/server.go:2323 +0xe2 Goroutine 165 (running) created at: net/http.(*Server).Serve() /home/travis/.gimme/versions/go1.9.2.linux.amd64/src/net/http/server.go:2720 +0x37c net/http.Serve() /home/travis/.gimme/versions/go1.9.2.linux.amd64/src/net/http/server.go:2323 +0xe2 ================== ```
1 parent 5030de4 commit 883a709

File tree

1 file changed

+6
-0
lines changed

1 file changed

+6
-0
lines changed

testing/server.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,8 @@ func (s *DockerServer) topContainer(w http.ResponseWriter, r *http.Request) {
640640
http.Error(w, err.Error(), http.StatusNotFound)
641641
return
642642
}
643+
s.cMut.RLock()
644+
defer s.cMut.RUnlock()
643645
if !container.State.Running {
644646
w.WriteHeader(http.StatusInternalServerError)
645647
fmt.Fprintf(w, "Container %s is not running", id)
@@ -787,11 +789,13 @@ func (s *DockerServer) attachContainer(w http.ResponseWriter, r *http.Request) {
787789
}()
788790
}
789791
outStream := stdcopy.NewStdWriter(conn, stdcopy.Stdout)
792+
s.cMut.RLock()
790793
if container.State.Running {
791794
fmt.Fprintf(outStream, "Container is running\n")
792795
} else {
793796
fmt.Fprintf(outStream, "Container is not running\n")
794797
}
798+
s.cMut.RUnlock()
795799
fmt.Fprintln(outStream, "What happened?")
796800
fmt.Fprintln(outStream, "Something happened")
797801
wg.Wait()
@@ -919,11 +923,13 @@ func (s *DockerServer) logContainer(w http.ResponseWriter, r *http.Request) {
919923
}
920924
w.Header().Set("Content-Type", "application/vnd.docker.raw-stream")
921925
w.WriteHeader(http.StatusOK)
926+
s.cMut.RLock()
922927
if container.State.Running {
923928
fmt.Fprintf(w, "Container is running\n")
924929
} else {
925930
fmt.Fprintf(w, "Container is not running\n")
926931
}
932+
s.cMut.RUnlock()
927933
fmt.Fprintln(w, "What happened?")
928934
fmt.Fprintln(w, "Something happened")
929935
if r.URL.Query().Get("follow") == "1" {

0 commit comments

Comments
 (0)