etcdctl/backup_command: handle datadir with missed snapshot mark

This helps to recover from the data dir created in v2.0.0-rc1.
This commit is contained in:
Yicheng Qin
2015-01-29 11:38:52 -08:00
parent 7840d49ae0
commit e966e565c4
2 changed files with 11 additions and 5 deletions

View File

@ -15,6 +15,7 @@
package command package command
import ( import (
"fmt"
"log" "log"
"os" "os"
"path" "path"
@ -71,7 +72,12 @@ func handleBackup(c *cli.Context) {
} }
defer w.Close() defer w.Close()
wmetadata, state, ents, err := w.ReadAll() wmetadata, state, ents, err := w.ReadAll()
if err != nil { switch err {
case nil:
case wal.ErrSnapshotNotFound:
fmt.Printf("Failed to find the match snapshot record %+v in wal %v.", walsnap, srcWAL)
fmt.Printf("etcdctl will add it back. Start auto fixing...")
default:
log.Fatal(err) log.Fatal(err)
} }
var metadata etcdserverpb.Metadata var metadata etcdserverpb.Metadata

View File

@ -203,7 +203,7 @@ func openAtIndex(dirpath string, snap walpb.Snapshot, all bool) (*WAL, error) {
// ReadAll reads out all records of the current WAL. // ReadAll reads out all records of the current WAL.
// If it cannot read out the expected snap, it will return ErrSnapshotNotFound. // If it cannot read out the expected snap, it will return ErrSnapshotNotFound.
// If loaded snap doesn't match with the expected one, it will return // If loaded snap doesn't match with the expected one, it will return
// ErrSnapshotMismatch. // all the records and error ErrSnapshotMismatch.
// TODO: detect not-last-snap error. // TODO: detect not-last-snap error.
// TODO: maybe loose the checking of match. // TODO: maybe loose the checking of match.
// After ReadAll, the WAL will be ready for appending new records. // After ReadAll, the WAL will be ready for appending new records.
@ -256,9 +256,9 @@ func (w *WAL) ReadAll() (metadata []byte, state raftpb.HardState, ents []raftpb.
state.Reset() state.Reset()
return nil, state, nil, err return nil, state, nil, err
} }
err = nil
if !match { if !match {
state.Reset() err = ErrSnapshotNotFound
return nil, state, nil, ErrSnapshotNotFound
} }
// close decoder, disable reading // close decoder, disable reading
@ -269,7 +269,7 @@ func (w *WAL) ReadAll() (metadata []byte, state raftpb.HardState, ents []raftpb.
// create encoder (chain crc with the decoder), enable appending // create encoder (chain crc with the decoder), enable appending
w.encoder = newEncoder(w.f, w.decoder.lastCRC()) w.encoder = newEncoder(w.f, w.decoder.lastCRC())
w.decoder = nil w.decoder = nil
return metadata, state, ents, nil return metadata, state, ents, err
} }
// Cut closes current file written and creates a new one ready to append. // Cut closes current file written and creates a new one ready to append.