From b71b5dffa6870027c0ed0367e9cff72dfcaf856e Mon Sep 17 00:00:00 2001 From: zoobot Date: Fri, 11 Nov 2022 15:52:39 -0800 Subject: [PATCH] Rollback to ausf and cleanup overlay2 in case of missing config.v2.json Add test for missing config.v2.json Changelog-entry: Rollback to ausf and cleanup overlay2 in case of missing config.v2.json Change-type: patch Signed-off-by: zoobot --- pkg/storagemigration/failcleanup.go | 23 ++++++++++++++++++----- pkg/storagemigration/migrate.go | 4 ++-- pkg/storagemigration/migrate_test.go | 28 ++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/pkg/storagemigration/failcleanup.go b/pkg/storagemigration/failcleanup.go index 5e61045d71..0d160135b4 100644 --- a/pkg/storagemigration/failcleanup.go +++ b/pkg/storagemigration/failcleanup.go @@ -10,15 +10,10 @@ import ( // FailCleanup should be run after a failed migration. // It will remove any files left over from the migration process // and migrate containers back to aufs. -// func failCleanup(root string) error { logrus.WithField("storage_root", root).Warning("recovering from failed aufs to overlay migration") var err error - err = SwitchAllContainersStorageDriver(root, "aufs") - if err != nil { - return fmt.Errorf("Error migrating containers to aufs: %v", err) - } err = removeDirIfExists(tempTargetRoot(root)) if err != nil { @@ -36,5 +31,23 @@ func failCleanup(root string) error { return err } + err = SwitchAllContainersStorageDriver(root, "aufs") + if err != nil { + return fmt.Errorf("Error migrating containers to aufs: %v", err) + } + + return nil +} + +func failCleanupContainer(root string, containerID string) error { + logrus.WithField("containerId", containerID).Warning("recovering from container config missing during aufs to overlay migration") + var err error + + containerDir := filepath.Join(root, "containers", containerID) + err = removeDirIfExists(containerDir) + if err != nil { + return err + } + return nil } diff --git a/pkg/storagemigration/migrate.go b/pkg/storagemigration/migrate.go index def78198cc..2c16ff4ee1 100644 --- a/pkg/storagemigration/migrate.go +++ b/pkg/storagemigration/migrate.go @@ -128,7 +128,6 @@ func Migrate(root string) (err error) { if err != nil { return fmt.Errorf("Error migrating containers to overlay2: %v", err) } - return nil } @@ -340,7 +339,8 @@ func SwitchAllContainersStorageDriver(root, newStorageDriver string) error { case nil: logrus.WithField("container_id", containerID).Debugf("reconfigured storage-driver to %s", newStorageDriver) case errNoConfigV2JSON: - logrus.WithField("container_id", containerID).Warning("ignoring container without config.v2.json") + logrus.WithField("container_id", containerID).Errorf("has no config.v2.json %s", newStorageDriver) + return fmt.Errorf("Error containerID %s: %v", containerID, err) default: return fmt.Errorf("Error rewriting container config for %s: %v", containerID, err) } diff --git a/pkg/storagemigration/migrate_test.go b/pkg/storagemigration/migrate_test.go index f041f70352..45f7e71c2a 100644 --- a/pkg/storagemigration/migrate_test.go +++ b/pkg/storagemigration/migrate_test.go @@ -41,6 +41,7 @@ func setup(t *testing.T) (*fs.Dir, *State, func()) { ), ), ) + state := &State{ Layers: []Layer{ { @@ -132,3 +133,30 @@ func TestFailCleanup(t *testing.T) { _, err = os.Stat(root.Join("aufs")) assert.NilError(t, err) } + +func TestFailCleanupContainer(t *testing.T) { + root, _, cleanup := setup(t) + defer cleanup() + + // delete config.v2.json to force SwitchAllContainersStorageDriver to fail + os.Remove(root.Join("containers", "bebe92422caf828ab21ae39974a0c003a29970ec09c6e5529bbb24f71eb9ca2ef", "config.v2.json")) + + err := Migrate(root.Path()) + assert.ErrorContains(t, err, "bebe92422caf828ab21ae39974a0c003a29970ec09c6e5529bbb24f71eb9ca2ef") + + // config.v2.json should not exists + _, err = os.Stat(root.Join("containers", "bebe92422caf828ab21ae39974a0c003a29970ec09c6e5529bbb24f71eb9ca2ef", "config.v2.json")) + assert.ErrorType(t, err, os.IsNotExist) + + // migration logfile should exists + _, err = os.Stat(root.Join("migrate.log")) + assert.NilError(t, err) + + // overlay2 directory should not exists + _, err = os.Stat(root.Join("overlay2")) + assert.ErrorType(t, err, os.IsNotExist) + + // aufs directory should still exists + _, err = os.Stat(root.Join("aufs")) + assert.NilError(t, err) +}