Moves DNS over to new shuffle and filter functions.
This commit is contained in:
parent
781f9611e8
commit
a33e35fcce
|
@ -4,7 +4,6 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"math/rand"
|
|
||||||
"net"
|
"net"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
@ -499,7 +498,7 @@ RPC:
|
||||||
}
|
}
|
||||||
|
|
||||||
// Filter out any service nodes due to health checks
|
// Filter out any service nodes due to health checks
|
||||||
out.Nodes = d.filterServiceNodes(out.Nodes)
|
out.Nodes = out.Nodes.Filter(d.config.OnlyPassing)
|
||||||
|
|
||||||
// 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 {
|
||||||
|
@ -509,7 +508,7 @@ RPC:
|
||||||
}
|
}
|
||||||
|
|
||||||
// Perform a random shuffle
|
// Perform a random shuffle
|
||||||
shuffleServiceNodes(out.Nodes)
|
out.Nodes.Shuffle()
|
||||||
|
|
||||||
// Add various responses depending on the request
|
// Add various responses depending on the request
|
||||||
qType := req.Question[0].Qtype
|
qType := req.Question[0].Qtype
|
||||||
|
@ -536,36 +535,6 @@ RPC:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// filterServiceNodes is used to filter out nodes that are failing
|
|
||||||
// health checks to prevent routing to unhealthy nodes
|
|
||||||
func (d *DNSServer) filterServiceNodes(nodes structs.CheckServiceNodes) structs.CheckServiceNodes {
|
|
||||||
n := len(nodes)
|
|
||||||
OUTER:
|
|
||||||
for i := 0; i < n; i++ {
|
|
||||||
node := nodes[i]
|
|
||||||
for _, check := range node.Checks {
|
|
||||||
if check.Status == structs.HealthCritical ||
|
|
||||||
(d.config.OnlyPassing && check.Status != structs.HealthPassing) {
|
|
||||||
d.logger.Printf("[WARN] dns: node '%s' failing health check '%s: %s', dropping from service '%s'",
|
|
||||||
node.Node.Node, check.CheckID, check.Name, node.Service.Service)
|
|
||||||
nodes[i], nodes[n-1] = nodes[n-1], structs.CheckServiceNode{}
|
|
||||||
n--
|
|
||||||
i--
|
|
||||||
continue OUTER
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nodes[:n]
|
|
||||||
}
|
|
||||||
|
|
||||||
// shuffleServiceNodes does an in-place random shuffle using the Fisher-Yates algorithm
|
|
||||||
func shuffleServiceNodes(nodes structs.CheckServiceNodes) {
|
|
||||||
for i := len(nodes) - 1; i > 0; i-- {
|
|
||||||
j := rand.Int31() % int32(i+1)
|
|
||||||
nodes[i], nodes[j] = nodes[j], nodes[i]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// serviceNodeRecords is used to add the node records for a service lookup
|
// serviceNodeRecords is used to add the node records for a service lookup
|
||||||
func (d *DNSServer) serviceNodeRecords(nodes structs.CheckServiceNodes, req, resp *dns.Msg, ttl time.Duration) {
|
func (d *DNSServer) serviceNodeRecords(nodes structs.CheckServiceNodes, req, resp *dns.Msg, ttl time.Duration) {
|
||||||
qName := req.Question[0].Name
|
qName := req.Question[0].Name
|
||||||
|
|
Loading…
Reference in New Issue