// Read reads the snapshot named by snapname and returns the snapshot. func Read(snapname string) (*raftpb.Snapshot, error) { b, err := ioutil.ReadFile(snapname) if err != nil { log.Printf("snap: snapshotter cannot read file %v: %v", snapname, err) return nil, err } var serializedSnap snappb.Snapshot if err = serializedSnap.Unmarshal(b); err != nil { log.Printf("snap: corrupted snapshot file %v: %v", snapname, 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", snapname) return nil, ErrCRCMismatch } var snap raftpb.Snapshot if err = snap.Unmarshal(serializedSnap.Data); err != nil { log.Printf("snap: corrupted snapshot file %v: %v", snapname, err) return nil, err } return &snap, nil }
func loadSnap(dir, name string) (*raftpb.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("snap: snapshotter cannot read file %v: %v", name, err) return nil, err } var serializedSnap snappb.Snapshot if err = serializedSnap.Unmarshal(b); err != nil { 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) return nil, ErrCRCMismatch } var snap raftpb.Snapshot if err = snap.Unmarshal(serializedSnap.Data); err != nil { log.Printf("snap: corrupted snapshot file %v: %v", name, err) return nil, err } return &snap, nil }