Skip to content

Commit 74a2580

Browse files
committed
Keep block caches usable after pickling
1 parent 669de5e commit 74a2580

3 files changed

Lines changed: 13 additions & 3 deletions

File tree

docs/source/changelog.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
Changelog
22
=========
33

4+
Dev
5+
---
6+
7+
Fixes
8+
9+
- Avoid mutating live ``BlockCache`` and ``BackgroundBlockCache`` instances
10+
when pickling (#2102)
11+
412
2026.7.0
513
--------
614

fsspec/caching.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,7 @@ def cache_info(self):
375375
return self._fetch_block_cached.cache_info()
376376

377377
def __getstate__(self) -> dict[str, Any]:
378-
state = self.__dict__
378+
state = self.__dict__.copy()
379379
del state["_fetch_block_cached"]
380380
return state
381381

@@ -832,7 +832,7 @@ def close(self) -> None:
832832
del self._fetch_block_cached
833833

834834
def __getstate__(self) -> dict[str, Any]:
835-
state = self.__dict__
835+
state = self.__dict__.copy()
836836
del state["_fetch_block_cached"]
837837
del state["_thread_executor"]
838838
del state["_fetch_future_block_number"]

fsspec/tests/test_caches.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,9 @@ def test_cache_pickleable(Cache_imp):
194194
size = 100
195195
cache = Cache_imp(blocksize, _fetcher, size)
196196
cache._fetch(0, 5) # fill in cache
197-
unpickled = pickle.loads(pickle.dumps(cache))
197+
payload = pickle.dumps(cache)
198+
assert cache._fetch(0, 10) == b"0" * 10
199+
unpickled = pickle.loads(payload)
198200
assert isinstance(unpickled, Cache_imp)
199201
assert unpickled.blocksize == blocksize
200202
assert unpickled.size == size

0 commit comments

Comments
 (0)