in swim/node.go [511:554]
func (n *Node) pingNextMember() {
member, ok := n.memberiter.Next()
if !ok {
n.logger.Warn("no pingable members")
return
}
if n.pinging() {
n.logger.Warn("node already pinging")
return
}
n.setPinging(true)
defer n.setPinging(false)
// send ping
res, err := sendPing(n, member.Address, n.pingTimeout)
if err == nil {
n.memberlist.Update(res.Changes)
return
}
// ping failed, send ping requests
target := member.Address
targetReached, errs := indirectPing(n, target, n.pingRequestSize, n.pingRequestTimeout)
// if all helper nodes are unreachable, the indirectPing is inconclusive
if len(errs) == n.pingRequestSize {
n.logger.WithFields(log.Fields{
"target": target,
"errors": errs,
"numErrors": len(errs),
}).Warn("ping request inconclusive due to errors")
return
}
if !targetReached {
n.logger.WithField("target", target).Info("ping request target unreachable")
n.memberlist.MakeSuspect(member.Address, member.Incarnation)
return
}
n.logger.WithField("target", target).Info("ping request target reachable")
}