Mercurial > public > mercurial-scm > hg
diff mercurial/dirstatemap.py @ 50238:c9066fc609ef stable
dirstate: deal with read-race for python code using rust object
If we cannot read the dirstate data, this is probably because a writing process
wrote it under our feet. So refresh the docket and try again a handful of time.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Tue, 28 Feb 2023 23:35:52 +0100 |
parents | a3b1ab5f5dee |
children | 342c3c4640b7 |
line wrap: on
line diff
--- a/mercurial/dirstatemap.py Tue Feb 28 19:01:20 2023 +0100 +++ b/mercurial/dirstatemap.py Tue Feb 28 23:35:52 2023 +0100 @@ -133,6 +133,7 @@ while attempts < V2_MAX_READ_ATTEMPTS: attempts += 1 try: + # TODO: use mmap when possible data = self._opener.read(self.docket.data_filename()) except FileNotFoundError: # read race detected between docket and data file @@ -568,14 +569,12 @@ testing.wait_on_cfg(self._ui, b'dirstate.pre-read-file') if self._use_dirstate_v2: - if self.docket.uuid: - testing.wait_on_cfg( - self._ui, b'dirstate.post-docket-read-file' - ) - # TODO: use mmap when possible - data = self._opener.read(self.docket.data_filename()) + self.docket # load the data if needed + testing.wait_on_cfg(self._ui, b'dirstate.post-docket-read-file') + if not self.docket.uuid: + data = b'' else: - data = b'' + data = self._read_v2_data() self._map = rustmod.DirstateMap.new_v2( data, self.docket.data_size, self.docket.tree_metadata )