func handlePingRequest()

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
}