Explorar o código

Do not remove mountpoint on umount

Michael Crosby %!s(int64=11) %!d(string=hai) anos
pai
achega
52f31657cc
Modificáronse 3 ficheiros con 44 adicións e 21 borrados
  1. 1 2
      aufs/aufs.go
  2. 42 1
      aufs/aufs_test.go
  3. 1 18
      aufs/mount.go

+ 1 - 2
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{

+ 42 - 1
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)
 	}
 }

+ 1 - 18
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) {