]> Cypherpunks repositories - gostls13.git/commitdiff
log/syslog: fix deadlock in test
authorDmitriy Vyukov <dvyukov@google.com>
Fri, 24 May 2013 14:35:48 +0000 (18:35 +0400)
committerDmitriy Vyukov <dvyukov@google.com>
Fri, 24 May 2013 14:35:48 +0000 (18:35 +0400)
The problem was that server handlers block on done<-,
the goroutine that reads from done blocks on count<-,
and the main goroutine that is supposed to read from count
waits for server handlers to exit.
Fixes #5547.

R=golang-dev, dave, bradfitz
CC=golang-dev
https://golang.org/cl/9722043

src/pkg/log/syslog/syslog_test.go

index ec4525190f4945b006f2c0106bf21116d5422fdc..786edf870d78854c2d0628d6ed15803f1d318ebc 100644 (file)
@@ -281,12 +281,12 @@ func TestConcurrentWrite(t *testing.T) {
        for i := 0; i < 10; i++ {
                wg.Add(1)
                go func() {
+                       defer wg.Done()
                        err := w.Info("test")
                        if err != nil {
                                t.Errorf("Info() failed: %v", err)
                                return
                        }
-                       wg.Done()
                }()
        }
        wg.Wait()
@@ -296,8 +296,10 @@ func TestConcurrentReconnect(t *testing.T) {
        crashy = true
        defer func() { crashy = false }()
 
+       const N = 10
+       const M = 100
        net := "unix"
-       done := make(chan string)
+       done := make(chan string, N*M)
        addr, sock, srvWG := startServer(net, "", done)
        defer os.Remove(addr)
 
@@ -310,7 +312,7 @@ func TestConcurrentReconnect(t *testing.T) {
                        // we are looking for 500 out of 1000 events
                        // here because lots of log messages are lost
                        // in buffers (kernel and/or bufio)
-                       if ct > 500 {
+                       if ct > N*M/2 {
                                break
                        }
                }
@@ -318,21 +320,21 @@ func TestConcurrentReconnect(t *testing.T) {
        }()
 
        var wg sync.WaitGroup
-       for i := 0; i < 10; i++ {
-               wg.Add(1)
+       wg.Add(N)
+       for i := 0; i < N; i++ {
                go func() {
+                       defer wg.Done()
                        w, err := Dial(net, addr, LOG_USER|LOG_ERR, "tag")
                        if err != nil {
                                t.Fatalf("syslog.Dial() failed: %v", err)
                        }
-                       for i := 0; i < 100; i++ {
+                       for i := 0; i < M; i++ {
                                err := w.Info("test")
                                if err != nil {
                                        t.Errorf("Info() failed: %v", err)
                                        return
                                }
                        }
-                       wg.Done()
                }()
        }
        wg.Wait()