From 9636675c2cac020d6484c5a1f258ad7080a06c95 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 16 Jun 2015 16:58:18 +0100 Subject: [PATCH] Split part of DNSServer.Start() to a separate ActivateAndServe() Specifically, move the part that blocks, and call that as necessary. This means Start() can run on the caller's goroutine and avoid race conditions. --- nameserver/server.go | 4 +++- nameserver/server_cache_test.go | 12 +++++++++--- nameserver/server_test.go | 8 ++++++-- prog/weavedns/main.go | 1 + 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/nameserver/server.go b/nameserver/server.go index 336b863f..a7b84bc7 100644 --- a/nameserver/server.go +++ b/nameserver/server.go @@ -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() @@ -241,7 +244,6 @@ func (s *DNSServer) Start() error { s.listenersWg.Wait() Info.Printf("[dns] Server exiting...") - return nil } // Return status string diff --git a/nameserver/server_cache_test.go b/nameserver/server_cache_test.go index 5b366928..65f233df 100644 --- a/nameserver/server_cache_test.go +++ b/nameserver/server_cache_test.go @@ -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 @@ -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 @@ -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 diff --git a/nameserver/server_test.go b/nameserver/server_test.go index 360222f4..feba9997 100644 --- a/nameserver/server_test.go +++ b/nameserver/server_test.go @@ -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 @@ -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 diff --git a/prog/weavedns/main.go b/prog/weavedns/main.go index f22ef8e5..21193da6 100644 --- a/prog/weavedns/main.go +++ b/prog/weavedns/main.go @@ -182,4 +182,5 @@ func main() { if err != nil { Error.Fatal("[main] Failed to start the WeaveDNS server: ", err) } + srv.ActivateAndServe() }