mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
snap: refactoring
This commit is contained in:
parent
f664c02a40
commit
f891199ab0
@ -56,37 +56,47 @@ func (s *Snapshotter) Load() (*raft.Snapshot, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
var snap raft.Snapshot
|
var snap *raft.Snapshot
|
||||||
var serializedSnap Snapshot
|
|
||||||
var b []byte
|
|
||||||
for _, name := range names {
|
for _, name := range names {
|
||||||
fpath := path.Join(s.dir, name)
|
if snap, err = loadSnap(s.dir, name); err == nil {
|
||||||
|
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)
|
b, err = ioutil.ReadFile(fpath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Snapshotter cannot read file %v: %v", name, err)
|
log.Printf("Snapshotter cannot read file %v: %v", name, err)
|
||||||
renameBroken(fpath)
|
return nil, err
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var serializedSnap Snapshot
|
||||||
if err = serializedSnap.Unmarshal(b); err != nil {
|
if err = serializedSnap.Unmarshal(b); err != nil {
|
||||||
log.Printf("Corrupted snapshot file %v: %v", name, err)
|
log.Printf("Corrupted snapshot file %v: %v", name, err)
|
||||||
renameBroken(fpath)
|
return nil, err
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
crc := crc32.Update(0, crcTable, serializedSnap.Data)
|
crc := crc32.Update(0, crcTable, serializedSnap.Data)
|
||||||
if crc != serializedSnap.Crc {
|
if crc != serializedSnap.Crc {
|
||||||
log.Printf("Corrupted snapshot file %v: crc mismatch", name)
|
log.Printf("Corrupted snapshot file %v: crc mismatch", name)
|
||||||
renameBroken(fpath)
|
|
||||||
err = ErrCRCMismatch
|
err = ErrCRCMismatch
|
||||||
continue
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var snap raft.Snapshot
|
||||||
if err = json.Unmarshal(serializedSnap.Data, &snap); err != nil {
|
if err = json.Unmarshal(serializedSnap.Data, &snap); err != nil {
|
||||||
log.Printf("Corrupted snapshot file %v: %v", name, err)
|
log.Printf("Corrupted snapshot file %v: %v", name, err)
|
||||||
renameBroken(fpath)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &snap, nil
|
return &snap, nil
|
||||||
|
Loading…
x
Reference in New Issue
Block a user