Browse Source

etcdctl: fix snapshot status accidentally modified the db file

zhesi.huang 8 years ago
parent
commit
0ce02abf59
2 changed files with 30 additions and 1 deletions
  1. 29 0
      e2e/ctl_v3_snapshot_test.go
  2. 1 1
      etcdctl/ctlv3/command/snapshot_command.go

+ 29 - 0
e2e/ctl_v3_snapshot_test.go

@@ -93,6 +93,35 @@ func snapshotCorruptTest(cx ctlCtx) {
 	}
 	}
 }
 }
 
 
+// This test ensures that the snapshot status does not modify the snapshot file
+func TestCtlV3SnapshotStatusBeforeRestore(t *testing.T) { testCtl(t, snapshotStatusBeforeRestoreTest) }
+
+func snapshotStatusBeforeRestoreTest(cx ctlCtx) {
+	fpath := "test.snapshot"
+	defer os.RemoveAll(fpath)
+
+	if err := ctlV3SnapshotSave(cx, fpath); err != nil {
+		cx.t.Fatalf("snapshotTest ctlV3SnapshotSave error (%v)", err)
+	}
+
+	// snapshot status on the fresh snapshot file
+	_, err := getSnapshotStatus(cx, fpath)
+	if err != nil {
+		cx.t.Fatalf("snapshotTest getSnapshotStatus error (%v)", err)
+	}
+
+	defer os.RemoveAll("snap.etcd")
+	serr := spawnWithExpect(
+		append(cx.PrefixArgs(), "snapshot", "restore",
+			"--data-dir", "snap.etcd",
+			fpath),
+		"added member")
+
+	if serr != nil {
+		cx.t.Fatal(serr)
+	}
+}
+
 func ctlV3SnapshotSave(cx ctlCtx, fpath string) error {
 func ctlV3SnapshotSave(cx ctlCtx, fpath string) error {
 	cmdArgs := append(cx.PrefixArgs(), "snapshot", "save", fpath)
 	cmdArgs := append(cx.PrefixArgs(), "snapshot", "save", fpath)
 	return spawnWithExpect(cmdArgs, fmt.Sprintf("Snapshot saved at %s", fpath))
 	return spawnWithExpect(cmdArgs, fmt.Sprintf("Snapshot saved at %s", fpath))

+ 1 - 1
etcdctl/ctlv3/command/snapshot_command.go

@@ -409,7 +409,7 @@ func dbStatus(p string) dbstatus {
 
 
 	ds := dbstatus{}
 	ds := dbstatus{}
 
 
-	db, err := bolt.Open(p, 0400, nil)
+	db, err := bolt.Open(p, 0400, &bolt.Options{ReadOnly: true})
 	if err != nil {
 	if err != nil {
 		ExitWithError(ExitError, err)
 		ExitWithError(ExitError, err)
 	}
 	}