[ARVADOS] updated: ef6ab39ebdf8519ea6a2bfd2d658469eb3917f47
git at public.curoverse.com
git at public.curoverse.com
Thu Aug 28 17:12:12 EDT 2014
Summary of changes:
sdk/python/arvados/util.py | 11 ++++
services/fuse/arvados_fuse/__init__.py | 115 ++++++++++++++++++---------------
2 files changed, 73 insertions(+), 53 deletions(-)
via ef6ab39ebdf8519ea6a2bfd2d658469eb3917f47 (commit)
from 701c816ee3d87b7064cdced3a3c11befd3867a3f (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 ef6ab39ebdf8519ea6a2bfd2d658469eb3917f47
Author: Peter Amstutz <peter.amstutz at curoverse.com>
Date: Thu Aug 28 17:12:09 2014 -0400
3644: Working on adding timestamps
diff --git a/sdk/python/arvados/util.py b/sdk/python/arvados/util.py
index 22a7427..0cfa78c 100644
--- a/sdk/python/arvados/util.py
+++ b/sdk/python/arvados/util.py
@@ -330,3 +330,14 @@ def is_hex(s, *length_args):
else:
good_len = True
return bool(good_len and HEX_RE.match(s))
+
+def all_contents(api, uuid):
+ items = []
+ offset = 0
+ items_available = sys.maxint
+ while len(items) < items_available:
+ c = api.groups().contents(uuid=uuid, offset=offset).execute()
+ items += c['items']
+ items_available = c['items_available']
+ offset = c['offset'] + len(c['items'])
+ return items
diff --git a/services/fuse/arvados_fuse/__init__.py b/services/fuse/arvados_fuse/__init__.py
index a2a5166..4a08136 100644
--- a/services/fuse/arvados_fuse/__init__.py
+++ b/services/fuse/arvados_fuse/__init__.py
@@ -46,6 +46,12 @@ class FreshBase(object):
self._stale = False
self._last_update = time()
+ def ctime():
+ return 0
+
+ def mtime():
+ return 0
+
class File(FreshBase):
'''Base for file objects.'''
@@ -65,9 +71,10 @@ class File(FreshBase):
class StreamReaderFile(File):
'''Wraps a StreamFileReader as a file.'''
- def __init__(self, parent_inode, reader):
+ def __init__(self, parent_inode, reader, collection):
super(StreamReaderFile, self).__init__(parent_inode)
self.reader = reader
+ self.collection = collection
def size(self):
return self.reader.size()
@@ -78,6 +85,12 @@ class StreamReaderFile(File):
def stale(self):
return False
+ def ctime():
+ return collection["created_at"]
+
+ def mtime():
+ return collection["modified_at"]
+
class ObjectFile(File):
'''Wraps a dict as a serialized json object.'''
@@ -166,7 +179,9 @@ class Directory(FreshBase):
self._entries[n] = oldentries[n]
del oldentries[n]
else:
- self._entries[n] = self.inodes.add_entry(new_entry(i))
+ ent = new_entry(i)
+ if ent is not None:
+ self._entries[n] = self.inodes.add_entry(ent)
for n in oldentries:
llfuse.invalidate_entry(self.inode, str(n))
self.inodes.del_entry(oldentries[n])
@@ -237,7 +252,19 @@ class MagicDirectory(Directory):
else:
raise KeyError("No collection with id " + item)
-class TagsDirectory(Directory):
+class RecursiveInvalidateDirectory(Directory):
+ def invalidate(self):
+ try:
+ if self.parent_inode == llfuse.ROOT_INODE:
+ llfuse.lock.acquire()
+ super(RecursiveInvalidateDirectory, self).invalidate()
+ for a in self._entries:
+ self._entries[a].invalidate()
+ finally:
+ if self.parent_inode == llfuse.ROOT_INODE:
+ llfuse.lock.release()
+
+class TagsDirectory(RecursiveInvalidateDirectory):
'''A special directory that contains as subdirectories all tags visible to the user.'''
def __init__(self, parent_inode, inodes, api, poll_time=60):
@@ -250,12 +277,6 @@ class TagsDirectory(Directory):
self._poll = True
self._poll_time = poll_time
- def invalidate(self):
- with llfuse.lock:
- super(TagsDirectory, self).invalidate()
- for a in self._entries:
- self._entries[a].invalidate()
-
def update(self):
tags = self.api.links().list(filters=[['link_class', '=', 'tag']], select=['name'], distinct = True).execute()
if "items" in tags:
@@ -288,35 +309,7 @@ class TagDirectory(Directory):
lambda i: CollectionDirectory(self.inode, self.inodes, i['head_uuid']))
-class HomeDirectory(Directory):
- '''A special directory that represents the "home" project.'''
-
- def __init__(self, parent_inode, inodes, api, poll_time=60):
- super(HomeDirectory, self).__init__(parent_inode)
- self.inodes = inodes
- self.api = api
- try:
- arvados.events.subscribe(self.api, [], lambda ev: self.invalidate())
- except:
- self._poll = True
- self._poll_time = poll_time
-
- def invalidate(self):
- with llfuse.lock:
- super(HomeDirectory, self).invalidate()
- for a in self._entries:
- self._entries[a].invalidate()
-
- def update(self):
- groups = self.api.groups().list(
- filters=[['group_class','=','project']]).execute()
- self.merge(groups['items'],
- lambda i: i['uuid'],
- lambda a, i: a.uuid == i['uuid'],
- lambda i: ProjectDirectory(self.inode, self.inodes, self.api, i, poll=self._poll, poll_time=self._poll_time))
-
-
-class ProjectDirectory(Directory):
+class ProjectDirectory(RecursiveInvalidateDirectory):
'''A special directory that contains the contents of a project.'''
def __init__(self, parent_inode, inodes, api, uuid, poll=False, poll_time=60):
@@ -324,27 +317,34 @@ class ProjectDirectory(Directory):
self.inodes = inodes
self.api = api
self.uuid = uuid['uuid']
- self._poll = poll
- self._poll_time = poll_time
- def invalidate(self):
- with llfuse.lock:
- super(ProjectDirectory, self).invalidate()
- for a in self._entries:
- self._entries[a].invalidate()
+ if parent_inode == llfuse.ROOT_INODE:
+ try:
+ arvados.events.subscribe(self.api, [], lambda ev: self.invalidate())
+ except:
+ self._poll = True
+ self._poll_time = poll_time
+ else:
+ self._poll = poll
+ self._poll_time = poll_time
+
def createDirectory(self, i):
- if re.match(r'[a-z0-9]{5}-4zz18-[a-z0-9]{15}', i['uuid']):
+ if re.match(r'[a-z0-9]{5}-4zz18-[a-z0-9]{15}', i['uuid']) and i['name'] is not None:
return CollectionDirectory(self.inode, self.inodes, i['uuid'])
elif re.match(r'[a-z0-9]{5}-j7d0g-[a-z0-9]{15}', i['uuid']):
return ProjectDirectory(self.parent_inode, self.inodes, self.api, i, self._poll, self._poll_time)
- elif re.match(r'[a-z0-9]{5}-[a-z0-9]{5}-[a-z0-9]{15}', i['uuid']):
- return ObjectFile(self.parent_inode, i)
- return None
+ #elif re.match(r'[a-z0-9]{5}-8i9sb-[a-z0-9]{15}', i['uuid']):
+ # return None
+ #elif re.match(r'[a-z0-9]{5}-[a-z0-9]{5}-[a-z0-9]{15}', i['uuid']):
+ # return ObjectFile(self.parent_inode, i)
+ else:
+ return None
- def update(self):
- contents = self.api.groups().contents(uuid=self.uuid).execute()
+ def contents(self):
+ return arvados.util.all_contents(self.api, self.uuid)
+ def update(self):
def same(a, i):
if isinstance(a, CollectionDirectory):
return a.collection_locator == i['uuid']
@@ -354,12 +354,21 @@ class ProjectDirectory(Directory):
return a.uuid == i['uuid'] and not a.stale()
return False
- self.merge(contents['items'],
- lambda i: i['uuid'],
+ self.merge(self.contents(),
+ lambda i: i['name'] if 'name' in i and i['name'] is not None and len(i['name']) > 0 else i['uuid'],
same,
self.createDirectory)
+class HomeDirectory(ProjectDirectory):
+ '''A special directory that represents the "home" project.'''
+
+ def __init__(self, parent_inode, inodes, api, poll=False, poll_time=60):
+ super(HomeDirectory, self).__init__(parent_inode, inodes, api, api.users().current().execute())
+
+ #def contents(self):
+ # return self.api.groups().contents(uuid=self.uuid).execute()['items']
+
class FileHandle(object):
'''Connects a numeric file handle to a File or Directory object that has
been opened by the client.'''
-----------------------------------------------------------------------
hooks/post-receive
--
More information about the arvados-commits
mailing list