Merge pull request #1894 from xiang90/fix_snap

snap: error on empty snapshot
This commit is contained in:
Xiang Li 2014-12-08 22:02:19 -08:00
commit 20e2c8f431
2 changed files with 31 additions and 5 deletions

View File

@ -38,9 +38,10 @@ const (
)
var (
ErrNoSnapshot = errors.New("snap: no available snapshot")
ErrCRCMismatch = errors.New("snap: crc mismatch")
crcTable = crc32.MakeTable(crc32.Castagnoli)
ErrNoSnapshot = errors.New("snap: no available snapshot")
ErrEmptySnapshot = errors.New("snap: empty snapshot")
ErrCRCMismatch = errors.New("snap: crc mismatch")
crcTable = crc32.MakeTable(crc32.Castagnoli)
)
type Snapshotter struct {
@ -108,11 +109,16 @@ func loadSnap(dir, name string) (*raftpb.Snapshot, error) {
log.Printf("snap: corrupted snapshot file %v: %v", name, err)
return nil, err
}
if len(serializedSnap.Data) == 0 || serializedSnap.Crc == 0 {
log.Printf("snap: unexpected empty snapshot")
return nil, ErrEmptySnapshot
}
crc := crc32.Update(0, crcTable, serializedSnap.Data)
if crc != serializedSnap.Crc {
log.Printf("snap: corrupted snapshot file %v: crc mismatch", name)
err = ErrCRCMismatch
return nil, err
return nil, ErrCRCMismatch
}
var snap raftpb.Snapshot

View File

@ -188,3 +188,23 @@ func TestNoSnapshot(t *testing.T) {
t.Errorf("err = %v, want %v", err, ErrNoSnapshot)
}
}
func TestEmptySnapshot(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("shit"), 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)
}
}