Skip to content

Commit 58365a3

Browse files
committed
fix: CachedRegionsProvider shrink not working
1 parent 04c50c4 commit 58365a3

File tree

2 files changed

+91
-13
lines changed

2 files changed

+91
-13
lines changed

qiniu/http/regions_provider.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ def _parse_persisted_regions(persisted_data):
319319
_get_region_from_persisted(d)
320320
for d in parsed_data.get('regions', [])
321321
]
322-
return parsed_data.get('cache_key'), regions
322+
return parsed_data.get('cacheKey'), regions
323323

324324

325325
def _walk_persist_cache_file(persist_path, ignore_parse_error=False):
@@ -601,15 +601,17 @@ def __should_shrink(self):
601601
-------
602602
bool
603603
"""
604-
return self._cache_scope.last_shrink_at + self._cache_scope.shrink_interval >= datetime.datetime.now()
604+
return datetime.datetime.now() - self._cache_scope.last_shrink_at > self._cache_scope.shrink_interval
605605

606606
def __shrink_cache(self):
607607
# shrink memory cache
608608
if self._cache_scope.should_shrink_expired_regions:
609+
kept_memo_cache = {}
609610
for k, regions in self._cache_scope.memo_cache.items():
610-
live_regions = [r.is_live for r in regions]
611+
live_regions = [r for r in regions if r.is_live]
611612
if live_regions:
612-
self._cache_scope.memo_cache[k] = live_regions
613+
kept_memo_cache[k] = live_regions
614+
self._cache_scope = self._cache_scope._replace(memo_cache=kept_memo_cache)
613615

614616
# shrink file cache
615617
if not self._cache_scope.persist_path:

tests/cases/test_http/test_regions_provider.py

Lines changed: 85 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,18 @@ def cached_regions_provider(request):
9595
pass
9696

9797

98+
@pytest.fixture(scope='function')
99+
def bad_regions_provider():
100+
regions_provider = QueryRegionsProvider(
101+
access_key='fake',
102+
bucket_name='fake',
103+
endpoints_provider=[
104+
Endpoint('fake-uc.python.qiniu.com')
105+
]
106+
)
107+
yield regions_provider
108+
109+
98110
class TestCachedQueryRegionsProvider:
99111
@pytest.mark.parametrize(
100112
'cached_regions_provider',
@@ -178,14 +190,78 @@ def test_getter_with_base_regions_provider(self, cached_regions_provider):
178190
line_num += 1
179191
assert line_num == 1
180192

181-
def test_should_provide_memo_expired_regions_when_base_provider_failed(self):
182-
pass
183-
184-
def test_should_provide_file_expired_regions_when_base_provider_failed(self):
185-
pass
193+
@pytest.mark.parametrize(
194+
'cached_regions_provider',
195+
[
196+
{
197+
'persist_path': os.path.join(tempfile.gettempdir(), 'test-base-provider.jsonl')
198+
}
199+
],
200+
indirect=True
201+
)
202+
def test_should_provide_memo_expired_regions_when_base_provider_failed(
203+
self,
204+
cached_regions_provider,
205+
bad_regions_provider
206+
):
207+
expired_region = Region.from_region_id('z0')
208+
expired_region.create_time = datetime.datetime.fromtimestamp(0)
209+
expired_region.ttl = 1
210+
cached_regions_provider.set_regions([expired_region])
211+
cached_regions_provider.base_regions_provider = bad_regions_provider
212+
regions = list(cached_regions_provider)
213+
assert len(regions) > 0
214+
assert not regions[0].is_live
186215

187-
def test_shrink_normally(self):
188-
pass
216+
@pytest.mark.parametrize(
217+
'cached_regions_provider',
218+
[
219+
{
220+
'persist_path': os.path.join(tempfile.gettempdir(), 'test-base-provider.jsonl')
221+
}
222+
],
223+
indirect=True
224+
)
225+
def test_should_provide_file_expired_regions_when_base_provider_failed(
226+
self,
227+
cached_regions_provider,
228+
bad_regions_provider
229+
):
230+
expired_region = Region.from_region_id('z0')
231+
expired_region.create_time = datetime.datetime.fromtimestamp(0)
232+
expired_region.ttl = 1
233+
cached_regions_provider.set_regions([expired_region])
234+
cached_regions_provider._cache_scope.memo_cache.clear()
235+
cached_regions_provider.base_regions_provider = bad_regions_provider
236+
regions = list(cached_regions_provider)
237+
assert len(regions) > 0
238+
assert not regions[0].is_live
189239

190-
def test_shrink_with_ignore_expired_regions(self):
191-
pass
240+
@pytest.mark.parametrize(
241+
'cached_regions_provider',
242+
[
243+
{
244+
'should_shrink_expired_regions': True
245+
}
246+
],
247+
indirect=True
248+
)
249+
def test_shrink_with_expired_regions(self, cached_regions_provider):
250+
expired_region = Region.from_region_id('z0')
251+
expired_region.create_time = datetime.datetime.fromtimestamp(0)
252+
expired_region.ttl = 1
253+
origin_cache_key = cached_regions_provider.cache_key
254+
cached_regions_provider.set_regions([expired_region])
255+
cached_regions_provider.cache_key = 'another-cache-key'
256+
list(cached_regions_provider) # trigger __shrink_cache()
257+
assert len(cached_regions_provider._cache_scope.memo_cache[origin_cache_key]) == 0
258+
259+
def test_shrink_with_ignore_expired_regions(self, cached_regions_provider):
260+
expired_region = Region.from_region_id('z0')
261+
expired_region.create_time = datetime.datetime.fromtimestamp(0)
262+
expired_region.ttl = 1
263+
origin_cache_key = cached_regions_provider.cache_key
264+
cached_regions_provider.set_regions([expired_region])
265+
cached_regions_provider.cache_key = 'another-cache-key'
266+
list(cached_regions_provider) # trigger __shrink_cache()
267+
assert len(cached_regions_provider._cache_scope.memo_cache[origin_cache_key]) > 0

0 commit comments

Comments
 (0)