Skip to content

Commit

Permalink
fetch-pack: give up after getting too many "ack continue"
Browse files Browse the repository at this point in the history
If your repository have more roots than the remote repository
you ask an object for, the remote upload-pack keeps responding
"ack continue" until it fills up its received-have buffer
(currently 256 entries).  Usually this is not a problem because
the requester stops traversing the ancestry chain from the commit
it gets "ack continue" for, but this mechanism does not work as
a roadblock when it traverses down the path to the root the
other side does not have.

Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Junio C Hamano committed May 25, 2006
1 parent ed90cbf commit f061e5f
Showing 1 changed file with 16 additions and 0 deletions.
16 changes: 16 additions & 0 deletions fetch-pack.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,12 @@ static const char *exec = "git-upload-pack";
#define SEEN (1U << 3)
#define POPPED (1U << 4)

/*
* After sending this many "have"s if we do not get any new ACK , we
* give up traversing our history.
*/
#define MAX_IN_VAIN 256

static struct commit_list *rev_list = NULL;
static int non_common_revs = 0, multi_ack = 0, use_thin_pack = 0;

Expand Down Expand Up @@ -134,6 +140,8 @@ static int find_common(int fd[2], unsigned char *result_sha1,
int fetching;
int count = 0, flushes = 0, retval;
const unsigned char *sha1;
unsigned in_vain = 0;
int got_continue = 0;

for_each_ref(rev_list_insert_ref);

Expand Down Expand Up @@ -172,6 +180,7 @@ static int find_common(int fd[2], unsigned char *result_sha1,
packet_write(fd[1], "have %s\n", sha1_to_hex(sha1));
if (verbose)
fprintf(stderr, "have %s\n", sha1_to_hex(sha1));
in_vain++;
if (!(31 & ++count)) {
int ack;

Expand Down Expand Up @@ -200,9 +209,16 @@ static int find_common(int fd[2], unsigned char *result_sha1,
lookup_commit(result_sha1);
mark_common(commit, 0, 1);
retval = 0;
in_vain = 0;
got_continue = 1;
}
} while (ack);
flushes--;
if (got_continue && MAX_IN_VAIN < in_vain) {
if (verbose)
fprintf(stderr, "giving up\n");
break; /* give up */
}
}
}
done:
Expand Down

0 comments on commit f061e5f

Please sign in to comment.