summaryrefslogtreecommitdiff
path: root/requests_cache/backends
diff options
context:
space:
mode:
authorJordan Cook <jordan.cook@pioneer.com>2022-02-22 19:21:11 -0600
committerJordan Cook <jordan.cook@pioneer.com>2022-02-22 20:11:02 -0600
commit3453ae6eac2ae0bf9f40ac8ce45609005beb1cc7 (patch)
treed7958f825193fbc90f02882d38eaadb6f41502f5 /requests_cache/backends
parentfe82501662a1a502eb02ba132965596bceebed43 (diff)
downloadrequests-cache-3453ae6eac2ae0bf9f40ac8ce45609005beb1cc7.tar.gz
Handle CorruptGridFile error in GridFS backend
Diffstat (limited to 'requests_cache/backends')
-rw-r--r--requests_cache/backends/gridfs.py17
1 files changed, 11 insertions, 6 deletions
diff --git a/requests_cache/backends/gridfs.py b/requests_cache/backends/gridfs.py
index db31ba4..c9599b7 100644
--- a/requests_cache/backends/gridfs.py
+++ b/requests_cache/backends/gridfs.py
@@ -15,7 +15,7 @@ from logging import getLogger
from threading import RLock
from gridfs import GridFS
-from gridfs.errors import FileExists
+from gridfs.errors import CorruptGridFile, FileExists
from pymongo import MongoClient
from .._utils import get_valid_kwargs
@@ -69,11 +69,15 @@ class GridFSPickleDict(BaseStorage):
self._lock = RLock()
def __getitem__(self, key):
- with self._lock:
- result = self.fs.find_one({'_id': key})
- if result is None:
- raise KeyError
- return self.serializer.loads(result.read())
+ try:
+ with self._lock:
+ result = self.fs.find_one({'_id': key})
+ if result is None:
+ raise KeyError
+ return self.serializer.loads(result.read())
+ except CorruptGridFile as e:
+ logger.warning(e, exc_info=True)
+ raise KeyError
def __setitem__(self, key, item):
value = self.serializer.dumps(item)
@@ -83,6 +87,7 @@ class GridFSPickleDict(BaseStorage):
try:
self.fs.delete(key)
self.fs.put(value, encoding=encoding, **{'_id': key})
+ # This can happen because GridFS is not thread-safe for concurrent writes
except FileExists as e:
logger.warning(e, exc_info=True)