From f891199ab074cb9e7019459bde1fcfcb998a33c2 Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Wed, 20 Aug 2014 13:42:23 -0700 Subject: [PATCH] snap: refactoring --- snap/snapshotter.go | 64 ++++++++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 27 deletions(-) diff --git a/snap/snapshotter.go b/snap/snapshotter.go index 3ff099989..693191be5 100644 --- a/snap/snapshotter.go +++ b/snap/snapshotter.go @@ -56,37 +56,47 @@ func (s *Snapshotter) Load() (*raft.Snapshot, error) { if err != nil { return nil, err } - var snap raft.Snapshot - var serializedSnap Snapshot - var b []byte + var snap *raft.Snapshot for _, name := range names { - fpath := path.Join(s.dir, name) - b, err = ioutil.ReadFile(fpath) - if err != nil { - log.Printf("Snapshotter cannot read file %v: %v", name, err) - renameBroken(fpath) - continue + if snap, err = loadSnap(s.dir, name); err == nil { + break } - if err = serializedSnap.Unmarshal(b); err != nil { - log.Printf("Corrupted snapshot file %v: %v", name, err) - renameBroken(fpath) - continue - } - crc := crc32.Update(0, crcTable, serializedSnap.Data) - if crc != serializedSnap.Crc { - log.Printf("Corrupted snapshot file %v: crc mismatch", name) - renameBroken(fpath) - err = ErrCRCMismatch - continue - } - if err = json.Unmarshal(serializedSnap.Data, &snap); err != nil { - log.Printf("Corrupted snapshot file %v: %v", name, err) - renameBroken(fpath) - continue - } - break } + return snap, err +} + +func loadSnap(dir, name string) (*raft.Snapshot, error) { + var err error + var b []byte + + fpath := path.Join(dir, name) + defer func() { + if err != nil { + renameBroken(fpath) + } + }() + + b, err = ioutil.ReadFile(fpath) if err != nil { + log.Printf("Snapshotter cannot read file %v: %v", name, err) + return nil, err + } + + var serializedSnap Snapshot + if err = serializedSnap.Unmarshal(b); err != nil { + log.Printf("Corrupted snapshot file %v: %v", name, err) + return nil, err + } + crc := crc32.Update(0, crcTable, serializedSnap.Data) + if crc != serializedSnap.Crc { + log.Printf("Corrupted snapshot file %v: crc mismatch", name) + err = ErrCRCMismatch + return nil, err + } + + var snap raft.Snapshot + if err = json.Unmarshal(serializedSnap.Data, &snap); err != nil { + log.Printf("Corrupted snapshot file %v: %v", name, err) return nil, err } return &snap, nil