8
8
from zarr .abc .store import ByteRequest , Store
9
9
from zarr .storage ._wrapper import WrapperStore
10
10
11
- logging .basicConfig (level = logging .INFO )
12
11
logger = logging .getLogger (__name__ )
13
12
14
13
if TYPE_CHECKING :
@@ -115,11 +114,6 @@ def _is_key_fresh(self, key: str) -> bool:
115
114
elapsed = now - self .key_insert_times .get (key , 0 )
116
115
return elapsed < self .max_age_seconds
117
116
118
- def _get_cache_size (self , key : str ) -> int :
119
- """Get the size of a cached item."""
120
- # For now, we'll estimate by getting the data when we cache it
121
- return 0 # Will be properly set when caching
122
-
123
117
async def _accommodate_value (self , value_size : int ) -> None :
124
118
"""Ensure there is enough space in the cache for a new value."""
125
119
if self .max_size is None :
@@ -132,28 +126,24 @@ async def _accommodate_value(self, value_size: int) -> None:
132
126
await self ._evict_key (lru_key )
133
127
134
128
async def _evict_key (self , key : str ) -> None :
135
- """Remove a key from cache and update size tracking."""
136
129
try :
137
- # Get the size of the key being evicted
138
130
key_size = self ._key_sizes .get (key , 0 )
131
+ # Delete from cache store FIRST
132
+ await self ._cache .delete (key )
139
133
140
- # Remove from tracking structures
134
+ # Only update tracking after successful deletion
141
135
if key in self ._cache_order :
142
136
del self ._cache_order [key ]
143
137
if key in self .key_insert_times :
144
138
del self .key_insert_times [key ]
145
139
if key in self ._key_sizes :
146
140
del self ._key_sizes [key ]
147
141
148
- # Update current size
149
142
self ._current_size = max (0 , self ._current_size - key_size )
150
-
151
- # Actually delete from cache store
152
- await self ._cache .delete (key )
153
-
154
- logger .info ("_evict_key: evicted key %s from cache, size %d" , key , key_size )
143
+ logger .info ("_evict_key: evicted key %s, freed %d bytes" , key , key_size )
155
144
except Exception as e :
156
145
logger .warning ("_evict_key: failed to evict key %s: %s" , key , e )
146
+ # Don't update tracking if deletion failed
157
147
158
148
async def _cache_value (self , key : str , value : Any ) -> None :
159
149
"""Cache a value with size tracking."""
@@ -209,17 +199,7 @@ async def _get_try_cache(
209
199
logger .info ("_get_try_cache: key %s found in cache" , key )
210
200
# Update access order for LRU
211
201
self ._update_access_order (key )
212
- # Verify the key still exists in source store before returning cached data
213
- if await super ().exists (key ):
214
- return maybe_cached_result
215
- else :
216
- # Key no longer exists in source, clean up cache
217
- logger .info (
218
- "_get_try_cache: key %s no longer exists in source, cleaning up cache" , key
219
- )
220
- await self ._cache .delete (key )
221
- self ._remove_from_tracking (key )
222
- return None
202
+ return maybe_cached_result
223
203
else :
224
204
logger .info ("_get_try_cache: key %s not found in cache, fetching from store" , key )
225
205
maybe_fresh_result = await super ().get (key , prototype , byte_range )
0 commit comments