Sfoglia il codice sorgente

Merge pull request #40656 from kolyshkin/mount-faster

Make mount.Mount() faster^W great again
Sebastiaan van Stijn 5 anni fa
parent
commit
d93860bd8d
3 ha cambiato i file con 18 aggiunte e 23 eliminazioni
  1. 5 6
      pkg/archive/archive_linux.go
  2. 5 4
      pkg/archive/archive_linux_test.go
  3. 8 13
      pkg/mount/mount.go

+ 5 - 6
pkg/archive/archive_linux.go

@@ -10,6 +10,7 @@ import (
 	"syscall"
 	"syscall"
 
 
 	"github.com/containerd/continuity/fs"
 	"github.com/containerd/continuity/fs"
+	"github.com/docker/docker/pkg/mount"
 	"github.com/docker/docker/pkg/system"
 	"github.com/docker/docker/pkg/system"
 	"github.com/pkg/errors"
 	"github.com/pkg/errors"
 	"golang.org/x/sys/unix"
 	"golang.org/x/sys/unix"
@@ -152,9 +153,8 @@ func mknodChar0Overlay(cleansedOriginalPath string) error {
 		return errors.Wrapf(err, "failed to create a dummy lower file %s", lowerDummy)
 		return errors.Wrapf(err, "failed to create a dummy lower file %s", lowerDummy)
 	}
 	}
 	mOpts := fmt.Sprintf("lowerdir=%s,upperdir=%s,workdir=%s", lower, upper, work)
 	mOpts := fmt.Sprintf("lowerdir=%s,upperdir=%s,workdir=%s", lower, upper, work)
-	// docker/pkg/mount.Mount() requires procfs to be mounted. So we use syscall.Mount() directly instead.
-	if err := syscall.Mount("overlay", merged, "overlay", uintptr(0), mOpts); err != nil {
-		return errors.Wrapf(err, "failed to mount overlay (%s) on %s", mOpts, merged)
+	if err := mount.Mount("overlay", merged, "overlay", mOpts); err != nil {
+		return err
 	}
 	}
 	mergedDummy := filepath.Join(merged, dummyBase)
 	mergedDummy := filepath.Join(merged, dummyBase)
 	if err := os.Remove(mergedDummy); err != nil {
 	if err := os.Remove(mergedDummy); err != nil {
@@ -237,9 +237,8 @@ func createDirWithOverlayOpaque(tmp string) (string, error) {
 		return "", errors.Wrapf(err, "failed to create a dummy lower directory %s", lowerDummy)
 		return "", errors.Wrapf(err, "failed to create a dummy lower directory %s", lowerDummy)
 	}
 	}
 	mOpts := fmt.Sprintf("lowerdir=%s,upperdir=%s,workdir=%s", lower, upper, work)
 	mOpts := fmt.Sprintf("lowerdir=%s,upperdir=%s,workdir=%s", lower, upper, work)
-	// docker/pkg/mount.Mount() requires procfs to be mounted. So we use syscall.Mount() directly instead.
-	if err := syscall.Mount("overlay", merged, "overlay", uintptr(0), mOpts); err != nil {
-		return "", errors.Wrapf(err, "failed to mount overlay (%s) on %s", mOpts, merged)
+	if err := mount.Mount("overlay", merged, "overlay", mOpts); err != nil {
+		return "", err
 	}
 	}
 	mergedDummy := filepath.Join(merged, dummyBase)
 	mergedDummy := filepath.Join(merged, dummyBase)
 	if err := os.Remove(mergedDummy); err != nil {
 	if err := os.Remove(mergedDummy); err != nil {

+ 5 - 4
pkg/archive/archive_linux_test.go

@@ -9,6 +9,7 @@ import (
 	"syscall"
 	"syscall"
 	"testing"
 	"testing"
 
 
+	"github.com/docker/docker/pkg/mount"
 	"github.com/docker/docker/pkg/reexec"
 	"github.com/docker/docker/pkg/reexec"
 	"github.com/docker/docker/pkg/system"
 	"github.com/docker/docker/pkg/system"
 	rsystem "github.com/opencontainers/runc/libcontainer/system"
 	rsystem "github.com/opencontainers/runc/libcontainer/system"
@@ -204,11 +205,11 @@ func supportsOverlay(dir string) error {
 		}
 		}
 	}
 	}
 	mOpts := fmt.Sprintf("lowerdir=%s,upperdir=%s,workdir=%s", lower, upper, work)
 	mOpts := fmt.Sprintf("lowerdir=%s,upperdir=%s,workdir=%s", lower, upper, work)
-	if err := syscall.Mount("overlay", merged, "overlay", uintptr(0), mOpts); err != nil {
-		return errors.Wrapf(err, "failed to mount overlay (%s) on %s", mOpts, merged)
+	if err := mount.Mount("overlay", merged, "overlay", mOpts); err != nil {
+		return err
 	}
 	}
-	if err := syscall.Unmount(merged, 0); err != nil {
-		return errors.Wrapf(err, "failed to unmount %s", merged)
+	if err := mount.Unmount(merged); err != nil {
+		return err
 	}
 	}
 	return nil
 	return nil
 }
 }

+ 8 - 13
pkg/mount/mount.go

@@ -97,24 +97,19 @@ func Mounted(mountpoint string) (bool, error) {
 	return len(entries) > 0, nil
 	return len(entries) > 0, nil
 }
 }
 
 
-// Mount will mount filesystem according to the specified configuration, on the
-// condition that the target path is *not* already mounted. Options must be
-// specified like the mount or fstab unix commands: "opt1=val1,opt2=val2". See
-// flags.go for supported option flags.
+// Mount will mount filesystem according to the specified configuration.
+// Options must be specified like the mount or fstab unix commands:
+// "opt1=val1,opt2=val2". See flags.go for supported option flags.
 func Mount(device, target, mType, options string) error {
 func Mount(device, target, mType, options string) error {
 	flag, data := parseOptions(options)
 	flag, data := parseOptions(options)
-	if flag&REMOUNT != REMOUNT {
-		if mounted, err := Mounted(target); err != nil || mounted {
-			return err
-		}
-	}
 	return mount(device, target, mType, uintptr(flag), data)
 	return mount(device, target, mType, uintptr(flag), data)
 }
 }
 
 
-// ForceMount will mount a filesystem according to the specified configuration,
-// *regardless* if the target path is not already mounted. Options must be
-// specified like the mount or fstab unix commands: "opt1=val1,opt2=val2". See
-// flags.go for supported option flags.
+// ForceMount will mount filesystem according to the specified configuration.
+// Options must be specified like the mount or fstab unix commands:
+// "opt1=val1,opt2=val2". See flags.go for supported option flags.
+//
+// Deprecated: use Mount instead.
 func ForceMount(device, target, mType, options string) error {
 func ForceMount(device, target, mType, options string) error {
 	flag, data := parseOptions(options)
 	flag, data := parseOptions(options)
 	return mount(device, target, mType, uintptr(flag), data)
 	return mount(device, target, mType, uintptr(flag), data)