Skip to content

Commit 6875956

Browse files
committed
Restore retained snapshot base after standby snapshot failure
1 parent 9b71aa8 commit 6875956

File tree

2 files changed

+7
-5
lines changed

2 files changed

+7
-5
lines changed

lib/instances/standby.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ func (m *manager) standbyInstance(
105105
log.ErrorContext(ctx, "snapshot failed, attempting to resume VM", "instance_id", id, "error", err)
106106
hv.Resume(ctx)
107107
if promotedExistingBase {
108-
if rollbackErr := discardPromotedRetainedSnapshotTarget(snapshotDir); rollbackErr != nil {
108+
if rollbackErr := discardPromotedRetainedSnapshotTarget(snapshotDir, retainedBaseDir); rollbackErr != nil {
109109
log.WarnContext(ctx, "failed to discard promoted snapshot target after snapshot error", "instance_id", id, "error", rollbackErr)
110110
}
111111
}
@@ -209,8 +209,8 @@ func prepareRetainedSnapshotTarget(snapshotDir string, retainedBaseDir string) (
209209
return false, nil
210210
}
211211

212-
func discardPromotedRetainedSnapshotTarget(snapshotDir string) error {
213-
return os.RemoveAll(snapshotDir)
212+
func discardPromotedRetainedSnapshotTarget(snapshotDir string, retainedBaseDir string) error {
213+
return restoreRetainedSnapshotBase(snapshotDir, retainedBaseDir)
214214
}
215215

216216
func restoreRetainedSnapshotBase(snapshotDir string, retainedBaseDir string) error {

lib/instances/standby_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,12 @@ func TestDiscardPromotedRetainedSnapshotTargetAfterSnapshotError(t *testing.T) {
2929
// Simulate a partially written snapshot target before the snapshot API returns an error.
3030
require.NoError(t, os.WriteFile(filepath.Join(snapshotDir, "partial-marker"), []byte("partial"), 0644))
3131

32-
require.NoError(t, discardPromotedRetainedSnapshotTarget(snapshotDir))
32+
require.NoError(t, discardPromotedRetainedSnapshotTarget(snapshotDir, retainedBaseDir))
3333

3434
_, err = os.Stat(snapshotDir)
3535
assert.True(t, os.IsNotExist(err), "snapshot failures should discard the promoted snapshot target")
3636
_, err = os.Stat(retainedBaseDir)
37-
assert.True(t, os.IsNotExist(err), "snapshot failures should not restore the promoted base for reuse")
37+
require.NoError(t, err, "snapshot failures should restore the promoted base for reuse")
38+
_, err = os.Stat(filepath.Join(retainedBaseDir, "base-marker"))
39+
assert.NoError(t, err, "base snapshot contents should be restored for retry")
3840
}

0 commit comments

Comments
 (0)