From 52f31657cc03c0097e6fd0d5e1d2c10fb31d2b95 Mon Sep 17 00:00:00 2001 From: Michael Crosby Date: Fri, 8 Nov 2013 10:17:51 -0800 Subject: [PATCH] Do not remove mountpoint on umount --- aufs/aufs.go | 3 +-- aufs/aufs_test.go | 43 ++++++++++++++++++++++++++++++++++++++++++- aufs/mount.go | 19 +------------------ 3 files changed, 44 insertions(+), 21 deletions(-) diff --git a/aufs/aufs.go b/aufs/aufs.go index f4cb52dd9..932e415e0 100644 --- a/aufs/aufs.go +++ b/aufs/aufs.go @@ -145,8 +145,7 @@ func (a *AufsDriver) createDirsFor(id string) error { // Unmount and remove the dir information func (a *AufsDriver) Remove(id string) error { // Make sure the dir is umounted first - mntPoint := path.Join(a.rootPath(), "mnt", id) - if err := a.unmount(mntPoint); err != nil { + if err := a.unmount(id); err != nil { return err } tmpDirs := []string{ diff --git a/aufs/aufs_test.go b/aufs/aufs_test.go index d3de559fb..0afaf9b78 100644 --- a/aufs/aufs_test.go +++ b/aufs/aufs_test.go @@ -229,6 +229,12 @@ func TestMountWithParent(t *testing.T) { t.Fatal(err) } + defer func() { + if err := d.Cleanup(); err != nil { + t.Fatal(err) + } + }() + mntPath, err := d.Get("2") if err != nil { t.Fatal(err) @@ -241,8 +247,43 @@ func TestMountWithParent(t *testing.T) { if mntPath != expected { t.Fatalf("Expected %s got %s", expected, mntPath) } +} - if err := d.Cleanup(); err != nil { +func TestRemoveMountedDir(t *testing.T) { + d := newDriver(t) + defer os.RemoveAll(tmp) + + if err := d.Create("1", ""); err != nil { + t.Fatal(err) + } + if err := d.Create("2", "1"); err != nil { + t.Fatal(err) + } + + defer func() { + if err := d.Cleanup(); err != nil { + t.Fatal(err) + } + }() + + mntPath, err := d.Get("2") + if err != nil { + t.Fatal(err) + } + if mntPath == "" { + t.Fatal("mntPath should not be empty string") + } + + mounted, err := d.mounted("2") + if err != nil { + t.Fatal(err) + } + + if !mounted { + t.Fatalf("Dir id 2 should be mounted") + } + + if err := d.Remove("2"); err != nil { t.Fatal(err) } } diff --git a/aufs/mount.go b/aufs/mount.go index 4355d3b77..6f3476f99 100644 --- a/aufs/mount.go +++ b/aufs/mount.go @@ -1,13 +1,11 @@ package aufs import ( - "fmt" "github.com/dotcloud/docker/utils" "os" "os/exec" "path/filepath" "syscall" - "time" ) func Unmount(target string) error { @@ -17,22 +15,7 @@ func Unmount(target string) error { if err := syscall.Unmount(target, 0); err != nil { return err } - // Even though we just unmounted the filesystem, AUFS will prevent deleting the mntpoint - // for some time. We'll just keep retrying until it succeeds. - for retries := 0; retries < 1000; retries++ { - err := os.Remove(target) - if err == nil { - // rm mntpoint succeeded - return nil - } - if os.IsNotExist(err) { - // mntpoint doesn't exist anymore. Success. - return nil - } - // fmt.Printf("(%v) Remove %v returned: %v\n", retries, target, err) - time.Sleep(10 * time.Millisecond) - } - return fmt.Errorf("Umount: Failed to umount %v", target) + return nil } func Mounted(mountpoint string) (bool, error) {