Skip to content

Commit

Permalink
Rollback to aufs and cleanup overlay2 in case of missing config.v2.json
Browse files Browse the repository at this point in the history
Add test for missing config.v2.json

Changelog-entry: Rollback to aufs and cleanup overlay2 in case of missing config.v2.json
Change-type: patch
Signed-off-by: zoobot <rommims@gmail.com>
  • Loading branch information
zoobot committed Nov 22, 2022
1 parent 5d01bf7 commit 3915950
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 3 deletions.
1 change: 0 additions & 1 deletion pkg/storagemigration/failcleanup.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ 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")

Expand Down
6 changes: 4 additions & 2 deletions pkg/storagemigration/migrate.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down Expand Up @@ -340,7 +339,10 @@ 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")
if newStorageDriver == "overlay2" {
return fmt.Errorf("Error containerID %s: %v", containerID, err)
}
logrus.WithField("container_id", containerID).Errorf("has no config.v2.json %s", newStorageDriver)
default:
return fmt.Errorf("Error rewriting container config for %s: %v", containerID, err)
}
Expand Down
35 changes: 35 additions & 0 deletions pkg/storagemigration/migrate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ func setup(t *testing.T) (*fs.Dir, *State, func()) {
),
),
)

state := &State{
Layers: []Layer{
{
Expand Down Expand Up @@ -132,3 +133,37 @@ 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())
if err == nil {
// won't err on rollback to aufs fail
assert.NilError(t, err)
} else {
// only errs on migration to overlay2 fail
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"))
println("err", root.Join("overlay2"), err)
assert.ErrorType(t, err, os.IsNotExist)

// aufs directory should still exists
_, err = os.Stat(root.Join("aufs"))
assert.NilError(t, err)
}
}

0 comments on commit 3915950

Please sign in to comment.