When "ACK %s ready" is received, find_common() clears rev_list in an attempt to stop further "have" lines from being sent [1]. This appears to work, despite the invocation to mark_common() in the "while" loop. Though it is possible for mark_common() to invoke rev_list_push() (thus making rev_list non-empty once more), it is more likely that the commits in rev_list that have un-SEEN parents are also unparsed, meaning that mark_common() is not invoked on them. To avoid all this uncertainty, it is better to explicitly end the loop when "ACK %s ready" is received instead of clearing rev_list. Remove the clearing of rev_list and write "if (got_ready) break;" instead. The corresponding code for protocol v2 in process_acks() does not have the same problem, because the invoker of process_acks() (do_fetch_pack_v2()) proceeds immediately to processing the packfile upon "ACK %s ready". The clearing of rev_list here is thus redundant, and this patch also removes it. [1] The rationale is further described in the originating commit f2cba9299b ("fetch-pack: Finish negotation if remote replies "ACK %s ready"", 2011-03-14). Signed-off-by: Jonathan Tan <jonathantanmy@xxxxxxxxxx> --- fetch-pack.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/fetch-pack.c b/fetch-pack.c index 1358973a4..2d090f612 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -517,10 +517,8 @@ static int find_common(struct fetch_pack_args *args, mark_common(commit, 0, 1); retval = 0; got_continue = 1; - if (ack == ACK_ready) { - clear_prio_queue(&rev_list); + if (ack == ACK_ready) got_ready = 1; - } break; } } @@ -530,6 +528,8 @@ static int find_common(struct fetch_pack_args *args, print_verbose(args, _("giving up")); break; /* give up */ } + if (got_ready) + break; } } done: @@ -1281,7 +1281,6 @@ static int process_acks(struct packet_reader *reader, struct oidset *common) } if (!strcmp(reader->line, "ready")) { - clear_prio_queue(&rev_list); received_ready = 1; continue; } -- 2.17.0.768.g1526ddbba1.dirty