From 1ef9e31262b6dff796d35ee667cb9b93e723b13d Mon Sep 17 00:00:00 2001 From: Ruslan Drozhdzh <30860269+rdrozhdzh@users.noreply.github.com> Date: Fri, 22 Jun 2018 12:54:40 +0300 Subject: [PATCH] retry creating dnstest.Server if tcp or udp port is in use (#1799) * retry creating dnstest.Server if tcp or udp port is in use * changes according to review --- plugin/pkg/dnstest/server.go | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/plugin/pkg/dnstest/server.go b/plugin/pkg/dnstest/server.go index 8e9a2c76a..bbad0f96b 100644 --- a/plugin/pkg/dnstest/server.go +++ b/plugin/pkg/dnstest/server.go @@ -23,18 +23,28 @@ func NewServer(f dns.HandlerFunc) *Server { ch1 := make(chan bool) ch2 := make(chan bool) - l, _ := net.Listen("tcp", ":0") - if l == nil { - return nil + s1 := &dns.Server{} // udp + s2 := &dns.Server{} // tcp + + for i := 0; i < 5; i++ { // 5 attempts + s2.Listener, _ = net.Listen("tcp", ":0") + if s2.Listener == nil { + continue + } + + s1.PacketConn, _ = net.ListenPacket("udp", s2.Listener.Addr().String()) + if s1.PacketConn != nil { + break + } + + // perhaps UPD port is in use, try again + s2.Listener.Close() + s2.Listener = nil } - p, _ := net.ListenPacket("udp", l.Addr().String()) - if p == nil { - l.Close() - return nil // yes, this may crash some test, but this is better than hanging + if s2.Listener == nil { + panic("dnstest.NewServer(): failed to create new server") } - s1 := &dns.Server{PacketConn: p} - s2 := &dns.Server{Listener: l} s1.NotifyStartedFunc = func() { close(ch1) } s2.NotifyStartedFunc = func() { close(ch2) } go s1.ActivateAndServe() @@ -43,7 +53,7 @@ func NewServer(f dns.HandlerFunc) *Server { <-ch1 <-ch2 - return &Server{s1: s1, s2: s2, Addr: p.LocalAddr().String()} + return &Server{s1: s1, s2: s2, Addr: s2.Listener.Addr().String()} } // Close shuts down the server.