mirror of
https://github.com/facebook/sapling.git
synced 2024-10-10 16:57:49 +03:00
A Scalable, User-Friendly Source Control System.
dbe1d30cf0
Summary: If an infinitepush bundle contains flat manifests and is served from a treemanifest repository, it can potentially fail to send all the needed data to the client. Understanding the bug requires two bits of context: 1. When sending commits from a tree server to a tree client, we generally don't send any trees because they can be fetched by the client ondemand later. The one exception to this is for infinitepush bundles, where the trees inside the bundle cannot be served ondemand, and therefore must be served at pull time. To do this we check if a given manifest node exists in the repositories permanent storage, and if it doesn't, we assume it came from an infinitepush bundle and serve it with the pull. 2. When we lookup a manifest and fail to find a tree, our last resort is the ondemandstore which knows how to convert a flat manifest into a tree manifest. On the server, this is responsible for converting each of the flat bundle's manifests into treemanifests before we serve the bundle to the client. As part of converting the flat manifests into treemanifests, it writes the new tree data into a pack file. The bug is then, when serving a stack of commits, if we try to package up the top tree first (i.e. the most recent tree), we end up converting the entire stack from flat into trees, which inserts the bottom most trees into the temporary pack file. Because they exist in the temporary pack file, when we later check if they are part of the repositories store we end up finding them, which causes us to treat them as not-infinitepush-trees which means we don't serve them to the client. The fix is to change the infinitepush tree-serving code to not consider the mutable packs when checking if it should send trees. Reviewed By: mitrandir77 Differential Revision: D14403925 fbshipit-source-id: 38043dfc49df5ff9ea2fae1d3cac341c4936509c |
||
---|---|---|
contrib | ||
distutils_rust | ||
doc | ||
edenscm | ||
exec | ||
i18n | ||
lib | ||
newdoc | ||
slides | ||
tests | ||
.editorconfig | ||
.flake8 | ||
.gitignore | ||
.hgsigs | ||
.jshintrc | ||
CONTRIBUTING | ||
CONTRIBUTORS | ||
COPYING | ||
gen_version.py | ||
hg | ||
hgeditor | ||
hgweb.cgi | ||
Makefile | ||
README.rst | ||
setup.py |
Mercurial ========= Mercurial is a fast, easy to use, distributed revision control tool for software developers. Basic install:: $ make # see install targets $ make install # do a system-wide install $ hg debuginstall # sanity-check setup $ hg # see help Running without installing:: $ make local # build for inplace usage $ ./hg --version # should show the latest version See https://mercurial-scm.org/ for detailed installation instructions, platform-specific notes, and Mercurial user information.