storage.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package etcdserver
  2. import (
  3. "log"
  4. "github.com/coreos/etcd/migrate"
  5. "github.com/coreos/etcd/raft/raftpb"
  6. "github.com/coreos/etcd/snap"
  7. "github.com/coreos/etcd/wal"
  8. )
  9. type Storage interface {
  10. // Save function saves ents and state to the underlying stable storage.
  11. // Save MUST block until st and ents are on stable storage.
  12. Save(st raftpb.HardState, ents []raftpb.Entry) error
  13. // SaveSnap function saves snapshot to the underlying stable storage.
  14. SaveSnap(snap raftpb.Snapshot) error
  15. // TODO: WAL should be able to control cut itself. After implement self-controlled cut,
  16. // remove it in this interface.
  17. // Cut cuts out a new wal file for saving new state and entries.
  18. Cut() error
  19. // Close closes the Storage and performs finalization.
  20. Close() error
  21. }
  22. type storage struct {
  23. *wal.WAL
  24. *snap.Snapshotter
  25. }
  26. func NewStorage(w *wal.WAL, s *snap.Snapshotter) Storage {
  27. return &storage{w, s}
  28. }
  29. // SaveSnap saves the snapshot to disk and release the locked
  30. // wal files since they will not be used.
  31. func (st *storage) SaveSnap(snap raftpb.Snapshot) error {
  32. err := st.Snapshotter.SaveSnap(snap)
  33. if err != nil {
  34. return err
  35. }
  36. err = st.WAL.ReleaseLockTo(snap.Metadata.Index)
  37. if err != nil {
  38. return err
  39. }
  40. return nil
  41. }
  42. // UpgradeWAL converts an older version of the etcdServer data to the newest version.
  43. // It must ensure that, after upgrading, the most recent version is present.
  44. func UpgradeWAL(cfg *ServerConfig, ver wal.WalVersion) error {
  45. if ver == wal.WALv0_4 {
  46. log.Print("etcdserver: converting v0.4 log to v2.0")
  47. err := migrate.Migrate4To2(cfg.DataDir, cfg.Name)
  48. if err != nil {
  49. log.Fatalf("etcdserver: failed migrating data-dir: %v", err)
  50. return err
  51. }
  52. }
  53. return nil
  54. }