From: Thomas Rast <trast@student.ethz.ch>
To: git@vger.kernel.org
Cc: Junio C Hamano <gitster@pobox.com>, Nicolas Pitre <nico@cam.org>,
Nanako Shiraishi <nanako3@lavabit.com>
Subject: [RFC PATCH v3 1/2] fetch-pack: rearrange main loop
Date: Sun, 7 Dec 2008 00:20:20 +0100 [thread overview]
Message-ID: <1228605621-29685-2-git-send-email-trast@student.ethz.ch> (raw)
In-Reply-To: <1228605621-29685-1-git-send-email-trast@student.ethz.ch>
This patch does not change the results (nor any of the semantics
except for the get_rev return type), but we need the changed layout
for the exponential-stride feature.
Signed-off-by: Thomas Rast <trast@student.ethz.ch>
---
builtin-fetch-pack.c | 108 +++++++++++++++++++++++++++++--------------------
1 files changed, 64 insertions(+), 44 deletions(-)
diff --git a/builtin-fetch-pack.c b/builtin-fetch-pack.c
index 372bfa2..ae0a67a 100644
--- a/builtin-fetch-pack.c
+++ b/builtin-fetch-pack.c
@@ -111,7 +111,7 @@ static void mark_common(struct commit *commit,
Get the next rev to send, ignoring the common.
*/
-static const unsigned char* get_rev(void)
+static struct commit* get_rev(void)
{
struct commit *commit = NULL;
@@ -153,15 +153,41 @@ static const unsigned char* get_rev(void)
rev_list = rev_list->next;
}
- return commit->object.sha1;
+ return commit;
}
+/*
+ * Send 'have' for the next batch of revisions. Returns 0 if we ran
+ * out of commits to send, 1 otherwise.
+ */
+
+static int send_have_lines(int fd[2], int *flushes, unsigned *in_vain)
+{
+ struct commit *commit;
+ int i;
+
+ for (i = 0; i < 32; i++) {
+ commit = get_rev();
+ if (!commit)
+ return 0;
+ packet_write(fd[1], "have %s\n",
+ sha1_to_hex(commit->object.sha1));
+ if (args.verbose)
+ fprintf(stderr, "have %s\n",
+ sha1_to_hex(commit->object.sha1));
+ }
+ packet_flush(fd[1]);
+ *flushes += 1;
+ *in_vain += 32;
+ return 1;
+}
+
+
static int find_common(int fd[2], unsigned char *result_sha1,
struct ref *refs)
{
int fetching;
int count = 0, flushes = 0, retval;
- const unsigned char *sha1;
unsigned in_vain = 0;
int got_continue = 0;
@@ -243,51 +269,45 @@ static int find_common(int fd[2], unsigned char *result_sha1,
flushes = 0;
retval = -1;
- while ((sha1 = get_rev())) {
- packet_write(fd[1], "have %s\n", sha1_to_hex(sha1));
- if (args.verbose)
- fprintf(stderr, "have %s\n", sha1_to_hex(sha1));
- in_vain++;
- if (!(31 & ++count)) {
- int ack;
- packet_flush(fd[1]);
- flushes++;
+ /*
+ * We keep one window "ahead" of the other side, and
+ * will wait for an ACK only on the next one
+ */
+ if (!send_have_lines(fd, &flushes, &in_vain))
+ goto done;
- /*
- * We keep one window "ahead" of the other side, and
- * will wait for an ACK only on the next one
- */
- if (count == 32)
- continue;
+ while (send_have_lines(fd, &flushes, &in_vain)) {
+ int ack;
+ int unwound = 0;
- do {
- ack = get_ack(fd[0], result_sha1);
- if (args.verbose && ack)
- fprintf(stderr, "got ack %d %s\n", ack,
- sha1_to_hex(result_sha1));
- if (ack == 1) {
- flushes = 0;
- multi_ack = 0;
- retval = 0;
- goto done;
- } else if (ack == 2) {
- struct commit *commit =
- 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 (args.verbose)
- fprintf(stderr, "giving up\n");
- break; /* give up */
+ do {
+ ack = get_ack(fd[0], result_sha1);
+ if (args.verbose && ack)
+ fprintf(stderr, "got ack %d %s\n", ack,
+ sha1_to_hex(result_sha1));
+ if (ack == 1) {
+ flushes = 0;
+ multi_ack = 0;
+ retval = 0;
+ goto done;
+ } else if (ack == 2) {
+ struct commit *commit =
+ 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 (args.verbose)
+ fprintf(stderr, "giving up\n");
+ break; /* give up */
}
}
+
done:
packet_write(fd[1], "done\n");
if (args.verbose)
--
tg: (7f705dc..) t/fp-refactor (depends on: origin/master)
next prev parent reply other threads:[~2008-12-06 23:21 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-09-17 23:00 [RFC] log(n)-transmissions common commit handshake Thomas Rast
2008-09-17 23:01 ` [RFC PATCH] fetch-pack: log(n)-transmission find_common() Thomas Rast
2008-09-24 0:48 ` [RFC PATCH v2] " Thomas Rast
2008-10-23 19:38 ` Thomas Rast
2008-10-24 15:49 ` Nicolas Pitre
2008-10-27 10:29 ` Nanako Shiraishi
2008-10-28 3:24 ` Junio C Hamano
2008-10-28 14:46 ` Nicolas Pitre
2008-10-28 19:37 ` Thomas Rast
2008-12-06 23:20 ` [RFC PATCH v3 0/2] " Thomas Rast
2008-12-06 23:20 ` Thomas Rast [this message]
2008-12-06 23:20 ` [RFC PATCH v3 2/2] " Thomas Rast
2008-09-18 8:18 ` [RFC] log(n)-transmissions common commit handshake Thomas Rast
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=1228605621-29685-2-git-send-email-trast@student.ethz.ch \
--to=trast@student.ethz.ch \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=nanako3@lavabit.com \
--cc=nico@cam.org \
/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).