Browse Source

Merge pull request #2283 from xiang90/etcd-dump

etcd dump
Xiang Li 11 years ago
parent
commit
4a0887ef7a
2 changed files with 28 additions and 17 deletions
  1. 13 13
      snap/snapshotter.go
  2. 15 4
      tools/etcd-dump-logs/main.go

+ 13 - 13
snap/snapshotter.go

@@ -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() {
-		if err != nil {
-			renameBroken(fpath)
-		}
-	}()
+	snap, err := Read(fpath)
+	if err != nil {
+		renameBroken(fpath)
+	}
+	return snap, err
+}
 
 
-	b, err = ioutil.ReadFile(fpath)
+// 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 {
 	if err != nil {
-		log.Printf("snap: snapshotter cannot read file %v: %v", name, err)
+		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

+ 15 - 4
tools/etcd-dump-logs/main.go

@@ -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))
-	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
 	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