You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

fsm.go 999 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package cluster
  2. import (
  3. "fmt"
  4. "io"
  5. "sync"
  6. "github.com/hashicorp/raft"
  7. "gitlink.org.cn/cloudream/common/utils/io2"
  8. )
  9. type FSM struct {
  10. data string
  11. lock sync.Mutex
  12. }
  13. func NewFSM() *FSM {
  14. return &FSM{data: ""}
  15. }
  16. func (f *FSM) Apply(l *raft.Log) interface{} {
  17. fmt.Printf("log: %v\n", string(l.Data))
  18. f.lock.Lock()
  19. defer f.lock.Unlock()
  20. f.data = f.data + "\n" + string(l.Data)
  21. return nil
  22. }
  23. func (f *FSM) Snapshot() (raft.FSMSnapshot, error) {
  24. f.lock.Lock()
  25. defer f.lock.Unlock()
  26. return &Snapshot{data: f.data}, nil
  27. }
  28. func (f *FSM) Restore(rc io.ReadCloser) error {
  29. data, err := io.ReadAll(rc)
  30. if err != nil {
  31. return err
  32. }
  33. f.lock.Lock()
  34. defer f.lock.Unlock()
  35. f.data = string(data)
  36. return nil
  37. }
  38. var _ raft.FSM = (*FSM)(nil)
  39. type Snapshot struct {
  40. data string
  41. }
  42. func (s *Snapshot) Persist(sink raft.SnapshotSink) error {
  43. err := io2.WriteAll(sink, []byte(s.data))
  44. if err != nil {
  45. return sink.Cancel()
  46. }
  47. return sink.Close()
  48. }
  49. func (s *Snapshot) Release() {
  50. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。