diff --git a/snap/snapshotter.go b/snap/snapshotter.go index 61e86b724..0e76a9172 100644 --- a/snap/snapshotter.go +++ b/snap/snapshotter.go @@ -86,25 +86,25 @@ func (s *Snapshotter) Load() (*raftpb.Snapshot, error) { } func loadSnap(dir, name string) (*raftpb.Snapshot, error) { - var err error - var b []byte - fpath := path.Join(dir, name) - defer func() { - if err != nil { - renameBroken(fpath) - } - }() - - b, err = ioutil.ReadFile(fpath) + snap, err := Read(fpath) 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 } var serializedSnap snappb.Snapshot 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 } @@ -115,13 +115,13 @@ func loadSnap(dir, name string) (*raftpb.Snapshot, error) { crc := crc32.Update(0, crcTable, serializedSnap.Data) 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 } var snap raftpb.Snapshot 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 &snap, nil diff --git a/tools/etcd-dump-logs/main.go b/tools/etcd-dump-logs/main.go index 4fe4a9ebb..05583e289 100644 --- a/tools/etcd-dump-logs/main.go +++ b/tools/etcd-dump-logs/main.go @@ -32,13 +32,24 @@ import ( func main() { from := flag.String("data-dir", "", "") + snapfile := flag.String("snap-file", "", "The base name of snapshot file to read") flag.Parse() if *from == "" { log.Fatal("Must provide -data-dir flag") } - ss := snap.New(snapDir(*from)) - snapshot, err := ss.Load() + var ( + 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 switch err { 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) { var metadata etcdserverpb.Metadata