Răsfoiți Sursa

remove unnecessary open+read for mtime+size cache

Peter Bieringer 2 luni în urmă
părinte
comite
4f8c3fff05
1 a modificat fișierele cu 21 adăugiri și 2 ștergeri
  1. 21 2
      radicale/storage/multifilesystem/get.py

+ 21 - 2
radicale/storage/multifilesystem/get.py

@@ -68,8 +68,21 @@ class CollectionPartGet(CollectionPartCache, CollectionPartLock,
         else:
             path = os.path.join(self._filesystem_path, href)
         try:
-            with open(path, "rb") as f:
-                raw_text = f.read()
+            if self._storage._use_mtime_and_size_for_item_cache is True:
+                # try to avoid "open"
+                if not os.path.isfile(path):
+                    if not os.path.exists(path):
+                        raise FileNotFoundError(path)
+                    if os.path.isdir(path):
+                        raise IsADirectoryError(path)
+                if not os.access(path, os.R_OK):
+                    raise PermissionError(path)
+            else:
+                with open(path, "rb") as f:
+                    # early read of the content
+                    if self._storage._debug_cache_actions is True:
+                        logger.debug("Item cache early read: %r", path)
+                    raw_text = f.read()
         except (FileNotFoundError, IsADirectoryError):
             return None
         except PermissionError:
@@ -100,6 +113,12 @@ class CollectionPartGet(CollectionPartCache, CollectionPartLock,
                     # Check if another process created the file in the meantime
                     cache_content = self._load_item_cache(href, cache_hash)
                 if cache_content is None:
+                    if self._storage._use_mtime_and_size_for_item_cache is True:
+                        # delayed read of the content
+                        if self._storage._debug_cache_actions is True:
+                            logger.debug("Item cache late read : %r", path)
+                        with open(path, "rb") as f:
+                            raw_text = f.read()
                     try:
                         vobject_items = radicale_item.read_components(
                             raw_text.decode(self._encoding))