comparison mercurial/revlogutils/nodemap.py @ 44636:c70bcaf7927b

nodemap: automatically "vacuum" the persistent nodemap when too sparse We arbitrarily pick "10%" as the threshold. Differential Revision: https://phab.mercurial-scm.org/D8193
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Thu, 26 Mar 2020 11:55:06 +0100
parents 99ea74cbed74
children ed475420e0af
comparison
equal deleted inserted replaced
44635:99ea74cbed74 44636:c70bcaf7927b
141 ( 141 (
142 src_docket, 142 src_docket,
143 data_changed_count, 143 data_changed_count,
144 data, 144 data,
145 ) = revlog.index.nodemap_data_incremental() 145 ) = revlog.index.nodemap_data_incremental()
146 new_length = target_docket.data_length + len(data)
147 new_unused = target_docket.data_unused + data_changed_count
146 if src_docket != target_docket: 148 if src_docket != target_docket:
149 data = None
150 elif new_length <= (new_unused * 10): # under 10% of unused data
147 data = None 151 data = None
148 else: 152 else:
149 datafile = _rawdata_filepath(revlog, target_docket) 153 datafile = _rawdata_filepath(revlog, target_docket)
150 # EXP-TODO: if this is a cache, this should use a cache vfs, not a 154 # EXP-TODO: if this is a cache, this should use a cache vfs, not a
151 # store vfs 155 # store vfs
152 new_length = target_docket.data_length + len(data)
153 tr.add(datafile, target_docket.data_length) 156 tr.add(datafile, target_docket.data_length)
154 with revlog.opener(datafile, b'r+') as fd: 157 with revlog.opener(datafile, b'r+') as fd:
155 fd.seek(target_docket.data_length) 158 fd.seek(target_docket.data_length)
156 fd.write(data) 159 fd.write(data)
157 if feed_data: 160 if feed_data:
160 new_data = fd.read(new_length) 163 new_data = fd.read(new_length)
161 else: 164 else:
162 fd.flush() 165 fd.flush()
163 new_data = util.buffer(util.mmapread(fd, new_length)) 166 new_data = util.buffer(util.mmapread(fd, new_length))
164 target_docket.data_length = new_length 167 target_docket.data_length = new_length
165 target_docket.data_unused += data_changed_count 168 target_docket.data_unused = new_unused
166 169
167 if data is None: 170 if data is None:
168 # otherwise fallback to a full new export 171 # otherwise fallback to a full new export
169 target_docket = NodeMapDocket() 172 target_docket = NodeMapDocket()
170 datafile = _rawdata_filepath(revlog, target_docket) 173 datafile = _rawdata_filepath(revlog, target_docket)