|
@@ -14,26 +14,20 @@ from ..logger import create_logger
|
|
|
logger = create_logger()
|
|
|
|
|
|
|
|
|
-def find_chunks(repository, repo_objs, stats, ctype, clevel, olevel):
|
|
|
+def find_chunks(repository, repo_objs, cache, stats, ctype, clevel, olevel):
|
|
|
"""find chunks that need processing (usually: recompression)."""
|
|
|
recompress_ids = []
|
|
|
compr_keys = stats["compr_keys"] = set()
|
|
|
compr_wanted = ctype, clevel, olevel
|
|
|
- marker = None
|
|
|
- while True:
|
|
|
- result = repository.list(limit=LIST_SCAN_LIMIT, marker=marker)
|
|
|
- if not result:
|
|
|
- break
|
|
|
- marker = result[-1][0]
|
|
|
- chunk_ids = [id for id, _ in result]
|
|
|
- for id, chunk_no_data in zip(chunk_ids, repository.get_many(chunk_ids, read_data=False)):
|
|
|
- meta = repo_objs.parse_meta(id, chunk_no_data, ro_type=ROBJ_DONTCARE)
|
|
|
- compr_found = meta["ctype"], meta["clevel"], meta.get("olevel", -1)
|
|
|
- if compr_found != compr_wanted:
|
|
|
- recompress_ids.append(id)
|
|
|
- compr_keys.add(compr_found)
|
|
|
- stats[compr_found] += 1
|
|
|
- stats["checked_count"] += 1
|
|
|
+ for id, _ in cache.chunks.iteritems():
|
|
|
+ chunk_no_data = repository.get(id, read_data=False)
|
|
|
+ meta = repo_objs.parse_meta(id, chunk_no_data, ro_type=ROBJ_DONTCARE)
|
|
|
+ compr_found = meta["ctype"], meta["clevel"], meta.get("olevel", -1)
|
|
|
+ if compr_found != compr_wanted:
|
|
|
+ recompress_ids.append(id)
|
|
|
+ compr_keys.add(compr_found)
|
|
|
+ stats[compr_found] += 1
|
|
|
+ stats["checked_count"] += 1
|
|
|
return recompress_ids
|
|
|
|
|
|
|
|
@@ -88,8 +82,8 @@ def format_compression_spec(ctype, clevel, olevel):
|
|
|
|
|
|
|
|
|
class RepoCompressMixIn:
|
|
|
- @with_repository(cache=False, manifest=True, compatibility=(Manifest.Operation.CHECK,))
|
|
|
- def do_repo_compress(self, args, repository, manifest):
|
|
|
+ @with_repository(cache=True, manifest=True, compatibility=(Manifest.Operation.CHECK,))
|
|
|
+ def do_repo_compress(self, args, repository, manifest, cache):
|
|
|
"""Repository (re-)compression"""
|
|
|
|
|
|
def get_csettings(c):
|
|
@@ -110,7 +104,7 @@ class RepoCompressMixIn:
|
|
|
|
|
|
stats_find = defaultdict(int)
|
|
|
stats_process = defaultdict(int)
|
|
|
- recompress_ids = find_chunks(repository, repo_objs, stats_find, ctype, clevel, olevel)
|
|
|
+ recompress_ids = find_chunks(repository, repo_objs, cache, stats_find, ctype, clevel, olevel)
|
|
|
recompress_candidate_count = len(recompress_ids)
|
|
|
chunks_limit = min(1000, max(100, recompress_candidate_count // 1000))
|
|
|
|