[ARVADOS] updated: 8d3335359e3785be35818b0c4519cc499f3f2fa8
git at public.curoverse.com
git at public.curoverse.com
Mon Jul 21 11:34:08 EDT 2014
Summary of changes:
services/fuse/arvados_fuse/__init__.py | 6 +---
services/fuse/bin/arv-mount | 59 +++++++++++++++++++++++++---------
2 files changed, 44 insertions(+), 21 deletions(-)
via 8d3335359e3785be35818b0c4519cc499f3f2fa8 (commit)
from 230ac956317ec9389252240de934edc168098a76 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
commit 8d3335359e3785be35818b0c4519cc499f3f2fa8
Author: Brett Smith <brett at curoverse.com>
Date: Mon Jul 21 11:33:30 2014 -0400
3303: Add logfile support to arv-mount.
The primary thrust of this commit is to teach arv-mount to log to a
file. This can help make it easier to track down exceptions that
happen while the process is daemonized.
To support better logging information, it also sends exception
tracebacks directly to the log. This required reorganizing the code
to daemonize earlier.
Refs #3303.
diff --git a/services/fuse/arvados_fuse/__init__.py b/services/fuse/arvados_fuse/__init__.py
index 2bbf137..5d782d2 100644
--- a/services/fuse/arvados_fuse/__init__.py
+++ b/services/fuse/arvados_fuse/__init__.py
@@ -416,13 +416,9 @@ class Operations(llfuse.Operations):
so request handlers do not run concurrently unless the lock is explicitly released
with llfuse.lock_released.'''
- def __init__(self, uid, gid, debug=False):
+ def __init__(self, uid, gid):
super(Operations, self).__init__()
- if debug:
- logging.basicConfig(level=logging.DEBUG)
- logging.info("arv-mount debug enabled")
-
self.inodes = Inodes()
self.uid = uid
self.gid = gid
diff --git a/services/fuse/bin/arv-mount b/services/fuse/bin/arv-mount
index b874f5f..0f3e871 100755
--- a/services/fuse/bin/arv-mount
+++ b/services/fuse/bin/arv-mount
@@ -3,9 +3,11 @@
import argparse
import arvados
import daemon
+import logging
import os
import signal
import subprocess
+import traceback
from arvados_fuse import *
@@ -30,20 +32,41 @@ with "--".
collections on the server.""")
parser.add_argument('--groups', action='store_true', help="""Mount as a virtual directory consisting of subdirectories representing groups on the server.""")
parser.add_argument('--debug', action='store_true', help="""Debug mode""")
+ parser.add_argument('--logfile', help="""Write debug logs and errors to the specified file (default stderr).""")
parser.add_argument('--foreground', action='store_true', help="""Run in foreground (default is to daemonize unless --exec specified)""", default=False)
parser.add_argument('--exec', type=str, nargs=argparse.REMAINDER,
dest="exec_args", metavar=('command', 'args', '...', '--'),
help="""Mount, run a command, then unmount and exit""")
args = parser.parse_args()
+ args.mountpoint = os.path.realpath(args.mountpoint)
+ if args.logfile:
+ args.logfile = os.path.realpath(args.logfile)
- # Create the request handler
- operations = Operations(os.getuid(), os.getgid(), args.debug)
-
- if args.debug:
- arvados.config.settings()['ARVADOS_DEBUG'] = 'true'
+ # Daemonize as early as possible, so we don't accidentally close
+ # file descriptors we're using.
+ if not (args.exec_args or args.foreground):
+ os.chdir(args.mountpoint)
+ daemon_ctx = daemon.DaemonContext(working_directory='.')
+ daemon_ctx.open()
+ else:
+ daemon_ctx = None
+
+ # Set up logging.
+ # If we're daemonized without a logfile, there's nowhere to log, so don't.
+ if args.logfile or (daemon_ctx is None):
+ log_conf = {}
+ if args.debug:
+ log_conf['level'] = logging.DEBUG
+ arvados.config.settings()['ARVADOS_DEBUG'] = 'true'
+ if args.logfile:
+ log_conf['filename'] = args.logfile
+ logging.basicConfig(**log_conf)
+ logging.debug("arv-mount debugging enabled")
try:
+ # Create the request handler
+ operations = Operations(os.getuid(), os.getgid())
api = arvados.api('v1')
if args.groups:
@@ -57,7 +80,8 @@ collections on the server.""")
# Set up the request handler with the 'magic directory' at the root
operations.inodes.add_entry(MagicDirectory(llfuse.ROOT_INODE, operations.inodes))
except Exception as ex:
- print("arv-mount: %s" % ex)
+ logging.error("arv-mount: exception during API setup")
+ logging.error(traceback.format_exc())
exit(1)
# FUSE options, see mount.fuse(8)
@@ -90,19 +114,22 @@ collections on the server.""")
signal.signal(signal.SIGINT, signal.SIG_DFL)
signal.signal(signal.SIGTERM, signal.SIG_DFL)
signal.signal(signal.SIGQUIT, signal.SIG_DFL)
- except OSError as e:
- sys.stderr.write('arv-mount: %s -- exec %s\n' % (str(e), args.exec_args))
- rc = e.errno
except Exception as e:
- sys.stderr.write('arv-mount: %s\n' % str(e))
+ logging.error('arv-mount: exception during exec %s' % (args.exec_args,))
+ logging.error(traceback.format_exc())
+ try:
+ rc = e.errno
+ except AttributeError:
+ pass
finally:
subprocess.call(["fusermount", "-u", "-z", args.mountpoint])
exit(rc)
else:
- os.chdir(args.mountpoint)
- if not args.foreground:
- daemon_ctx = daemon.DaemonContext(working_directory='.')
- daemon_ctx.open()
- llfuse.init(operations, '.', opts)
- llfuse.main()
+ try:
+ llfuse.init(operations, args.mountpoint, opts)
+ llfuse.main()
+ except Exception as e:
+ logging.error('arv-mount: exception during mount')
+ logging.error(traceback.format_exc())
+ exit(getattr(e, 'errno', 1))
-----------------------------------------------------------------------
hooks/post-receive
--
More information about the arvados-commits
mailing list