Mercurial > public > mercurial-scm > hg
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) |