diff --git a/e2e/ctl_v3_snapshot_test.go b/e2e/ctl_v3_snapshot_test.go index 234d5b037de..ed09045ebc2 100644 --- a/e2e/ctl_v3_snapshot_test.go +++ b/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 { cmdArgs := append(cx.PrefixArgs(), "snapshot", "save", fpath) return spawnWithExpect(cmdArgs, fmt.Sprintf("Snapshot saved at %s", fpath)) diff --git a/etcdctl/ctlv3/command/snapshot_command.go b/etcdctl/ctlv3/command/snapshot_command.go index 02dda015799..026339bc1f2 100644 --- a/etcdctl/ctlv3/command/snapshot_command.go +++ b/etcdctl/ctlv3/command/snapshot_command.go @@ -409,7 +409,7 @@ func dbStatus(p string) dbstatus { ds := dbstatus{} - db, err := bolt.Open(p, 0400, nil) + db, err := bolt.Open(p, 0400, &bolt.Options{ReadOnly: true}) if err != nil { ExitWithError(ExitError, err) }