From aff5b754873a4c097fd314f86c5a1c6e723d1657 Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Tue, 19 Aug 2014 21:08:29 -0700 Subject: [PATCH] snap: separate Load to Load and snapNames --- snap/snapshotter.go | 31 ++++++++++++++++++++----------- snap/snapshotter_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/snap/snapshotter.go b/snap/snapshotter.go index 782b17f21..17006e522 100644 --- a/snap/snapshotter.go +++ b/snap/snapshotter.go @@ -47,20 +47,10 @@ func (s *Snapshotter) Save(snapshot *raft.Snapshot) error { } func (s *Snapshotter) Load() (*raft.Snapshot, error) { - dir, err := os.Open(s.dir) + names, err := s.snapNames() if err != nil { return nil, err } - defer dir.Close() - names, err := dir.Readdirnames(-1) - if err != nil { - return nil, err - } - if len(names) == 0 { - return nil, ErrNoSnapshot - } - sort.Sort(sort.Reverse(sort.StringSlice(names))) - var snap raft.Snapshot var serializedSnap Snapshot var b []byte @@ -91,3 +81,22 @@ func (s *Snapshotter) Load() (*raft.Snapshot, error) { } return &snap, nil } + +// snapNames returns the filename of the snapshots in logical time order (from newest to oldest). +// If there is no avaliable snapshots, an ErrNoSnapshot will be returned. +func (s *Snapshotter) snapNames() ([]string, error) { + dir, err := os.Open(s.dir) + if err != nil { + return nil, err + } + defer dir.Close() + names, err := dir.Readdirnames(-1) + if err != nil { + return nil, err + } + if len(names) == 0 { + return nil, ErrNoSnapshot + } + sort.Sort(sort.Reverse(sort.StringSlice(names))) + return names, nil +} diff --git a/snap/snapshotter_test.go b/snap/snapshotter_test.go index 4e43e25b3..dfbdad117 100644 --- a/snap/snapshotter_test.go +++ b/snap/snapshotter_test.go @@ -85,6 +85,31 @@ func TestFailback(t *testing.T) { } } +func TestSnapNames(t *testing.T) { + dir := path.Join(os.TempDir(), "snapshot") + os.Mkdir(dir, 0700) + defer os.RemoveAll(dir) + for i := 1; i <= 5; i++ { + if f, err := os.Create(path.Join(dir, fmt.Sprintf("%d", i))); err != nil { + t.Fatal(err) + } else { + f.Close() + } + } + ss := New(dir) + names, err := ss.snapNames() + if err != nil { + t.Errorf("err = %v, want nil", err) + } + if len(names) != 5 { + t.Errorf("len = %d, want 10", len(names)) + } + w := []string{"5", "4", "3", "2", "1"} + if !reflect.DeepEqual(names, w) { + t.Errorf("names = %v, want %v", names, w) + } +} + func TestLoadNewestSnap(t *testing.T) { dir := path.Join(os.TempDir(), "snapshot") os.Mkdir(dir, 0700)