dns: split node lookup from request handling
This commit is contained in:
parent
db8ad8922e
commit
8e1f9b9b68
25
agent/dns.go
25
agent/dns.go
|
@ -679,9 +679,8 @@ func trimUDPResponse(config *DNSConfig, req, resp *dns.Msg) (trimmed bool) {
|
||||||
return len(resp.Answer) < numAnswers
|
return len(resp.Answer) < numAnswers
|
||||||
}
|
}
|
||||||
|
|
||||||
// serviceLookup is used to handle a service query
|
// lookupServiceNodes returns nodes with a given service.
|
||||||
func (d *DNSServer) serviceLookup(network, datacenter, service, tag string, req, resp *dns.Msg) {
|
func (d *DNSServer) lookupServiceNodes(datacenter, service, tag string) (structs.IndexedCheckServiceNodes, error) {
|
||||||
// Make an RPC request
|
|
||||||
args := structs.ServiceSpecificRequest{
|
args := structs.ServiceSpecificRequest{
|
||||||
Datacenter: datacenter,
|
Datacenter: datacenter,
|
||||||
ServiceName: service,
|
ServiceName: service,
|
||||||
|
@ -695,9 +694,7 @@ func (d *DNSServer) serviceLookup(network, datacenter, service, tag string, req,
|
||||||
|
|
||||||
var out structs.IndexedCheckServiceNodes
|
var out structs.IndexedCheckServiceNodes
|
||||||
if err := d.agent.RPC("Health.ServiceNodes", &args, &out); err != nil {
|
if err := d.agent.RPC("Health.ServiceNodes", &args, &out); err != nil {
|
||||||
d.logger.Printf("[ERR] dns: rpc error: %v", err)
|
return structs.IndexedCheckServiceNodes{}, err
|
||||||
resp.SetRcode(req, dns.RcodeServerFailure)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if args.AllowStale && out.LastContact > staleCounterThreshold {
|
if args.AllowStale && out.LastContact > staleCounterThreshold {
|
||||||
|
@ -710,15 +707,25 @@ func (d *DNSServer) serviceLookup(network, datacenter, service, tag string, req,
|
||||||
d.logger.Printf("[WARN] dns: Query results too stale, re-requesting")
|
d.logger.Printf("[WARN] dns: Query results too stale, re-requesting")
|
||||||
|
|
||||||
if err := d.agent.RPC("Health.ServiceNodes", &args, &out); err != nil {
|
if err := d.agent.RPC("Health.ServiceNodes", &args, &out); err != nil {
|
||||||
d.logger.Printf("[ERR] dns: rpc error: %v", err)
|
return structs.IndexedCheckServiceNodes{}, err
|
||||||
resp.SetRcode(req, dns.RcodeServerFailure)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Filter out any service nodes due to health checks
|
// Filter out any service nodes due to health checks
|
||||||
out.Nodes = out.Nodes.Filter(d.config.OnlyPassing)
|
out.Nodes = out.Nodes.Filter(d.config.OnlyPassing)
|
||||||
|
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// serviceLookup is used to handle a service query
|
||||||
|
func (d *DNSServer) serviceLookup(network, datacenter, service, tag string, req, resp *dns.Msg) {
|
||||||
|
out, err := d.lookupServiceNodes(datacenter, service, tag)
|
||||||
|
if err != nil {
|
||||||
|
d.logger.Printf("[ERR] dns: rpc error: %v", err)
|
||||||
|
resp.SetRcode(req, dns.RcodeServerFailure)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// If we have no nodes, return not found!
|
// If we have no nodes, return not found!
|
||||||
if len(out.Nodes) == 0 {
|
if len(out.Nodes) == 0 {
|
||||||
d.addSOA(resp)
|
d.addSOA(resp)
|
||||||
|
|
Loading…
Reference in New Issue