1
0
Fork 0

Avoid race when setting Node error

master
Philip O'Toole 10 months ago
parent d75f579c57
commit fe6fe06294

@ -24,6 +24,8 @@ type Node struct {
Leader bool `json:"leader"` Leader bool `json:"leader"`
Time float64 `json:"time,omitempty"` Time float64 `json:"time,omitempty"`
Error string `json:"error,omitempty"` Error string `json:"error,omitempty"`
mu sync.Mutex
} }
// NewNodeFromServer creates a Node from a Server. // NewNodeFromServer creates a Node from a Server.
@ -50,7 +52,7 @@ func (n *Node) Test(ga GetAddresser, leaderAddr string, timeout time.Duration) {
defer close(done) defer close(done)
apiAddr, err := ga.GetNodeAPIAddr(n.Addr, timeout) apiAddr, err := ga.GetNodeAPIAddr(n.Addr, timeout)
if err != nil { if err != nil {
n.Error = err.Error() n.SetError(err.Error())
return return
} }
n.APIAddr = apiAddr n.APIAddr = apiAddr
@ -60,11 +62,18 @@ func (n *Node) Test(ga GetAddresser, leaderAddr string, timeout time.Duration) {
select { select {
case <-timer.C: case <-timer.C:
n.Error = "timeout" n.SetError("timeout waiting for node to respond")
case <-done: case <-done:
} }
} }
// SetError sets the Error field of the Node in a synchronized manner.
func (n *Node) SetError(err string) {
n.mu.Lock()
defer n.mu.Unlock()
n.Error = err
}
type Nodes []*Node type Nodes []*Node
func (n Nodes) Len() int { return len(n) } func (n Nodes) Len() int { return len(n) }

Loading…
Cancel
Save