storage.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package etcdserver
  2. import (
  3. "github.com/coreos/etcd/raft/raftpb"
  4. "github.com/coreos/etcd/snap"
  5. "github.com/coreos/etcd/wal"
  6. )
  7. type Storage interface {
  8. // Save function saves ents and state to the underlying stable storage.
  9. // Save MUST block until st and ents are on stable storage.
  10. Save(st raftpb.HardState, ents []raftpb.Entry) error
  11. // SaveSnap function saves snapshot to the underlying stable storage.
  12. SaveSnap(snap raftpb.Snapshot) error
  13. // TODO: WAL should be able to control cut itself. After implement self-controlled cut,
  14. // remove it in this interface.
  15. // Cut cuts out a new wal file for saving new state and entries.
  16. Cut() error
  17. // Close closes the Storage and performs finalization.
  18. Close() error
  19. }
  20. type storage struct {
  21. *wal.WAL
  22. *snap.Snapshotter
  23. }
  24. func NewStorage(w *wal.WAL, s *snap.Snapshotter) Storage {
  25. return &storage{w, s}
  26. }
  27. // SaveSnap saves the snapshot to disk and release the locked
  28. // wal files since they will not be used.
  29. func (st *storage) SaveSnap(snap raftpb.Snapshot) error {
  30. err := st.Snapshotter.SaveSnap(snap)
  31. if err != nil {
  32. return err
  33. }
  34. err = st.WAL.ReleaseLockTo(snap.Metadata.Index)
  35. if err != nil {
  36. return err
  37. }
  38. return nil
  39. }