# HG changeset patch # User Pierre-Yves David # Date 2020-01-15 14:51:01 # Node ID 6ecc34b31137e8d1db705cb4ae0e95f4a135fd74 # Parent c7eebdb15139b64e652a5182257bf54be3eb8317 nodemap: update the index with the newly written data (when appropriate) If we are to use mmap to read the nodemap data, and if the python code is responsible for the IO, we need to refresh the mmap after each write and provide it back to the index. We start this dance without the mmap first. Differential Revision: https://phab.mercurial-scm.org/D7893 diff --git a/mercurial/revlogutils/nodemap.py b/mercurial/revlogutils/nodemap.py --- a/mercurial/revlogutils/nodemap.py +++ b/mercurial/revlogutils/nodemap.py @@ -100,6 +100,8 @@ def _persist_nodemap(tr, revlog): with revlog.opener(datafile, b'r+') as fd: fd.seek(target_docket.data_length) fd.write(data) + fd.seek(0) + new_data = fd.read(target_docket.data_length + len(data)) target_docket.data_length += len(data) target_docket.data_unused += data_changed_count @@ -113,6 +115,7 @@ def _persist_nodemap(tr, revlog): data = persistent_data(revlog.index) # EXP-TODO: if this is a cache, this should use a cache vfs, not a # store vfs + new_data = data with revlog.opener(datafile, b'w') as fd: fd.write(data) target_docket.data_length = len(data) @@ -122,6 +125,9 @@ def _persist_nodemap(tr, revlog): with revlog.opener(revlog.nodemap_file, b'w', atomictemp=True) as fp: fp.write(target_docket.serialize()) revlog._nodemap_docket = target_docket + if util.safehasattr(revlog.index, "update_nodemap_data"): + revlog.index.update_nodemap_data(target_docket, new_data) + # EXP-TODO: if the transaction abort, we should remove the new data and # reinstall the old one.