X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/07a2b2c0e743f36be03e746a7e265986db555d3e..1efba8f3b728a3b8aa3c64c5aa09f441318ff2a8:/services/fuse/arvados_fuse/unmount.py?ds=sidebyside diff --git a/services/fuse/arvados_fuse/unmount.py b/services/fuse/arvados_fuse/unmount.py index a72da3a8dc..144c582ddc 100644 --- a/services/fuse/arvados_fuse/unmount.py +++ b/services/fuse/arvados_fuse/unmount.py @@ -6,6 +6,7 @@ import collections import errno import os import subprocess +import sys import time @@ -116,6 +117,7 @@ def unmount(path, subtype=None, timeout=10, recursive=False): was_mounted = False attempted = False + fusermount_output = b'' if timeout is None: deadline = None else: @@ -152,9 +154,23 @@ def unmount(path, subtype=None, timeout=10, recursive=False): path = os.path.realpath(path) continue elif not mounted: + if was_mounted: + # This appears to avoid a race condition where we + # return control to the caller after running + # "fusermount -u -z" (see below), the caller (e.g., + # arv-mount --replace) immediately tries to attach a + # new fuse mount at the same mount point, the + # lazy-unmount process unmounts that _new_ mount while + # it is being initialized, and the setup code waits + # forever for the new mount to be initialized. + time.sleep(1) return was_mounted if attempted: + # Report buffered stderr from previous call to fusermount, + # now that we know it didn't succeed. + sys.stderr.buffer.write(fusermount_output) + delay = 1 if deadline: delay = min(delay, deadline - time.time()) @@ -172,6 +188,10 @@ def unmount(path, subtype=None, timeout=10, recursive=False): attempted = True try: - subprocess.check_call(["fusermount", "-u", "-z", path]) - except subprocess.CalledProcessError: - pass + subprocess.check_output( + ["fusermount", "-u", "-z", path], + stderr=subprocess.STDOUT) + except subprocess.CalledProcessError as e: + fusermount_output = e.output + else: + fusermount_output = b''