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")