Merge pull request #2283 from xiang90/etcd-dump

etcd dump
This commit is contained in:
Xiang Li 2015-02-11 11:24:05 -08:00
commit 4a0887ef7a
2 changed files with 29 additions and 18 deletions

View File

@ -86,25 +86,25 @@ func (s *Snapshotter) Load() (*raftpb.Snapshot, error) {
} }
func loadSnap(dir, name string) (*raftpb.Snapshot, error) { func loadSnap(dir, name string) (*raftpb.Snapshot, error) {
var err error
var b []byte
fpath := path.Join(dir, name) fpath := path.Join(dir, name)
defer func() { snap, err := Read(fpath)
if err != nil {
renameBroken(fpath)
}
}()
b, err = ioutil.ReadFile(fpath)
if err != nil { if err != nil {
log.Printf("snap: snapshotter cannot read file %v: %v", name, err) renameBroken(fpath)
}
return snap, err
}
// Read reads the snapshot named by snapname and returns the snapshot.
func Read(snapname string) (*raftpb.Snapshot, error) {
b, err := ioutil.ReadFile(snapname)
if err != nil {
log.Printf("snap: snapshotter cannot read file %v: %v", snapname, err)
return nil, err return nil, err
} }
var serializedSnap snappb.Snapshot var serializedSnap snappb.Snapshot
if err = serializedSnap.Unmarshal(b); err != nil { if err = serializedSnap.Unmarshal(b); err != nil {
log.Printf("snap: corrupted snapshot file %v: %v", name, err) log.Printf("snap: corrupted snapshot file %v: %v", snapname, err)
return nil, err return nil, err
} }
@ -115,13 +115,13 @@ func loadSnap(dir, name string) (*raftpb.Snapshot, error) {
crc := crc32.Update(0, crcTable, serializedSnap.Data) crc := crc32.Update(0, crcTable, serializedSnap.Data)
if crc != serializedSnap.Crc { if crc != serializedSnap.Crc {
log.Printf("snap: corrupted snapshot file %v: crc mismatch", name) log.Printf("snap: corrupted snapshot file %v: crc mismatch", snapname)
return nil, ErrCRCMismatch return nil, ErrCRCMismatch
} }
var snap raftpb.Snapshot var snap raftpb.Snapshot
if err = snap.Unmarshal(serializedSnap.Data); err != nil { if err = snap.Unmarshal(serializedSnap.Data); err != nil {
log.Printf("snap: corrupted snapshot file %v: %v", name, err) log.Printf("snap: corrupted snapshot file %v: %v", snapname, err)
return nil, err return nil, err
} }
return &snap, nil return &snap, nil

View File

@ -32,13 +32,24 @@ import (
func main() { func main() {
from := flag.String("data-dir", "", "") from := flag.String("data-dir", "", "")
snapfile := flag.String("snap-file", "", "The base name of snapshot file to read")
flag.Parse() flag.Parse()
if *from == "" { if *from == "" {
log.Fatal("Must provide -data-dir flag") log.Fatal("Must provide -data-dir flag")
} }
ss := snap.New(snapDir(*from)) var (
snapshot, err := ss.Load() snapshot *raftpb.Snapshot
err error
)
if *snapfile == "" {
ss := snap.New(snapDir(*from))
snapshot, err = ss.Load()
} else {
snapshot, err = snap.Read(path.Join(snapDir(*from), *snapfile))
}
var walsnap walpb.Snapshot var walsnap walpb.Snapshot
switch err { switch err {
case nil: case nil:
@ -102,9 +113,9 @@ func main() {
} }
} }
func walDir(dataDir string) string { return path.Join(dataDir, "wal") } func walDir(dataDir string) string { return path.Join(dataDir, "member", "wal") }
func snapDir(dataDir string) string { return path.Join(dataDir, "snap") } func snapDir(dataDir string) string { return path.Join(dataDir, "member", "snap") }
func parseWALMetadata(b []byte) (id, cid types.ID) { func parseWALMetadata(b []byte) (id, cid types.ID) {
var metadata etcdserverpb.Metadata var metadata etcdserverpb.Metadata