func (s *stateTransitions) ScheduleSuspectToFaulty(subject subject) {
	s.Lock()
	s.schedule(subject, Suspect, s.timeouts.Suspect, func() {
		s.node.memberlist.MakeFaulty(subject.address(), subject.incarnation())
	})
	s.Unlock()
}
ScheduleSuspectToFaulty starts the suspect timer. After the Suspect timeout the node will be declared faulty
package swim
import (
	"sync"
	"time"
	"github.com/benbjohnson/clock"
	"github.com/uber-common/bark"
	"github.com/uber/ringpop-go/logging"
	"github.com/uber/ringpop-go/util"
)
type subject interface {
	address() string
	incarnation() int64
}
type transitionTimer struct {
	*clock.Timer
	state string
}
type stateTransitions struct {
	sync.Mutex
	node     *Node
	timeouts StateTimeouts
	timers   map[string]*transitionTimer
	enabled  bool
	logger bark.Logger
}
type StateTimeouts struct {
	Suspect time.Duration
	Faulty time.Duration
	Tombstone time.Duration
}
func mergeStateTimeouts(one StateTimeouts, two StateTimeouts) StateTimeouts {
	return StateTimeouts{
		Suspect:   util.SelectDuration(one.Suspect, two.Suspect),
		Faulty:    util.SelectDuration(one.Faulty, two.Faulty),
		Tombstone: util.SelectDuration(one.Tombstone, two.Tombstone),
	}
}
func newStateTransitions(n *Node, timeouts StateTimeouts) *stateTransitions {
	return &stateTransitions{
		node:     n,
		timeouts: timeouts,
		timers:   make(map[string]*transitionTimer),
		enabled:  true,
		logger:   logging.Logger("stateTransitions").WithField("local", n.Address()),
	}
}