From: Han Xin <chiyutianyi@gmail.com>
To: git@vger.kernel.org
Cc: Han Xin <chiyutianyi@gmail.com>, Patrick Steinhardt <ps@pks.im>
Subject: An endless loop fetching issue with partial clone, alternates and commit graph
Date: Mon, 13 Jun 2022 00:17:07 +0800 [thread overview]
Message-ID: <20220612161707.21807-1-chiyutianyi@gmail.com> (raw)
We found an issue that could create an endless loop where alternates
objects are used improperly.
While do fetching in a partial cloned repository with a commit graph,
deref_without_lazy_fetch_extended() will call lookup_commit_in_graph()
to find the commit object. We can found the code in commit-graph.c:
struct commit *lookup_commit_in_graph(struct repository *repo, const struct object_id *id)
{
...
if (!search_commit_pos_in_graph(id, repo->objects->commit_graph, &pos))
return NULL;
if (!repo_has_object_file(repo, id))
return NULL;
If we found the object in the commit graph, but missing it in the repository,
we will go into an endless loop:
git fetch -> deref_without_lazy_fetch_extended() ->
lookup_commit_in_graph() -> repo_has_object_file() ->
promisor_remote_get_direct() -> fetch_objects() ->
git fetch
I know that the reason for this issue is due to improper use of
alternates, we can ensure that objects will not be lost by maintaining
all the references. But shouldn't we do something about this unusual
usage, it will cause a fetch bombardment of the remote git service.
We can reproduce this issue with the following test case, it will
generate a lot of git processes, please be careful to stop it.
------------------------------------------------------
#!/bin/sh
test_description='test for an endless loop fetching'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
. ./test-lib.sh
test_expect_success 'setup' '
git init --bare dest.git &&
test_commit one &&
git checkout -b testbranch &&
test_commit two &&
git push dest.git --all
'
test_expect_success 'prepare a alternates repository without testbranch' '
git clone -b $GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME dest.git alternates &&
oid=$(git -C alternates rev-parse refs/remotes/origin/testbranch) &&
git -C alternates update-ref -d refs/remotes/origin/testbranch &&
git -C alternates gc --prune=now
'
test_expect_success 'prepare a repository with commit-graph' '
git init source &&
echo "$(pwd)/dest.git/objects" >source/.git/objects/info/alternates &&
git -C source remote add origin "$(pwd)/dest.git" &&
git -C source config remote.origin.promisor true &&
git -C source config remote.origin.partialclonefilter blob:none &&
git -C source fetch origin &&
(
cd source &&
test_commit three &&
git -c gc.writeCommitGraph=true gc
)
'
test_expect_success 'change alternates' '
echo "$(pwd)/alternates/.git/objects" >source/.git/objects/info/alternates &&
# this will bring an endless loop fetching
git -C source fetch origin $oid
'
test_done
------------------------------------------------------
Thanks
-Han Xin
next reply other threads:[~2022-06-12 16:17 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-12 16:17 Han Xin [this message]
-- strict thread matches above, loose matches on Subject: below --
2022-06-14 7:25 An endless loop fetching issue with partial clone, alternates and commit graph Haiyng Tan
2022-06-15 2:18 ` Taylor Blau
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220612161707.21807-1-chiyutianyi@gmail.com \
--to=chiyutianyi@gmail.com \
--cc=git@vger.kernel.org \
--cc=ps@pks.im \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).