Mercurial > hg
changeset 42832:a3c2ffcd266f
upgrade: make sure we reclone all revlogs when updating to some format
Adding or removing some requirement (eg: sparserevlog), requires to reclone
revlog to use the new format. We cannot simply copy the original files.
In this case, we issue a warning to proceed with clone every revlogs.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Mon, 05 Aug 2019 17:25:24 +0200 |
parents | 908ff446590e |
children | 3f81d58aae25 |
files | mercurial/upgrade.py tests/test-upgrade-repo.t |
diffstat | 2 files changed, 120 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/upgrade.py Tue Jul 30 17:25:16 2019 +0200 +++ b/mercurial/upgrade.py Mon Aug 05 17:25:24 2019 +0200 @@ -28,6 +28,12 @@ compression, ) +# list of requirements that request a clone of all revlog if added/removed +RECLONES_REQUIREMENTS = { + 'generaldelta', + localrepo.SPARSEREVLOG_REQUIREMENT, +} + def requiredsourcerequirements(repo): """Obtain requirements required to be present to upgrade a repo. @@ -952,6 +958,17 @@ # determineactions could have added optimisation if o not in actions) + removedreqs = repo.requirements - newreqs + addedreqs = newreqs - repo.requirements + + if revlogs != UPGRADE_ALL_REVLOGS: + incompatible = RECLONES_REQUIREMENTS & (removedreqs | addedreqs) + if incompatible: + msg = _('ignoring revlogs selection flags, format requirements ' + 'change: %s\n') + ui.warn(msg % ', '.join(sorted(incompatible))) + revlogs = UPGRADE_ALL_REVLOGS + def printrequirements(): ui.write(_('requirements\n')) ui.write(_(' preserved: %s\n') %
--- a/tests/test-upgrade-repo.t Tue Jul 30 17:25:16 2019 +0200 +++ b/tests/test-upgrade-repo.t Mon Aug 05 17:25:24 2019 +0200 @@ -728,6 +728,109 @@ checking files checked 3 changesets with 3 changes to 3 files + +Check you can't skip revlog clone during important format downgrade + + $ echo "[format]" > .hg/hgrc + $ echo "sparse-revlog=no" >> .hg/hgrc + $ hg debugupgrade --optimize re-delta-parent --run --manifest --no-backup --debug --traceback + ignoring revlogs selection flags, format requirements change: sparserevlog + upgrade will perform the following actions: + + requirements + preserved: dotencode, fncache, generaldelta, revlogv1, store + removed: sparserevlog + + re-delta-parent + deltas within internal storage will choose a new base revision if needed + + beginning upgrade... + repository locked and read-only + creating temporary repository to stage migrated data: $TESTTMP/upgradegd/.hg/upgrade.* (glob) + (it is safe to interrupt this process any time before data migration completes) + migrating 9 total revisions (3 in filelogs, 3 in manifests, 3 in changelog) + migrating 917 bytes in store; 401 bytes tracked data + migrating 3 filelogs containing 3 revisions (192 bytes in store; 0 bytes tracked data) + cloning 1 revisions from data/f0.i + cloning 1 revisions from data/f1.i + cloning 1 revisions from data/f2.i + finished migrating 3 filelog revisions across 3 filelogs; change in size: 0 bytes + migrating 1 manifests containing 3 revisions (349 bytes in store; 220 bytes tracked data) + cloning 3 revisions from 00manifest.i + finished migrating 3 manifest revisions across 1 manifests; change in size: 0 bytes + migrating changelog containing 3 revisions (376 bytes in store; 181 bytes tracked data) + cloning 3 revisions from 00changelog.i + finished migrating 3 changelog revisions; change in size: 0 bytes + finished migrating 9 total revisions; total change in store size: 0 bytes + copying phaseroots + data fully migrated to temporary repository + marking source repository as being upgraded; clients will be unable to read from repository + starting in-place swap of repository data + replaced files will be backed up at $TESTTMP/upgradegd/.hg/upgradebackup.* (glob) + replacing store... + store replacement complete; repository was inconsistent for *s (glob) + finalizing requirements file and making repository readable again + removing old repository content$TESTTMP/upgradegd/.hg/upgradebackup.* (glob) + removing temporary repository $TESTTMP/upgradegd/.hg/upgrade.* (glob) + $ hg verify + checking changesets + checking manifests + crosschecking files in changesets and manifests + checking files + checked 3 changesets with 3 changes to 3 files + +Check you can't skip revlog clone during important format upgrade + + $ echo "sparse-revlog=yes" >> .hg/hgrc + $ hg debugupgrade --optimize re-delta-parent --run --manifest --no-backup --debug --traceback + ignoring revlogs selection flags, format requirements change: sparserevlog + upgrade will perform the following actions: + + requirements + preserved: dotencode, fncache, generaldelta, revlogv1, store + added: sparserevlog + + sparserevlog + Revlog supports delta chain with more unused data between payload. These gaps will be skipped at read time. This allows for better delta chains, making a better compression and faster exchange with server. + + re-delta-parent + deltas within internal storage will choose a new base revision if needed + + beginning upgrade... + repository locked and read-only + creating temporary repository to stage migrated data: $TESTTMP/upgradegd/.hg/upgrade.* (glob) + (it is safe to interrupt this process any time before data migration completes) + migrating 9 total revisions (3 in filelogs, 3 in manifests, 3 in changelog) + migrating 917 bytes in store; 401 bytes tracked data + migrating 3 filelogs containing 3 revisions (192 bytes in store; 0 bytes tracked data) + cloning 1 revisions from data/f0.i + cloning 1 revisions from data/f1.i + cloning 1 revisions from data/f2.i + finished migrating 3 filelog revisions across 3 filelogs; change in size: 0 bytes + migrating 1 manifests containing 3 revisions (349 bytes in store; 220 bytes tracked data) + cloning 3 revisions from 00manifest.i + finished migrating 3 manifest revisions across 1 manifests; change in size: 0 bytes + migrating changelog containing 3 revisions (376 bytes in store; 181 bytes tracked data) + cloning 3 revisions from 00changelog.i + finished migrating 3 changelog revisions; change in size: 0 bytes + finished migrating 9 total revisions; total change in store size: 0 bytes + copying phaseroots + data fully migrated to temporary repository + marking source repository as being upgraded; clients will be unable to read from repository + starting in-place swap of repository data + replaced files will be backed up at $TESTTMP/upgradegd/.hg/upgradebackup.* (glob) + replacing store... + store replacement complete; repository was inconsistent for *s (glob) + finalizing requirements file and making repository readable again + removing old repository content$TESTTMP/upgradegd/.hg/upgradebackup.* (glob) + removing temporary repository $TESTTMP/upgradegd/.hg/upgrade.* (glob) + $ hg verify + checking changesets + checking manifests + crosschecking files in changesets and manifests + checking files + checked 3 changesets with 3 changes to 3 files + $ cd .. store files with special filenames aren't encoded during copy