|
- 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() {
- }
|