in swim/join_sender.go [439:478]
func sendJoinRequest(node *Node, target string, timeout time.Duration) (*joinResponse, error) {
ctx, cancel := shared.NewTChannelContext(timeout)
defer cancel()
peer := node.channel.Peers().GetOrAdd(target)
req := joinRequest{
App: node.app,
Source: node.address,
Incarnation: node.Incarnation(),
Timeout: timeout,
Labels: node.Labels().AsMap(),
}
res := &joinResponse{}
// make request
errC := make(chan error, 1)
go func() {
errC <- json.CallPeer(ctx, peer, node.service, "/protocol/join", req, res)
}()
// wait for result or timeout
var err error
select {
case err = <-errC:
case <-ctx.Done():
err = errJoinTimeout
}
if err != nil {
logging.Logger("join").WithFields(log.Fields{
"local": node.Address(),
"error": err,
}).Debug("could not complete join")
return nil, err
}
return res, err
}