Mercurial > public > mercurial-scm > hg-stable
diff mercurial/store.py @ 46989:aed6ceaad6d7
streamclone: treat volatile file as "fullfile"
The nodemap related file might change (or get deleted) during the stream clone
in a way incompatible with the streaming process.
So we introduce a new flag for this type of file and integrate it with the
existing `revlog_type` field recently added to `store.walk` returns.
We use that new flat to dispatch such file to the existing mechanism for "atomic
replacement" file for the nodemap docket and datafile. This fix the bugs we have
been adding tests for.
Strictly speaking, the nodemap datafile is happened only a could maybe be used
in a slightly more efficient way, however this is good enough for now.
Differential Revision: https://phab.mercurial-scm.org/D10481
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Tue, 20 Apr 2021 05:08:55 +0200 |
parents | 6085b7f1536d |
children | 0b569c75d180 |
line wrap: on
line diff
--- a/mercurial/store.py Mon Apr 19 20:47:46 2021 +0200 +++ b/mercurial/store.py Tue Apr 20 05:08:55 2021 +0200 @@ -389,6 +389,11 @@ REVLOG_FILES_MAIN_EXT = (b'.i', b'i.tmpcensored') REVLOG_FILES_OTHER_EXT = (b'.d', b'.n', b'.nd', b'd.tmpcensored') +# files that are "volatile" and might change between listing and streaming +# +# note: the ".nd" file are nodemap data and won't "change" but they might be +# deleted. +REVLOG_FILES_VOLATILE_EXT = (b'.n', b'.nd') def is_revlog(f, kind, st): @@ -401,7 +406,10 @@ if f.endswith(REVLOG_FILES_MAIN_EXT): return FILEFLAGS_REVLOG_MAIN elif f.endswith(REVLOG_FILES_OTHER_EXT): - return FILETYPE_FILELOG_OTHER + t = FILETYPE_FILELOG_OTHER + if f.endswith(REVLOG_FILES_VOLATILE_EXT): + t |= FILEFLAGS_VOLATILE + return t # the file is part of changelog data @@ -418,6 +426,9 @@ # a secondary file for a revlog FILEFLAGS_REVLOG_OTHER = 1 << 0 +# files that are "volatile" and might change between listing and streaming +FILEFLAGS_VOLATILE = 1 << 20 + FILETYPE_CHANGELOG_MAIN = FILEFLAGS_CHANGELOG | FILEFLAGS_REVLOG_MAIN FILETYPE_CHANGELOG_OTHER = FILEFLAGS_CHANGELOG | FILEFLAGS_REVLOG_OTHER FILETYPE_MANIFESTLOG_MAIN = FILEFLAGS_MANIFESTLOG | FILEFLAGS_REVLOG_MAIN