From 7f06fbb0815a3bbd59d204e4548989826d9d8532 Mon Sep 17 00:00:00 2001 From: Brendan Burns Date: Thu, 29 Jan 2015 18:10:13 -0800 Subject: [PATCH] Be a little more careful when removing mount points. --- pkg/kubelet/volume/gce_pd/gce_pd.go | 34 ++++++++++++++++++++++++--- pkg/kubelet/volume/gce_pd/gce_util.go | 4 ++-- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/pkg/kubelet/volume/gce_pd/gce_pd.go b/pkg/kubelet/volume/gce_pd/gce_pd.go index cdec6a3f0e4..294662b185b 100644 --- a/pkg/kubelet/volume/gce_pd/gce_pd.go +++ b/pkg/kubelet/volume/gce_pd/gce_pd.go @@ -194,7 +194,28 @@ func (pd *gcePersistentDisk) SetUp() error { globalPDPath := makeGlobalPDName(pd.plugin.host, pd.pdName, pd.readOnly) err = pd.mounter.Mount(globalPDPath, pd.GetPath(), "", mount.FlagBind|flags, "") if err != nil { - os.RemoveAll(pd.GetPath()) + mountpoint, mntErr := isMountPoint(pd.GetPath()) + if mntErr != nil { + glog.Errorf("isMountpoint check failed: %v", mntErr) + return err + } + if mountpoint { + if mntErr = pd.mounter.Unmount(pd.GetPath(), 0); mntErr != nil { + glog.Errorf("Failed to unmount: %v", mntErr) + return err + } + mountpoint, mntErr := isMountPoint(pd.GetPath()) + if mntErr != nil { + glog.Errorf("isMountpoint check failed: %v", mntErr) + return err + } + if mountpoint { + // This is very odd, we don't expect it. We'll try again next sync loop. + glog.Errorf("%s is still mounted, despite call to unmount(). Will try again next sync loop.", pd.GetPath()) + return err + } + } + os.Remove(pd.GetPath()) // TODO: we should really eject the attach/detach out into its own control loop. detachDiskLogError(pd) return err @@ -223,7 +244,7 @@ func (pd *gcePersistentDisk) TearDown() error { return err } if !mountpoint { - return os.RemoveAll(pd.GetPath()) + return os.Remove(pd.GetPath()) } devicePath, refCount, err := getMountRefCount(pd.mounter, pd.GetPath()) @@ -241,8 +262,15 @@ func (pd *gcePersistentDisk) TearDown() error { return err } } - if err := os.RemoveAll(pd.GetPath()); err != nil { + mountpoint, mntErr := isMountPoint(pd.GetPath()) + if mntErr != nil { + glog.Errorf("isMountpoint check failed: %v", mntErr) return err } + if !mountpoint { + if err := os.Remove(pd.GetPath()); err != nil { + return err + } + } return nil } diff --git a/pkg/kubelet/volume/gce_pd/gce_util.go b/pkg/kubelet/volume/gce_pd/gce_util.go index cec0212faf6..685c44a2631 100644 --- a/pkg/kubelet/volume/gce_pd/gce_util.go +++ b/pkg/kubelet/volume/gce_pd/gce_util.go @@ -87,7 +87,7 @@ func (util *GCEDiskUtil) AttachDisk(pd *gcePersistentDisk) error { if !mountpoint { err = pd.mounter.Mount(devicePath, globalPDPath, pd.fsType, flags, "") if err != nil { - os.RemoveAll(globalPDPath) + os.Remove(globalPDPath) return err } } @@ -127,7 +127,7 @@ func (util *GCEDiskUtil) DetachDisk(pd *gcePersistentDisk, devicePath string) er if err := pd.mounter.Unmount(globalPDPath, 0); err != nil { return err } - if err := os.RemoveAll(globalPDPath); err != nil { + if err := os.Remove(globalPDPath); err != nil { return err } gce, err := cloudprovider.GetCloudProvider("gce", nil)