Browse Source

snap: refactoring

Xiang Li 11 years ago
parent
commit
f891199ab0
1 changed files with 36 additions and 26 deletions
  1. 36 26
      snap/snapshotter.go

+ 36 - 26
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 err = serializedSnap.Unmarshal(b); err != nil {
-			log.Printf("Corrupted snapshot file %v: %v", name, err)
-			renameBroken(fpath)
-			continue
+		if snap, err = loadSnap(s.dir, name); err == nil {
+			break
 		}
-		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)
+	}
+	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)
-			continue
 		}
-		break
-	}
+	}()
+
+	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