recreate: normalize chunker params before comparing them, see #7079

borg < 1.2 did not have the chunker name as first element in the tuple,
but it always was buzhash, because there was no other chunker.
This commit is contained in:
Thomas Waldmann 2022-10-10 22:41:39 +02:00
parent a6207370a9
commit 651bef450d

View file

@ -28,7 +28,7 @@ from .crypto.low_level import IntegrityError as IntegrityErrorBase
from .hashindex import ChunkIndex, ChunkIndexEntry, CacheSynchronizer
from .helpers import Manifest
from .helpers import hardlinkable
from .helpers import ChunkIteratorFileWrapper, open_item
from .helpers import ChunkIteratorFileWrapper, normalize_chunker_params, open_item
from .helpers import Error, IntegrityError, set_ec
from .platform import uid2user, user2uid, gid2group, group2gid
from .helpers import parse_timestamp, to_localtime
@ -547,12 +547,14 @@ class Archive:
if self.create:
info['command_line'] = sys.argv
else:
cp = self.metadata.get('chunker_params')
cp = normalize_chunker_params(cp) if cp is not None else ''
info.update({
'command_line': self.metadata.cmdline,
'hostname': self.metadata.hostname,
'username': self.metadata.username,
'comment': self.metadata.get('comment', ''),
'chunker_params': self.metadata.get('chunker_params', ''),
'chunker_params': cp,
})
return info
@ -2302,13 +2304,12 @@ class ArchiveRecreater:
target_name = target_name or archive.name + '.recreate'
target = self.create_target_archive(target_name)
# If the archives use the same chunker params, then don't rechunkify
source_chunker_params = tuple(archive.metadata.get('chunker_params', []))
if len(source_chunker_params) == 4 and isinstance(source_chunker_params[0], int):
# this is a borg < 1.2 chunker_params tuple, no chunker algo specified, but we only had buzhash:
source_chunker_params = (CH_BUZHASH, ) + source_chunker_params
target.recreate_rechunkify = self.rechunkify and source_chunker_params != target.chunker_params
src_cp = archive.metadata.get('chunker_params')
src_cp = normalize_chunker_params(src_cp) if src_cp is not None else None
dst_cp = target.chunker_params
target.recreate_rechunkify = self.rechunkify and src_cp != dst_cp
if target.recreate_rechunkify:
logger.debug('Rechunking archive from %s to %s', source_chunker_params or '(unknown)', target.chunker_params)
logger.debug('Rechunking archive from %s to %s', src_cp or '(unknown)', dst_cp)
target.process_file_chunks = ChunksProcessor(
cache=self.cache, key=self.key,
add_item=target.add_item, write_checkpoint=target.write_checkpoint,