Skip to content

Commit 26cad7b

Browse files
committed
testing: fix race condition reading data from containers
Example of a race caught by the race detector: ``` ================== WARNING: DATA RACE Write at 0x00c4201dea68 by goroutine 374: 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:726 +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 0x00c4201dea68 by goroutine 357: reflect.Value.Bool() /home/travis/.gimme/versions/go1.9.2.linux.amd64/src/reflect/value.go:248 +0x52 encoding/json.isEmptyValue() /home/travis/.gimme/versions/go1.9.2.linux.amd64/src/encoding/json/encode.go:309 +0xd4 encoding/json.(*structEncoder).encode() /home/travis/.gimme/versions/go1.9.2.linux.amd64/src/encoding/json/encode.go:626 +0x31f encoding/json.(*structEncoder).(encoding/json.encode)-fm() /home/travis/.gimme/versions/go1.9.2.linux.amd64/src/encoding/json/encode.go:651 +0x7b encoding/json.(*structEncoder).encode() /home/travis/.gimme/versions/go1.9.2.linux.amd64/src/encoding/json/encode.go:637 +0x2e2 encoding/json.(*structEncoder).(encoding/json.encode)-fm() /home/travis/.gimme/versions/go1.9.2.linux.amd64/src/encoding/json/encode.go:651 +0x7b encoding/json.(*ptrEncoder).encode() /home/travis/.gimme/versions/go1.9.2.linux.amd64/src/encoding/json/encode.go:778 +0x12a encoding/json.(*ptrEncoder).(encoding/json.encode)-fm() /home/travis/.gimme/versions/go1.9.2.linux.amd64/src/encoding/json/encode.go:783 +0x7b encoding/json.(*encodeState).reflectValue() /home/travis/.gimme/versions/go1.9.2.linux.amd64/src/encoding/json/encode.go:323 +0x93 encoding/json.(*encodeState).marshal() /home/travis/.gimme/versions/go1.9.2.linux.amd64/src/encoding/json/encode.go:296 +0xbc encoding/json.(*Encoder).Encode() /home/travis/.gimme/versions/go1.9.2.linux.amd64/src/encoding/json/stream.go:193 +0xda github.com/tsuru/tsuru/vendor/github.com/fsouza/go-dockerclient/testing.(*DockerServer).inspectContainer() /home/travis/gopath/src/github.com/tsuru/tsuru/vendor/github.com/fsouza/go-dockerclient/testing/server.go:569 +0x289 github.com/tsuru/tsuru/vendor/github.com/fsouza/go-dockerclient/testing.(*DockerServer).(github.com/tsuru/tsuru/vendor/github.com/fsouza/go-dockerclient/testing.inspectContainer)-fm() /home/travis/gopath/src/github.com/tsuru/tsuru/vendor/github.com/fsouza/go-dockerclient/testing/server.go:165 +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 374 (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 357 (finished) 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 f21b764 commit 26cad7b

File tree

1 file changed

+9
-3
lines changed

1 file changed

+9
-3
lines changed

testing/server.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -547,10 +547,10 @@ func (s *DockerServer) renameContainer(w http.ResponseWriter, r *http.Request) {
547547
http.Error(w, err.Error(), http.StatusNotFound)
548548
return
549549
}
550-
copy := *container
551-
copy.Name = r.URL.Query().Get("name")
552550
s.cMut.Lock()
553551
defer s.cMut.Unlock()
552+
copy := *container
553+
copy.Name = r.URL.Query().Get("name")
554554
if s.containers[index].ID == copy.ID {
555555
s.containers[index] = &copy
556556
}
@@ -566,6 +566,8 @@ func (s *DockerServer) inspectContainer(w http.ResponseWriter, r *http.Request)
566566
}
567567
w.Header().Set("Content-Type", "application/json")
568568
w.WriteHeader(http.StatusOK)
569+
s.cMut.RLock()
570+
defer s.cMut.RUnlock()
569571
json.NewEncoder(w).Encode(container)
570572
}
571573

@@ -820,16 +822,18 @@ func (s *DockerServer) waitContainer(w http.ResponseWriter, r *http.Request) {
820822
http.Error(w, err.Error(), http.StatusNotFound)
821823
return
822824
}
825+
var exitCode int
823826
for {
824827
time.Sleep(1e6)
825828
s.cMut.RLock()
826829
if !container.State.Running {
830+
exitCode = container.State.ExitCode
827831
s.cMut.RUnlock()
828832
break
829833
}
830834
s.cMut.RUnlock()
831835
}
832-
result := map[string]int{"StatusCode": container.State.ExitCode}
836+
result := map[string]int{"StatusCode": exitCode}
833837
json.NewEncoder(w).Encode(result)
834838
}
835839

@@ -1153,7 +1157,9 @@ func (s *DockerServer) createExecContainer(w http.ResponseWriter, r *http.Reques
11531157
}
11541158

11551159
execID := s.generateID()
1160+
s.cMut.Lock()
11561161
container.ExecIDs = append(container.ExecIDs, execID)
1162+
s.cMut.Unlock()
11571163

11581164
exec := docker.ExecInspect{
11591165
ID: execID,

0 commit comments

Comments
 (0)