From f69791679301bb2bfce2287bba6b44e191b7ea84 Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Tue, 14 Apr 2015 09:43:58 -0700 Subject: [PATCH] snap: load should only return ErrNoSnapshot If there is no available snapshot, load should return ErrNoSnapshot. etcdserver might recover from that error if it still have complete WAL files. --- snap/snapshotter.go | 5 ++++- snap/snapshotter_test.go | 31 ++++++++++++++++++++++++++----- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/snap/snapshotter.go b/snap/snapshotter.go index 167156d27..ab33c5595 100644 --- a/snap/snapshotter.go +++ b/snap/snapshotter.go @@ -89,7 +89,10 @@ func (s *Snapshotter) Load() (*raftpb.Snapshot, error) { break } } - return snap, err + if err != nil { + return nil, ErrNoSnapshot + } + return snap, nil } func loadSnap(dir, name string) (*raftpb.Snapshot, error) { diff --git a/snap/snapshotter_test.go b/snap/snapshotter_test.go index af4dd55f2..1635a7b63 100644 --- a/snap/snapshotter_test.go +++ b/snap/snapshotter_test.go @@ -76,7 +76,7 @@ func TestBadCRC(t *testing.T) { // fake a crc mismatch crcTable = crc32.MakeTable(crc32.Koopman) - _, err = ss.Load() + _, err = Read(path.Join(dir, fmt.Sprintf("%016x-%016x.snap", 1, 1))) if err == nil || err != ErrCRCMismatch { t.Errorf("err = %v, want %v", err, ErrCRCMismatch) } @@ -182,7 +182,7 @@ func TestNoSnapshot(t *testing.T) { defer os.RemoveAll(dir) ss := New(dir) _, err = ss.Load() - if err == nil || err != ErrNoSnapshot { + if err != ErrNoSnapshot { t.Errorf("err = %v, want %v", err, ErrNoSnapshot) } } @@ -195,14 +195,35 @@ func TestEmptySnapshot(t *testing.T) { } defer os.RemoveAll(dir) - err = ioutil.WriteFile(path.Join(dir, "1.snap"), []byte("shit"), 0x700) + err = ioutil.WriteFile(path.Join(dir, "1.snap"), []byte(""), 0x700) + if err != nil { + t.Fatal(err) + } + + _, err = Read(path.Join(dir, "1.snap")) + if err != ErrEmptySnapshot { + t.Errorf("err = %v, want %v", err, ErrEmptySnapshot) + } +} + +// TestAllSnapshotBroken ensures snapshotter returens +// ErrNoSnapshot if all the snapshots are broken. +func TestAllSnapshotBroken(t *testing.T) { + dir := path.Join(os.TempDir(), "snapshot") + err := os.Mkdir(dir, 0700) + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(dir) + + err = ioutil.WriteFile(path.Join(dir, "1.snap"), []byte("bad"), 0x700) if err != nil { t.Fatal(err) } ss := New(dir) _, err = ss.Load() - if err == nil || err != ErrEmptySnapshot { - t.Errorf("err = %v, want %v", err, ErrEmptySnapshot) + if err != ErrNoSnapshot { + t.Errorf("err = %v, want %v", err, ErrNoSnapshot) } }