in swim/ping_request_handler.go [32:76]
func handlePingRequest(node *Node, req *pingRequest) (*pingResponse, error) {
if !node.Ready() {
node.EmitEvent(RequestBeforeReadyEvent{PingReqEndpoint})
return nil, ErrNodeNotReady
}
node.EmitEvent(PingRequestReceiveEvent{
Local: node.Address(),
Source: req.Source,
Target: req.Target,
Changes: req.Changes,
})
node.serverRate.Mark(1)
node.totalRate.Mark(1)
node.memberlist.Update(req.Changes)
pingStartTime := time.Now()
res, err := sendPing(node, req.Target, node.pingTimeout)
pingOk := err == nil
if pingOk {
node.EmitEvent(PingRequestPingEvent{
Local: node.Address(),
Source: req.Source,
Target: req.Target,
Duration: time.Now().Sub(pingStartTime),
})
node.memberlist.Update(res.Changes)
}
changes, _ :=
node.disseminator.IssueAsReceiver(req.Source, req.SourceIncarnation, req.Checksum)
// ignore full sync
return &pingResponse{
Target: req.Target,
Ok: pingOk,
Changes: changes,
}, nil
}