package cluster import ( "fmt" "io" "sync" "github.com/hashicorp/raft" "gitlink.org.cn/cloudream/common/utils/io2" ) type FSM struct { data string lock sync.Mutex } func NewFSM() *FSM { return &FSM{data: ""} } func (f *FSM) Apply(l *raft.Log) interface{} { fmt.Printf("log: %v\n", string(l.Data)) f.lock.Lock() defer f.lock.Unlock() f.data = f.data + "\n" + string(l.Data) return nil } func (f *FSM) Snapshot() (raft.FSMSnapshot, error) { f.lock.Lock() defer f.lock.Unlock() return &Snapshot{data: f.data}, nil } func (f *FSM) Restore(rc io.ReadCloser) error { data, err := io.ReadAll(rc) if err != nil { return err } f.lock.Lock() defer f.lock.Unlock() f.data = string(data) return nil } var _ raft.FSM = (*FSM)(nil) type Snapshot struct { data string } func (s *Snapshot) Persist(sink raft.SnapshotSink) error { err := io2.WriteAll(sink, []byte(s.data)) if err != nil { return sink.Cancel() } return sink.Close() } func (s *Snapshot) Release() { }