Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix a small probability panic for containerd.
containerd-->main-->daemon step 1 |--> grpc_health_v1.RegisterHealthServer --> register(with lock)--> s.m[sd.ServiceName] = srv (map write) | step 2 |--> s.Serve(l)--> go s.handleStream(without lock) --> srv, ok := s.m[service] (map read) | step 3 |--> types.RegisterAPIServer --> register(with lock)--> s.m[sd.ServiceName] = srv (map write) In containerd'code currently, step 3 is called after step 1 and step 2, it may lead to "concurrent map read and map write", and the correct sequence should be step 2 comes last(step1/3-->step 2) Just see the following code, package main import ( "time" ) func noUse(k, v int) { } func main() { mp := make(map[int]int) go func() { for { for k, v := range mp { noUse(k, v) } time.Sleep(1 * time.Millisecond) } }() go func() { i := 0 for { mp[i] = i i++ time.Sleep(1 * time.Millisecond) } }() time.Sleep(100 * time.Second) } it can make panic like this, fatal error: concurrent map read and map write goroutine 4 [running]: runtime.throw(0x491ee0, 0x21) /usr/local/go/src/runtime/panic.go:547 +0x90 fp=0xc82002d660 sp=0xc82002d648 runtime.mapaccessK(0x460ee0, 0xc820010120, 0xc8202b8b40, 0x460ee0, 0x480200) /usr/local/go/src/runtime/hashmap.go:389 +0x5a fp=0xc82002d6a8 sp=0xc82002d660 runtime.mapiternext(0xc82002d750) /usr/local/go/src/runtime/hashmap.go:774 +0x63e fp=0xc82002d738 sp=0xc82002d6a8 main.main.func1(0xc820010120) /root/workspace/go/bin/concurrent.go:33 +0x79 fp=0xc82002d7b8 sp=0xc82002d738 runtime.goexit() /usr/local/go/src/runtime/asm_amd64.s:1998 +0x1 fp=0xc82002d7c0 sp=0xc82002d7b8 created by main.main /root/workspace/go/bin/concurrent.go:38 +0x69 goroutine 1 [sleep]: time.Sleep(0x174876e800) /usr/local/go/src/runtime/time.go:59 +0xf9 main.main() /root/workspace/go/bin/concurrent.go:48 +0x9e goroutine 5 [sleep]: time.Sleep(0x989680) /usr/local/go/src/runtime/time.go:59 +0xf9 main.main.func2(0xc820010120) /root/workspace/go/bin/concurrent.go:44 +0x71 created by main.main /root/workspace/go/bin/concurrent.go:46 +0x8 Signed-off-by: Shukui Yang <[email protected]>
- Loading branch information