From: "Shawn O. Pearce" <spearce@spearce.org>
To: Robin Rosenberg <robin.rosenberg@dewire.com>
Cc: git@vger.kernel.org
Subject: [JGIT PATCH 5/5] UploadPack: Only recompute okToGiveUp() if bases changed
Date: Fri, 12 Jun 2009 16:00:19 -0700 [thread overview]
Message-ID: <1244847619-7364-6-git-send-email-spearce@spearce.org> (raw)
In-Reply-To: <1244847619-7364-5-git-send-email-spearce@spearce.org>
If we get a commit we don't recognize, but we haven't added any new
common bases to the commonBase set since the last time we ran the
okToGiveUp() algorithm, then there is no point in running it again,
as the result will not change. Instead we cache the result in a
Boolean and just return the cached result until another common base
can be found and added to the set.
This helps to fix a performance problem when the client is 50,000
commits ahead of the server, and keeps sending them in "have"
lines, but the server doesn't recognize them. On every "have"
line we will not have updated the common base, but we also aren't
yet satisfied that it is OK to give up negotiation.
Between the changes introduced by the parent commit and this commit,
negotiation in this case of 50,000 ahead now completes instantly,
instead of taking hours.
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
.../src/org/spearce/jgit/transport/UploadPack.java | 27 ++++++++++++++------
1 files changed, 19 insertions(+), 8 deletions(-)
diff --git a/org.spearce.jgit/src/org/spearce/jgit/transport/UploadPack.java b/org.spearce.jgit/src/org/spearce/jgit/transport/UploadPack.java
index 5127dad..5c8df62 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/transport/UploadPack.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/transport/UploadPack.java
@@ -112,6 +112,9 @@
/** Objects on both sides, these don't have to be sent. */
private final List<RevObject> commonBase = new ArrayList<RevObject>();
+ /** null if {@link #commonBase} should be examined again. */
+ private Boolean okToGiveUp;
+
/** Marked on objects we sent in our advertisement list. */
private final RevFlag ADVERTISED;
@@ -396,15 +399,26 @@ private boolean matchHave(final ObjectId id) {
o.add(PEER_HAS);
if (o instanceof RevCommit)
((RevCommit) o).carry(PEER_HAS);
- if (!o.has(COMMON)) {
- o.add(COMMON);
- commonBase.add(o);
- }
+ addCommonBase(o);
}
return true;
}
+ private void addCommonBase(final RevObject o) {
+ if (!o.has(COMMON)) {
+ o.add(COMMON);
+ commonBase.add(o);
+ okToGiveUp = null;
+ }
+ }
+
private boolean okToGiveUp() throws PackProtocolException {
+ if (okToGiveUp == null)
+ okToGiveUp = Boolean.valueOf(okToGiveUpImp());
+ return okToGiveUp.booleanValue();
+ }
+
+ private boolean okToGiveUpImp() throws PackProtocolException {
if (commonBase.isEmpty())
return false;
@@ -429,10 +443,7 @@ private boolean wantSatisfied(final RevCommit want) throws IOException {
if (c == null)
break;
if (c.has(PEER_HAS)) {
- if (!c.has(COMMON)) {
- c.add(COMMON);
- commonBase.add(c);
- }
+ addCommonBase(c);
return true;
}
}
--
1.6.3.2.367.gf0de
prev parent reply other threads:[~2009-06-12 23:00 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-06-12 23:00 [JGIT PATCH 0/5] Fix major performance problems in UploadPack Shawn O. Pearce
2009-06-12 23:00 ` [JGIT PATCH 1/5] Make RevTag getObject(), getName() final to prevent overrides Shawn O. Pearce
2009-06-12 23:00 ` [JGIT PATCH 2/5] Allow exceptions to be created with integer type codes Shawn O. Pearce
2009-06-12 23:00 ` [JGIT PATCH 3/5] Unify RevWalk parsing code to be more consistent across types Shawn O. Pearce
2009-06-12 23:00 ` [JGIT PATCH 4/5] Change RevObject dispose() semantics to avoid reparses Shawn O. Pearce
2009-06-12 23:00 ` Shawn O. Pearce [this message]
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=1244847619-7364-6-git-send-email-spearce@spearce.org \
--to=spearce@spearce.org \
--cc=git@vger.kernel.org \
--cc=robin.rosenberg@dewire.com \
/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).