Merge branch '21601-setuptools-git-deps'
[arvados.git] / services / fuse / arvados_fuse / command.py
index c12e45255b3d47990880e007534301ea489915fb..45847fde81734ce251c1aa45d95f9daa82866783 100644 (file)
@@ -50,8 +50,8 @@ class ArgumentParser(argparse.ArgumentParser):
             const='all',
             dest='mode',
             help="""
-Mount a subdirectory for each mode: home, shared, by_id, and by_tag
-(default if no --mount-* options are given)
+Mount a subdirectory for each mode: `home`, `shared`, `by_id`, and `by_tag`
+(default if no `--mount-*` options are given)
 """,
         )
         mode.add_argument(
@@ -60,8 +60,8 @@ Mount a subdirectory for each mode: home, shared, by_id, and by_tag
             const=None,
             dest='mode',
             help="""
-Mount a subdirectory for each mode specified by a --mount-* option
-(default if any --mount-* options are given;
+Mount a subdirectory for each mode specified by a `--mount-*` option
+(default if any `--mount-*` options are given;
 see "Mount custom layout and filtering" section)
 """,
         )
@@ -132,55 +132,55 @@ The JSON object should be a list of filters in Arvados API list filter syntax.
             metavar='PATH',
             action='append',
             default=[],
-            help="Make your home project available under the mount at PATH",
+            help="Make your home project available under the mount at `PATH`",
         )
         mounts.add_argument(
-            '--mount-by-id',
+            '--mount-shared',
             metavar='PATH',
             action='append',
             default=[],
-            help="""
-Make a magic directory available under the mount at PATH where collections and
-projects are accessible through subdirectories named after their UUID or
-portable data hash
-""",
+            help="Make projects shared with you available under the mount at `PATH`",
         )
         mounts.add_argument(
-            '--mount-by-pdh',
+            '--mount-tmp',
             metavar='PATH',
             action='append',
             default=[],
             help="""
-Make a magic directory available under the mount at PATH where collections
-are accessible through subdirectories named after portable data hash
+Make a new temporary writable collection available under the mount at `PATH`.
+This collection is deleted when the mount is unmounted.
 """,
         )
         mounts.add_argument(
-            '--mount-shared',
+            '--mount-by-id',
             metavar='PATH',
             action='append',
             default=[],
-            help="Make projects shared with you available under the mount at PATH",
+            help="""
+Make a magic directory available under the mount at `PATH` where collections and
+projects are accessible through subdirectories named after their UUID or
+portable data hash
+""",
         )
         mounts.add_argument(
-            '--mount-by-tag',
+            '--mount-by-pdh',
             metavar='PATH',
             action='append',
             default=[],
             help="""
-Make a subdirectory for each tag attached to a collection or project available
-under the mount at PATH
-""" ,
+Make a magic directory available under the mount at `PATH` where collections
+are accessible through subdirectories named after portable data hash
+""",
         )
         mounts.add_argument(
-            '--mount-tmp',
+            '--mount-by-tag',
             metavar='PATH',
             action='append',
             default=[],
             help="""
-Make a new temporary writable collection available under the mount at PATH.
-This collection is deleted when the mount is unmounted.
-""",
+Make a subdirectory for each tag attached to a collection or project available
+under the mount at `PATH`
+""" ,
         )
 
         perms = self.add_argument_group("Mount access and permissions")
@@ -211,10 +211,10 @@ This collection is deleted when the mount is unmounted.
             dest="exec_args",
             help="""
 Mount data, run the specified command, then unmount and exit.
---exec reads all remaining options as the command to run,
+`--exec` reads all remaining options as the command to run,
 so it must be the last option you specify.
 Either end your command arguments (and other options) with a `--` argument,
-or specify --exec after your mount point.
+or specify `--exec` after your mount point.
 """,
         )
         lifecycle.add_argument(
@@ -235,7 +235,7 @@ or specify --exec after your mount point.
             help="""
 If a FUSE mount is already mounted at the given directory,
 unmount it before mounting the requested data.
-If --subtype is specified, unmount only if the mount has that subtype.
+If `--subtype` is specified, unmount only if the mount has that subtype.
 WARNING: This command can affect any kind of FUSE mount, not just arv-mount.
 """,
         )
@@ -245,7 +245,7 @@ WARNING: This command can affect any kind of FUSE mount, not just arv-mount.
             default=False,
             help="""
 If a FUSE mount is already mounted at the given directory, unmount it and exit.
-If --subtype is specified, unmount only if the mount has that subtype.
+If `--subtype` is specified, unmount only if the mount has that subtype.
 WARNING: This command can affect any kind of FUSE mount, not just arv-mount.
 """,
         )
@@ -255,7 +255,7 @@ WARNING: This command can affect any kind of FUSE mount, not just arv-mount.
             default=False,
             help="""
 Unmount all FUSE mounts at or below the given directory, then exit.
-If --subtype is specified, unmount only if the mount has that subtype.
+If `--subtype` is specified, unmount only if the mount has that subtype.
 WARNING: This command can affect any kind of FUSE mount, not just arv-mount.
 """,
         )
@@ -265,7 +265,7 @@ WARNING: This command can affect any kind of FUSE mount, not just arv-mount.
             default=2.0,
             metavar='SECONDS',
             help="""
-The number of seconds to wait for a clean unmount after an --exec command has
+The number of seconds to wait for a clean unmount after an `--exec` command has
 exited (default %(default).01f).
 After this time, the mount will be forcefully unmounted.
 """,
@@ -308,7 +308,7 @@ After this time, the mount will be forcefully unmounted.
         cache.add_argument(
             '--disk-cache-dir',
             metavar="DIRECTORY",
-            help="Filesystem cache location (default ~/.cache/arvados/keep)",
+            help="Filesystem cache location (default `~/.cache/arvados/keep`)",
         )
         cache.add_argument(
             '--directory-cache',
@@ -349,7 +349,15 @@ Filesystem character encoding
             metavar='CLASSES',
             help="Comma-separated list of storage classes to request for new collections",
         )
-
+        # This is a hidden argument used by tests.  Normally this
+        # value will be extracted from the cluster config, but mocking
+        # the cluster config under the presence of multiple threads
+        # and processes turned out to be too complicated and brittle.
+        plumbing.add_argument(
+            '--fsns',
+            type=str,
+            default=None,
+            help=argparse.SUPPRESS)
 
 class Mount(object):
     def __init__(self, args, logger=logging.getLogger('arvados.arv-mount')):
@@ -514,7 +522,8 @@ class Mount(object):
             api_client=self.api,
             encoding=self.args.encoding,
             inode_cache=InodeCache(cap=self.args.directory_cache),
-            enable_write=self.args.enable_write)
+            enable_write=self.args.enable_write,
+            fsns=self.args.fsns)
 
         if self.args.crunchstat_interval:
             statsthread = threading.Thread(
@@ -603,7 +612,6 @@ class Mount(object):
         e = self.operations.inodes.add_entry(Directory(
             llfuse.ROOT_INODE,
             self.operations.inodes,
-            self.api.config,
             self.args.enable_write,
             self.args.filters,
         ))
@@ -688,8 +696,9 @@ From here, the following directories are available:
 
     def _llfuse_main(self):
         try:
-            llfuse.main()
+            llfuse.main(workers=10)
         except:
             llfuse.close(unmount=False)
             raise
+        self.operations.begin_shutdown()
         llfuse.close()