diff --git a/etcdserver/storage.go b/etcdserver/storage.go index 6f278d387..998d4a399 100644 --- a/etcdserver/storage.go +++ b/etcdserver/storage.go @@ -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 }