func()

in ringpop.go [174:220]


func (rp *Ringpop) init() error {
	if rp.channel == nil {
		return errors.New("Missing channel")
	}

	address, err := rp.address()
	if err != nil {
		return err
	}

	// early initialization of statter before registering listeners that might
	// fire and try to stat
	rp.stats.hostport = genStatsHostport(address)
	rp.stats.prefix = fmt.Sprintf("ringpop.%s", rp.stats.hostport)
	rp.stats.keys = make(map[string]string)

	rp.subChannel = rp.channel.GetSubChannel("ringpop", tchannel.Isolated)
	rp.registerHandlers()

	if rp.node == nil {
		rp.node = swim.NewNode(rp.config.App, address, rp.subChannel, &swim.Options{
			StateTimeouts:     rp.config.StateTimeouts,
			Clock:             rp.clock,
			LabelLimits:       rp.config.LabelLimits,
			InitialLabels:     rp.config.InitialLabels,
			SelfEvict:         rp.config.SelfEvict,
			RequiresAppInPing: rp.config.RequiresAppInPing,
		})
	}
	rp.node.AddListener(rp)

	rp.ring = hashring.New(farm.Fingerprint32, rp.configHashRing.ReplicaPoints)
	rp.ring.AddListener(rp)

	// add all members present in the membership of the node on startup.
	for _, member := range rp.node.GetReachableMembers() {
		rp.ring.AddMembers(member)
	}

	rp.forwarder = forward.NewForwarder(rp, rp.subChannel)
	rp.forwarder.AddListener(rp)

	rp.startTimers()
	rp.setState(initialized)

	return nil
}