Skip to content

Commit

Permalink
Move initialization of listener and ListenAddr from Start() into NewD…
Browse files Browse the repository at this point in the history
…NSServer() so they can run on the caller's goroutine and avoid race conditions
  • Loading branch information
bboreham committed Jun 17, 2015
1 parent 1b57a24 commit 6711eef
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 6 deletions.
4 changes: 3 additions & 1 deletion nameserver/server.go
Expand Up @@ -218,7 +218,10 @@ func (s *DNSServer) Start() error {
s.tcpSrv = &dns.Server{Listener: l, Handler: s.createMux(protTCP), ReadTimeout: s.readTimeout}

s.listenersWg.Add(2)
return nil
}

func (s *DNSServer) ActivateAndServe() {
go func() {
defer s.listenersWg.Done()

Expand All @@ -241,7 +244,6 @@ func (s *DNSServer) Start() error {
s.listenersWg.Wait()

Info.Printf("[dns] Server exiting...")
return nil
}

// Return status string
Expand Down
12 changes: 9 additions & 3 deletions nameserver/server_cache_test.go
Expand Up @@ -69,7 +69,9 @@ func TestServerDbCacheInvalidation(t *testing.T) {
MaxAnswers: 4,
})
wt.AssertNoErr(t, err)
go srv.Start()
err = srv.Start()
wt.AssertNoErr(t, err)
go srv.ActivateAndServe()
defer srv.Stop()
time.Sleep(100 * time.Millisecond) // Allow server goroutine to start

Expand Down Expand Up @@ -202,7 +204,9 @@ func TestServerCacheExpiration(t *testing.T) {
CacheNegLocalTTL: negativeLocalTTL,
})
wt.AssertNoErr(t, err)
go srv.Start()
err = srv.Start()
wt.AssertNoErr(t, err)
go srv.ActivateAndServe()
defer srv.Stop()
time.Sleep(100 * time.Millisecond) // Allow server goroutine to start

Expand Down Expand Up @@ -287,7 +291,9 @@ func TestServerCacheRefresh(t *testing.T) {
MaxAnswers: 4,
})
wt.AssertNoErr(t, err)
go srv.Start()
err = srv.Start()
wt.AssertNoErr(t, err)
go srv.ActivateAndServe()
defer srv.Stop()
time.Sleep(100 * time.Millisecond) // Allow sever goroutine to start

Expand Down
8 changes: 6 additions & 2 deletions nameserver/server_test.go
Expand Up @@ -89,7 +89,9 @@ func TestUDPDNSServer(t *testing.T) {
ListenReadTimeout: testSocketTimeout,
})
wt.AssertNoErr(t, err)
go srv.Start()
err = srv.Start()
wt.AssertNoErr(t, err)
go srv.ActivateAndServe()
defer srv.Stop()
time.Sleep(100 * time.Millisecond) // Allow sever goroutine to start

Expand Down Expand Up @@ -195,7 +197,9 @@ func TestTCPDNSServer(t *testing.T) {
ListenReadTimeout: testSocketTimeout,
})
wt.AssertNoErr(t, err)
go srv.Start()
err = srv.Start()
wt.AssertNoErr(t, err)
go srv.ActivateAndServe()
defer srv.Stop()
time.Sleep(100 * time.Millisecond) // Allow sever goroutine to start

Expand Down
1 change: 1 addition & 0 deletions prog/weavedns/main.go
Expand Up @@ -182,4 +182,5 @@ func main() {
if err != nil {
Error.Fatal("[main] Failed to start the WeaveDNS server: ", err)
}
srv.ActivateAndServe()
}

0 comments on commit 6711eef

Please sign in to comment.