// Start starts the raft server. // The function assumes that join has been accepted successfully. func (s *PeerServer) Start(snapshot bool, discoverURL string, peers []string) error { s.Lock() defer s.Unlock() if s.started { return nil } s.started = true // LoadSnapshot if snapshot { err := s.raftServer.LoadSnapshot() if err == nil { log.Debugf("%s finished load snapshot", s.Config.Name) } else { log.Debug(err) } } s.raftServer.Init() // Set NOCOW for data directory in btrfs if btrfs.IsBtrfs(s.raftServer.LogPath()) { if err := btrfs.SetNOCOWFile(s.raftServer.LogPath()); err != nil { log.Warnf("Failed setting NOCOW: %v", err) } } s.findCluster(discoverURL, peers) s.stopNotify = make(chan bool) s.removeNotify = make(chan bool) s.closeChan = make(chan bool) s.startRoutine(s.monitorSync) s.startRoutine(s.monitorTimeoutThreshold) s.startRoutine(s.monitorActiveSize) s.startRoutine(s.monitorPeerActivity) // open the snapshot if snapshot { s.startRoutine(s.monitorSnapshot) } return nil }
func (s *PeerServer) SetRaftServer(raftServer raft.Server, snapshot bool) { s.snapConf = &snapshotConf{ checkingInterval: time.Second * 3, // this is not accurate, we will update raft to provide an api lastIndex: raftServer.CommitIndex(), snapshotThr: uint64(s.Config.SnapshotCount), } raftServer.AddEventListener(raft.StateChangeEventType, s.raftEventLogger) raftServer.AddEventListener(raft.LeaderChangeEventType, s.raftEventLogger) raftServer.AddEventListener(raft.TermChangeEventType, s.raftEventLogger) raftServer.AddEventListener(raft.AddPeerEventType, s.raftEventLogger) raftServer.AddEventListener(raft.RemovePeerEventType, s.raftEventLogger) raftServer.AddEventListener(raft.HeartbeatIntervalEventType, s.raftEventLogger) raftServer.AddEventListener(raft.ElectionTimeoutThresholdEventType, s.raftEventLogger) raftServer.AddEventListener(raft.HeartbeatEventType, s.recordMetricEvent) raftServer.AddEventListener(raft.RemovedEventType, s.removedEvent) s.raftServer = raftServer s.removedInLog = false // LoadSnapshot if snapshot { err := s.raftServer.LoadSnapshot() if err == nil { log.Debugf("%s finished load snapshot", s.Config.Name) } else { log.Debug(err) } } s.raftServer.Init() // Set NOCOW for data directory in btrfs if btrfs.IsBtrfs(s.raftServer.LogPath()) { if err := btrfs.SetNOCOWFile(s.raftServer.LogPath()); err != nil { log.Warnf("Failed setting NOCOW: %v", err) } } }