Browse Source

dns: fix data races in DNS compression tests

Make the DisableCompression value configurable at runtime
to allow tests to change it without restarting/recreating
the server.
pull/3241/head
Frank Schroeder 8 years ago committed by Frank Schröder
parent
commit
727b6444ad
  1. 15
      agent/dns.go
  2. 8
      agent/dns_test.go
  3. 7
      agent/testagent.go

15
agent/dns.go

@ -6,6 +6,7 @@ import (
"log" "log"
"net" "net"
"strings" "strings"
"sync/atomic"
"time" "time"
"github.com/armon/go-metrics" "github.com/armon/go-metrics"
@ -38,6 +39,11 @@ type DNSServer struct {
domain string domain string
recursors []string recursors []string
logger *log.Logger logger *log.Logger
// disableCompression is the config.DisableCompression flag that can
// be safely changed at runtime. It always contains a bool and is
// initialized with the value from config.DisableCompression.
disableCompression atomic.Value
} }
func NewDNSServer(a *Agent) (*DNSServer, error) { func NewDNSServer(a *Agent) (*DNSServer, error) {
@ -60,6 +66,7 @@ func NewDNSServer(a *Agent) (*DNSServer, error) {
logger: a.logger, logger: a.logger,
recursors: recursors, recursors: recursors,
} }
srv.disableCompression.Store(a.config.DNSConfig.DisableCompression)
return srv, nil return srv, nil
} }
@ -120,7 +127,7 @@ func (d *DNSServer) handlePtr(resp dns.ResponseWriter, req *dns.Msg) {
// Setup the message response // Setup the message response
m := new(dns.Msg) m := new(dns.Msg)
m.SetReply(req) m.SetReply(req)
m.Compress = !d.config.DisableCompression m.Compress = !d.disableCompression.Load().(bool)
m.Authoritative = true m.Authoritative = true
m.RecursionAvailable = (len(d.recursors) > 0) m.RecursionAvailable = (len(d.recursors) > 0)
@ -195,7 +202,7 @@ func (d *DNSServer) handleQuery(resp dns.ResponseWriter, req *dns.Msg) {
// Setup the message response // Setup the message response
m := new(dns.Msg) m := new(dns.Msg)
m.SetReply(req) m.SetReply(req)
m.Compress = !d.config.DisableCompression m.Compress = !d.disableCompression.Load().(bool)
m.Authoritative = true m.Authoritative = true
m.RecursionAvailable = (len(d.recursors) > 0) m.RecursionAvailable = (len(d.recursors) > 0)
@ -907,7 +914,7 @@ func (d *DNSServer) handleRecurse(resp dns.ResponseWriter, req *dns.Msg) {
// Compress the response; we don't know if the incoming // Compress the response; we don't know if the incoming
// response was compressed or not, so by not compressing // response was compressed or not, so by not compressing
// we might generate an invalid packet on the way out. // we might generate an invalid packet on the way out.
r.Compress = !d.config.DisableCompression r.Compress = !d.disableCompression.Load().(bool)
// Forward the response // Forward the response
d.logger.Printf("[DEBUG] dns: recurse RTT for %v (%v)", q, rtt) d.logger.Printf("[DEBUG] dns: recurse RTT for %v (%v)", q, rtt)
@ -924,7 +931,7 @@ func (d *DNSServer) handleRecurse(resp dns.ResponseWriter, req *dns.Msg) {
q, resp.RemoteAddr().String(), resp.RemoteAddr().Network()) q, resp.RemoteAddr().String(), resp.RemoteAddr().Network())
m := &dns.Msg{} m := &dns.Msg{}
m.SetReply(req) m.SetReply(req)
m.Compress = !d.config.DisableCompression m.Compress = !d.disableCompression.Load().(bool)
m.RecursionAvailable = true m.RecursionAvailable = true
m.SetRcode(req, dns.RcodeServerFailure) m.SetRcode(req, dns.RcodeServerFailure)
if edns := req.IsEdns0(); edns != nil { if edns := req.IsEdns0(); edns != nil {

8
agent/dns_test.go

@ -4558,7 +4558,7 @@ func TestDNS_Compression_Query(t *testing.T) {
} }
// Do a manual exchange with compression on (the default). // Do a manual exchange with compression on (the default).
a.dns.config.DisableCompression = false a.DNSDisableCompression(false)
if err := conn.WriteMsg(m); err != nil { if err := conn.WriteMsg(m); err != nil {
t.Fatalf("err: %v", err) t.Fatalf("err: %v", err)
} }
@ -4569,7 +4569,7 @@ func TestDNS_Compression_Query(t *testing.T) {
} }
// Disable compression and try again. // Disable compression and try again.
a.dns.config.DisableCompression = true a.DNSDisableCompression(true)
if err := conn.WriteMsg(m); err != nil { if err := conn.WriteMsg(m); err != nil {
t.Fatalf("err: %v", err) t.Fatalf("err: %v", err)
} }
@ -4623,7 +4623,7 @@ func TestDNS_Compression_ReverseLookup(t *testing.T) {
} }
// Disable compression and try again. // Disable compression and try again.
a.dns.config.DisableCompression = true a.DNSDisableCompression(true)
if err := conn.WriteMsg(m); err != nil { if err := conn.WriteMsg(m); err != nil {
t.Fatalf("err: %v", err) t.Fatalf("err: %v", err)
} }
@ -4671,7 +4671,7 @@ func TestDNS_Compression_Recurse(t *testing.T) {
} }
// Disable compression and try again. // Disable compression and try again.
a.dns.config.DisableCompression = true a.DNSDisableCompression(true)
if err := conn.WriteMsg(m); err != nil { if err := conn.WriteMsg(m); err != nil {
t.Fatalf("err: %v", err) t.Fatalf("err: %v", err)
} }

7
agent/testagent.go

@ -245,6 +245,13 @@ func (a *TestAgent) Client() *api.Client {
return c return c
} }
// DNSDisableCompression disables compression for all started DNS servers.
func (a *TestAgent) DNSDisableCompression(b bool) {
for _, srv := range a.dnsServers {
srv.disableCompression.Store(b)
}
}
func (a *TestAgent) consulConfig() *consul.Config { func (a *TestAgent) consulConfig() *consul.Config {
c, err := a.Agent.consulConfig() c, err := a.Agent.consulConfig()
if err != nil { if err != nil {

Loading…
Cancel
Save