etcdserver: make the wal repairing logic clear

This commit is contained in:
Xiang Li 2015-03-29 21:05:26 -07:00
parent 684ebd95ae
commit 0b9a318e68

View File

@ -78,19 +78,22 @@ func readWAL(waldir string, snap walpb.Snapshot) (w *wal.WAL, id, cid types.ID,
wmetadata []byte
)
for i := 0; i < 2; i++ {
repaired := false
for {
if w, err = wal.Open(waldir, snap); err != nil {
log.Fatalf("etcdserver: open wal error: %v", err)
}
if wmetadata, st, ents, err = w.ReadAll(); err != nil {
w.Close()
if i != 0 || err != io.ErrUnexpectedEOF {
log.Fatalf("etcdserver: read wal error: %v", err)
// we can only repair ErrUnexpectedEOF and we never repair twice.
if repaired || err != io.ErrUnexpectedEOF {
log.Fatalf("etcdserver: read wal error (%v) and cannot be repaired", err)
}
if !wal.Repair(waldir) {
log.Fatalf("etcdserver: WAL error (%v) cannot be repaired", err)
} else {
log.Printf("etcdserver: repaired WAL error (%v)", err)
repaired = true
}
continue
}