summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorPádraig Brady <pbrady@redhat.com>2012-07-11 23:45:28 +0100
committerPádraig Brady <pbrady@redhat.com>2012-07-12 00:01:12 +0100
commit5eea8879b6f3268dcaba326193bef0ed75470bb7 (patch)
tree9ea315530e069c223eb9eb6b36e64c1ab9e28f88 /nova
parent647684adf2514fe9f0a1f142871f489bcd4a1c1a (diff)
ensure libguestfs mounts are cleaned up
Make a few attempts to umount the libguestfs mounts, in case other processes are accessing the mounts (like udev etc.) If we still can't umount after 5 attempts (with average delay of about 1s between each), then initiate a lazy umount so that the mounts might be automatically cleaned up at some stage. We wait a further 10s after initiating the lazy umount, before raising an exception. Addresses the original issue in bug 1013689 Change-Id: Ib5ede9f705c833825a19308c140f99c5bf3a776f
Diffstat (limited to 'nova')
-rw-r--r--nova/virt/disk/guestfs.py16
1 files changed, 13 insertions, 3 deletions
diff --git a/nova/virt/disk/guestfs.py b/nova/virt/disk/guestfs.py
index f2ff3c371..c44158d0d 100644
--- a/nova/virt/disk/guestfs.py
+++ b/nova/virt/disk/guestfs.py
@@ -17,6 +17,7 @@
import os
+from nova import exception
from nova import utils
from nova.virt.disk import mount
@@ -88,9 +89,18 @@ class Mount(mount.Mount):
def unmnt_dev(self):
if not self.mounted:
return
- # root users don't need a specific unmnt_dev()
- # but ordinary users do
- utils.execute('fusermount', '-u', self.mount_dir, run_as_root=True)
+ umount_cmd = ['fusermount', '-u', self.mount_dir]
+ try:
+ # We make a few attempts to work around other
+ # processes temporarily scanning the mount_dir etc.
+ utils.execute(*umount_cmd, attempts=5, run_as_root=True)
+ except exception.ProcessExecutionError:
+ # If we still can't umount, then do a lazy umount
+ # (in the background), so that mounts might eventually
+ # be cleaned up. Note we'll wait 10s below for the umount to
+ # complete, after which we'll raise an exception.
+ umount_cmd.insert(1, '-z')
+ utils.execute(*umount_cmd, run_as_root=True)
# Unfortunately FUSE has an issue where it doesn't wait
# for processes associated with the mount to terminate.