Merge branch 'master' into 7329-empty-block-issue
[arvados.git] / services / fuse / arvados_fuse / fusedir.py
index 50ea0eaa3f07268ffd770996379e41203fc43c8e..8ffca49601d795fc0622326e04eb219dd3dd0d8d 100644 (file)
@@ -23,6 +23,7 @@ _logger = logging.getLogger('arvados.arvados_fuse')
 # appear as underscores in the fuse mount.)
 _disallowed_filename_characters = re.compile('[\x00/]')
 
+# '.' and '..' are not reachable if API server is newer than #6277
 def sanitize_filename(dirty):
     """Replace disallowed filename characters with harmless "_"."""
     if dirty is None:
@@ -238,30 +239,18 @@ class CollectionDirectoryBase(Directory):
             name = sanitize_filename(name)
             _logger.debug("collection notify %s %s %s %s", event, collection, name, item)
             with llfuse.lock:
-                _logger.debug("on_event got llfuse.lock %s %s %s", event, collection, name)
                 if event == arvados.collection.ADD:
                     self.new_entry(name, item, self.mtime())
                 elif event == arvados.collection.DEL:
-                    _logger.debug("on_event (1) %s %s %s", event, collection, name)
                     ent = self._entries[name]
-                    _logger.debug("on_event (2) %s %s %s", event, collection, name)
                     del self._entries[name]
-
-                    _logger.debug("on_event (3) %s %s %s", event, collection, name)
-
                     self.inodes.invalidate_entry(self.inode, name.encode(self.inodes.encoding))
-
-                    _logger.debug("on_event (4) %s %s %s", event, collection, name)
-
                     self.inodes.del_entry(ent)
-
-                    _logger.debug("on_event (5) %s %s %s", event, collection, name)
                 elif event == arvados.collection.MOD:
                     if hasattr(item, "fuse_entry") and item.fuse_entry is not None:
                         self.inodes.invalidate_inode(item.fuse_entry.inode)
                     elif name in self._entries:
                         self.inodes.invalidate_inode(self._entries[name].inode)
-                _logger.debug("on_event completed %s %s %s", event, collection, name)
 
     def populate(self, mtime):
         self._mtime = mtime
@@ -435,8 +424,8 @@ class CollectionDirectory(CollectionDirectoryBase):
                 return True
             finally:
                 self._updating_lock.release()
-        except arvados.errors.NotFoundError:
-            _logger.exception("arv-mount %s: error", self.collection_locator)
+        except arvados.errors.NotFoundError as e:
+            _logger.error("Error fetching collection '%s': %s", self.collection_locator, e)
         except arvados.errors.ArgumentError as detail:
             _logger.warning("arv-mount %s: error %s", self.collection_locator, detail)
             if self.collection_record is not None and "manifest_text" in self.collection_record:
@@ -536,12 +525,17 @@ will appear if it exists.
                     self.inode, self.inodes, self.api, self.num_retries, k))
 
             if e.update():
-                self._entries[k] = e
+                if k not in self._entries:
+                    self._entries[k] = e
+                else:
+                    self.inodes.del_entry(e)
                 return True
             else:
+                self.inodes.del_entry(e)
                 return False
         except Exception as e:
             _logger.debug('arv-mount exception keep %s', e)
+            self.inodes.del_entry(e)
             return False
 
     def __getitem__(self, item):