Mercurial > public > mercurial-scm > hg
comparison mercurial/revlogutils/nodemap.py @ 46472:98e39f04d60e
upgrade: implement partial upgrade for upgrading persistent-nodemap
Upgrading repositories to use persistent nodemap should be fast and easy as it
requires only two things:
1) Updating the requirements
2) Writing a persistent-nodemap on disk
For both of the steps above, we don't need to edit existing revlogs.
This patch makes upgrade only do the above mentioned two steps if we are
only upgarding to use persistent-nodemap feature.
Since `nodemap.persist_nodemap()` assumes that there exists a nodemap file for
the given revlog if we are trying to call it, this patch adds `force` argument
to create a file if does not exist which is true in our upgrade case.
The test changes demonstrate that we no longer write nodemap files for manifest
after upgrade which I think is desirable.
Differential Revision: https://phab.mercurial-scm.org/D9936
author | Pulkit Goyal <7895pulkit@gmail.com> |
---|---|
date | Mon, 01 Feb 2021 00:02:00 +0530 |
parents | dadb4db55661 |
children | 67b5fafd3a46 |
comparison
equal
deleted
inserted
replaced
46471:bfaacfa8ebfc | 46472:98e39f04d60e |
---|---|
126 persist_nodemap(notr, revlog) | 126 persist_nodemap(notr, revlog) |
127 for k in sorted(notr._postclose): | 127 for k in sorted(notr._postclose): |
128 notr._postclose[k](None) | 128 notr._postclose[k](None) |
129 | 129 |
130 | 130 |
131 def persist_nodemap(tr, revlog, pending=False): | 131 def persist_nodemap(tr, revlog, pending=False, force=False): |
132 """Write nodemap data on disk for a given revlog""" | 132 """Write nodemap data on disk for a given revlog""" |
133 if getattr(revlog, 'filteredrevs', ()): | 133 if getattr(revlog, 'filteredrevs', ()): |
134 raise error.ProgrammingError( | 134 raise error.ProgrammingError( |
135 "cannot persist nodemap of a filtered changelog" | 135 "cannot persist nodemap of a filtered changelog" |
136 ) | 136 ) |
137 if revlog.nodemap_file is None: | 137 if revlog.nodemap_file is None: |
138 msg = "calling persist nodemap on a revlog without the feature enabled" | 138 if force: |
139 raise error.ProgrammingError(msg) | 139 revlog.nodemap_file = get_nodemap_file( |
140 revlog.opener, revlog.indexfile | |
141 ) | |
142 else: | |
143 msg = "calling persist nodemap on a revlog without the feature enabled" | |
144 raise error.ProgrammingError(msg) | |
140 | 145 |
141 can_incremental = util.safehasattr(revlog.index, "nodemap_data_incremental") | 146 can_incremental = util.safehasattr(revlog.index, "nodemap_data_incremental") |
142 ondisk_docket = revlog._nodemap_docket | 147 ondisk_docket = revlog._nodemap_docket |
143 feed_data = util.safehasattr(revlog.index, "update_nodemap_data") | 148 feed_data = util.safehasattr(revlog.index, "update_nodemap_data") |
144 use_mmap = revlog.opener.options.get(b"persistent-nodemap.mmap") | 149 use_mmap = revlog.opener.options.get(b"persistent-nodemap.mmap") |