[ARVADOS] created: 8417bf754051966915b93c362624ebdcd492d660
git at public.curoverse.com
git at public.curoverse.com
Fri Feb 5 19:17:50 EST 2016
at 8417bf754051966915b93c362624ebdcd492d660 (commit)
commit 8417bf754051966915b93c362624ebdcd492d660
Author: Peter Amstutz <peter.amstutz at curoverse.com>
Date: Fri Feb 5 19:17:42 2016 -0500
8285: Add test for listen_for_events
diff --git a/services/fuse/arvados_fuse/fusedir.py b/services/fuse/arvados_fuse/fusedir.py
index e36f66b..f3f3c96 100644
--- a/services/fuse/arvados_fuse/fusedir.py
+++ b/services/fuse/arvados_fuse/fusedir.py
@@ -946,3 +946,6 @@ class SharedDirectory(Directory):
lambda i: ProjectDirectory(self.inode, self.inodes, self.api, self.num_retries, i[1], poll=self._poll, poll_time=self._poll_time))
except Exception:
_logger.exception()
+
+ def want_event_subscribe(self):
+ return True
diff --git a/services/fuse/tests/test_command_args.py b/services/fuse/tests/test_command_args.py
index bfefc67..70a1e59 100644
--- a/services/fuse/tests/test_command_args.py
+++ b/services/fuse/tests/test_command_args.py
@@ -82,6 +82,7 @@ class MountArgsTest(unittest.TestCase):
self.mnt = arvados_fuse.command.Mount(args)
e = self.check_ent_type(arvados_fuse.MagicDirectory)
self.assertEqual(e.pdh_only, False)
+ self.assertEqual(True, self.mnt.listen_for_events)
@noexit
def test_by_pdh(self):
@@ -92,6 +93,7 @@ class MountArgsTest(unittest.TestCase):
self.mnt = arvados_fuse.command.Mount(args)
e = self.check_ent_type(arvados_fuse.MagicDirectory)
self.assertEqual(e.pdh_only, True)
+ self.assertEqual(False, self.mnt.listen_for_events)
@noexit
def test_by_tag(self):
@@ -101,6 +103,7 @@ class MountArgsTest(unittest.TestCase):
self.assertEqual(args.mode, 'by_tag')
self.mnt = arvados_fuse.command.Mount(args)
e = self.check_ent_type(arvados_fuse.TagsDirectory)
+ self.assertEqual(True, self.mnt.listen_for_events)
@noexit
def test_collection(self, id_type='uuid'):
@@ -112,6 +115,7 @@ class MountArgsTest(unittest.TestCase):
self.mnt = arvados_fuse.command.Mount(args)
e = self.check_ent_type(arvados_fuse.CollectionDirectory)
self.assertEqual(e.collection_locator, cid)
+ self.assertEqual(id_type == 'uuid', self.mnt.listen_for_events)
def test_collection_pdh(self):
self.test_collection('portable_data_hash')
@@ -126,6 +130,7 @@ class MountArgsTest(unittest.TestCase):
e = self.check_ent_type(arvados_fuse.ProjectDirectory)
self.assertEqual(e.project_object['uuid'],
run_test_server.fixture('users')['active']['uuid'])
+ self.assertEqual(True, self.mnt.listen_for_events)
def test_mutually_exclusive_args(self):
cid = run_test_server.fixture('collections')['public_text_file']['uuid']
@@ -162,6 +167,7 @@ class MountArgsTest(unittest.TestCase):
e = self.check_ent_type(arvados_fuse.SharedDirectory)
self.assertEqual(e.current_user['uuid'],
run_test_server.fixture('users')['active']['uuid'])
+ self.assertEqual(True, self.mnt.listen_for_events)
@noexit
def test_custom(self):
@@ -178,6 +184,16 @@ class MountArgsTest(unittest.TestCase):
e = self.check_ent_type(arvados_fuse.ProjectDirectory, 'my_home')
self.assertEqual(e.project_object['uuid'],
run_test_server.fixture('users')['active']['uuid'])
+ self.assertEqual(True, self.mnt.listen_for_events)
+
+ @noexit
+ def test_custom_no_listen(self):
+ args = arvados_fuse.command.ArgumentParser().parse_args([
+ '--mount-tmp', 'foo',
+ '--mount-tmp', 'bar',
+ '--foreground', self.mntdir])
+ self.mnt = arvados_fuse.command.Mount(args)
+ self.assertEqual(False, self.mnt.listen_for_events)
def test_custom_unsupported_layouts(self):
for name in ['.', '..', '', 'foo/bar', '/foo']:
commit 64e0a60330d73309c02e75d012249a28a32e1b9d
Author: Peter Amstutz <peter.amstutz at curoverse.com>
Date: Fri Feb 5 16:39:25 2016 -0500
8285: Add want_event_subscribe flag to subclasses of fusedir.Directory,
determine whether to call listen_for_events based on it.
diff --git a/services/fuse/arvados_fuse/command.py b/services/fuse/arvados_fuse/command.py
index 6d53004..c4b0df3 100644
--- a/services/fuse/arvados_fuse/command.py
+++ b/services/fuse/arvados_fuse/command.py
@@ -95,6 +95,7 @@ class Mount(object):
def __init__(self, args, logger=logging.getLogger('arvados.arv-mount')):
self.logger = logger
self.args = args
+ self.listen_for_events = False
self.args.mountpoint = os.path.realpath(self.args.mountpoint)
if self.args.logfile:
@@ -110,7 +111,7 @@ class Mount(object):
def __enter__(self):
llfuse.init(self.operations, self.args.mountpoint, self._fuse_options())
- if self.args.mode != 'by_pdh':
+ if self.listen_for_events:
self.operations.listen_for_events()
self.llfuse_thread = threading.Thread(None, lambda: self._llfuse_main())
self.llfuse_thread.daemon = True
@@ -240,7 +241,9 @@ class Mount(object):
mount_readme = True
if dir_class is not None:
- self.operations.inodes.add_entry(dir_class(*dir_args))
+ ent = dir_class(*dir_args)
+ self.operations.inodes.add_entry(ent)
+ self.listen_for_events = ent.want_event_subscribe()
return
e = self.operations.inodes.add_entry(Directory(
@@ -270,6 +273,7 @@ class Mount(object):
if name in ['', '.', '..'] or '/' in name:
sys.exit("Mount point '{}' is not supported.".format(name))
tld._entries[name] = self.operations.inodes.add_entry(ent)
+ self.listen_for_events = (self.listen_for_events or ent.want_event_subscribe())
def _readme_text(self, api_host, user_email):
return '''
@@ -325,7 +329,8 @@ From here, the following directories are available:
self.daemon_ctx.open()
# Subscribe to change events from API server
- self.operations.listen_for_events()
+ if self.listen_for_events:
+ self.operations.listen_for_events()
self._llfuse_main()
except Exception as e:
diff --git a/services/fuse/arvados_fuse/fusedir.py b/services/fuse/arvados_fuse/fusedir.py
index 4c4dbc8..e36f66b 100644
--- a/services/fuse/arvados_fuse/fusedir.py
+++ b/services/fuse/arvados_fuse/fusedir.py
@@ -184,6 +184,9 @@ class Directory(FreshBase):
def flush(self):
pass
+ def want_event_subscribe(self):
+ raise NotImplementedError()
+
def create(self, name):
raise NotImplementedError()
@@ -351,6 +354,9 @@ class CollectionDirectory(CollectionDirectoryBase):
def writable(self):
return self.collection.writable() if self.collection is not None else self._writable
+ def want_event_subscribe(self):
+ return (uuid_pattern.match(self.collection_locator) is not None)
+
# Used by arv-web.py to switch the contents of the CollectionDirectory
def change_collection(self, new_locator):
"""Switch the contents of the CollectionDirectory.
@@ -544,6 +550,9 @@ class TmpCollectionDirectory(CollectionDirectoryBase):
def writable(self):
return True
+ def want_event_subscribe(self):
+ return False
+
def finalize(self):
self.collection.stop_threads()
@@ -629,6 +638,8 @@ will appear if it exists.
def clear(self, force=False):
pass
+ def want_event_subscribe(self):
+ return not self.pdh_only
class RecursiveInvalidateDirectory(Directory):
def invalidate(self):
@@ -678,6 +689,9 @@ class TagDirectory(Directory):
self._poll = poll
self._poll_time = poll_time
+ def want_event_subscribe(self):
+ return True
+
@use_counter
def update(self):
with llfuse.lock_released:
@@ -709,6 +723,9 @@ class ProjectDirectory(Directory):
self._updating_lock = threading.Lock()
self._current_user = None
+ def want_event_subscribe(self):
+ return True
+
def createDirectory(self, i):
if collection_uuid_pattern.match(i['uuid']):
return CollectionDirectory(self.inode, self.inodes, self.api, self.num_retries, i)
-----------------------------------------------------------------------
hooks/post-receive
--
More information about the arvados-commits
mailing list