X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/aa924bec2e4b5c029cb19f4e9021d72b665be76b..8b3478bda6764b3f30aef69ec0a93729495296c0:/services/fuse/arvados_fuse/__init__.py diff --git a/services/fuse/arvados_fuse/__init__.py b/services/fuse/arvados_fuse/__init__.py index c4b9f7e91e..fd25aa9b5e 100644 --- a/services/fuse/arvados_fuse/__init__.py +++ b/services/fuse/arvados_fuse/__init__.py @@ -66,6 +66,7 @@ import itertools import ciso8601 import collections import functools +import arvados.keep import Queue @@ -148,7 +149,9 @@ class InodeCache(object): self._total -= obj.cache_size del self._entries[obj.cache_priority] if obj.cache_uuid: - del self._by_uuid[obj.cache_uuid] + self._by_uuid[obj.cache_uuid].remove(obj) + if not self._by_uuid[obj.cache_uuid]: + del self._by_uuid[obj.cache_uuid] obj.cache_uuid = None if clear: _logger.debug("InodeCache cleared %i total now %i", obj.inode, self._total) @@ -168,9 +171,13 @@ class InodeCache(object): self._entries[obj.cache_priority] = obj obj.cache_uuid = obj.uuid() if obj.cache_uuid: - self._by_uuid[obj.cache_uuid] = obj + if obj.cache_uuid not in self._by_uuid: + self._by_uuid[obj.cache_uuid] = [obj] + else: + if obj not in self._by_uuid[obj.cache_uuid]: + self._by_uuid[obj.cache_uuid].append(obj) self._total += obj.objsize() - _logger.debug("InodeCache touched %i (size %i) total now %i", obj.inode, obj.objsize(), self._total) + _logger.debug("InodeCache touched %i (size %i) (uuid %s) total now %i", obj.inode, obj.objsize(), obj.cache_uuid, self._total) self.cap_cache() else: obj.cache_priority = None @@ -317,6 +324,11 @@ class Operations(llfuse.Operations): self.num_retries = num_retries + self.read_counter = arvados.keep.Counter() + self.write_counter = arvados.keep.Counter() + self.read_ops_counter = arvados.keep.Counter() + self.write_ops_counter = arvados.keep.Counter() + self.events = None def init(self): @@ -344,20 +356,21 @@ class Operations(llfuse.Operations): def on_event(self, ev): if 'event_type' in ev: with llfuse.lock: - item = self.inodes.inode_cache.find(ev["object_uuid"]) - if item is not None: - item.invalidate() - if ev["object_kind"] == "arvados#collection": - new_attr = ev.get("properties") and ev["properties"].get("new_attributes") and ev["properties"]["new_attributes"] - - # new_attributes.modified_at currently lacks subsecond precision (see #6347) so use event_at which - # should always be the same. - #record_version = (new_attr["modified_at"], new_attr["portable_data_hash"]) if new_attr else None - record_version = (ev["event_at"], new_attr["portable_data_hash"]) if new_attr else None - - item.update(to_record_version=record_version) - else: - item.update() + items = self.inodes.inode_cache.find(ev["object_uuid"]) + if items is not None: + for item in items: + item.invalidate() + if ev["object_kind"] == "arvados#collection": + new_attr = ev.get("properties") and ev["properties"].get("new_attributes") and ev["properties"]["new_attributes"] + + # new_attributes.modified_at currently lacks subsecond precision (see #6347) so use event_at which + # should always be the same. + #record_version = (new_attr["modified_at"], new_attr["portable_data_hash"]) if new_attr else None + record_version = (ev["event_at"], new_attr["portable_data_hash"]) if new_attr else None + + item.update(to_record_version=record_version) + else: + item.update() oldowner = ev.get("properties") and ev["properties"].get("old_attributes") and ev["properties"]["old_attributes"].get("owner_uuid") olditemparent = self.inodes.inode_cache.find(oldowner) @@ -477,6 +490,8 @@ class Operations(llfuse.Operations): @catch_exceptions def read(self, fh, off, size): _logger.debug("arv-mount read %i %i %i", fh, off, size) + self.read_ops_counter.add(1) + if fh in self._filehandles: handle = self._filehandles[fh] else: @@ -484,11 +499,16 @@ class Operations(llfuse.Operations): self.inodes.touch(handle.obj) - return handle.obj.readfrom(off, size, self.num_retries) + r = handle.obj.readfrom(off, size, self.num_retries) + if r: + self.read_counter.add(len(r)) + return r @catch_exceptions def write(self, fh, off, buf): _logger.debug("arv-mount write %i %i %i", fh, off, len(buf)) + self.write_ops_counter.add(1) + if fh in self._filehandles: handle = self._filehandles[fh] else: @@ -499,7 +519,10 @@ class Operations(llfuse.Operations): self.inodes.touch(handle.obj) - return handle.obj.writeto(off, buf, self.num_retries) + w = handle.obj.writeto(off, buf, self.num_retries) + if w: + self.write_counter.add(w) + return w @catch_exceptions def release(self, fh):