diff options
| author | Jordan Cook <jordan.cook@pioneer.com> | 2022-02-22 19:21:11 -0600 |
|---|---|---|
| committer | Jordan Cook <jordan.cook@pioneer.com> | 2022-02-22 20:11:02 -0600 |
| commit | 3453ae6eac2ae0bf9f40ac8ce45609005beb1cc7 (patch) | |
| tree | d7958f825193fbc90f02882d38eaadb6f41502f5 /requests_cache/backends | |
| parent | fe82501662a1a502eb02ba132965596bceebed43 (diff) | |
| download | requests-cache-3453ae6eac2ae0bf9f40ac8ce45609005beb1cc7.tar.gz | |
Handle CorruptGridFile error in GridFS backend
Diffstat (limited to 'requests_cache/backends')
| -rw-r--r-- | requests_cache/backends/gridfs.py | 17 |
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) |
