Explorar o código

Merge pull request #1936 from pbiering/improve-mtime-size-cache

Improve mtime size cache for get request
Peter Bieringer hai 2 meses
pai
achega
f4c6f3899b
Modificáronse 2 ficheiros con 22 adicións e 2 borrados
  1. 1 0
      CHANGELOG.md
  2. 21 2
      radicale/storage/multifilesystem/get.py

+ 1 - 0
CHANGELOG.md

@@ -8,6 +8,7 @@
 * Extend: [logging] with profiling log per reqest or regular per request method
 * New: [logging] option to log response header on debug loglevel
 * Adjust: [logging] header/content debug log indended by space to be skipped by logwatch
+* Improve: remove unnecessary open+read for mtime+size cache
 
 ## 3.5.9
 * Extend: [auth] add support for type http_remote_user

+ 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))