aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Ruslan Drozhdzh <30860269+rdrozhdzh@users.noreply.github.com> 2018-06-22 12:54:40 +0300
committerGravatar Miek Gieben <miek@miek.nl> 2018-06-22 10:54:40 +0100
commit1ef9e31262b6dff796d35ee667cb9b93e723b13d (patch)
tree5f8dc46d293fae5bd85103a7662884ba0736b2f9
parent716791aa094b54ea17241112a14eeecac10dcfa5 (diff)
downloadcoredns-1ef9e31262b6dff796d35ee667cb9b93e723b13d.tar.gz
coredns-1ef9e31262b6dff796d35ee667cb9b93e723b13d.tar.zst
coredns-1ef9e31262b6dff796d35ee667cb9b93e723b13d.zip
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
-rw-r--r--plugin/pkg/dnstest/server.go30
1 files 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.