Browse Source

etcdserver: make the wal repairing logic clear

Xiang Li 10 years ago
parent
commit
0b9a318e68
1 changed files with 6 additions and 3 deletions
  1. 6 3
      etcdserver/storage.go

+ 6 - 3
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
 		}