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:
@ -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
|
||||||
|
@ -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.
|
||||||
|
Reference in New Issue
Block a user