in swim/node.go [231:283]
func NewNode(app, address string, channel shared.SubChannel, opts *Options) *Node {
// use defaults for options that are unspecified
opts = mergeDefaultOptions(opts)
node := &Node{
address: address,
app: app,
channel: channel,
logger: logging.Logger("node").WithField("local", address),
joinTimeout: opts.JoinTimeout,
pingTimeout: opts.PingTimeout,
pingRequestTimeout: opts.PingRequestTimeout,
pingRequestSize: opts.PingRequestSize,
maxReverseFullSyncJobs: opts.MaxReverseFullSyncJobs,
clientRate: metrics.NewMeter(),
serverRate: metrics.NewMeter(),
totalRate: metrics.NewMeter(),
clock: opts.Clock,
}
node.selfEvict = newSelfEvict(node, opts.SelfEvict)
node.requiresAppInPing = opts.RequiresAppInPing
node.labelLimits = opts.LabelLimits
node.memberlist = newMemberlist(node, opts.InitialLabels)
node.memberiter = newMemberlistIter(node.memberlist)
node.stateTransitions = newStateTransitions(node, opts.StateTimeouts)
node.healer = newDiscoverProviderHealer(
node,
opts.PartitionHealBaseProbabillity,
opts.PartitionHealPeriod,
)
node.gossip = newGossip(node, opts.MinProtocolPeriod)
node.disseminator = newDisseminator(node)
for _, member := range node.memberlist.GetMembers() {
change := Change{}
change.populateSubject(&member)
node.disseminator.RecordChange(change)
}
if node.channel != nil {
node.registerHandlers()
node.service = node.channel.ServiceName()
}
return node
}