aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuca Milanesio <luca.milanesio@gmail.com>2022-05-19 11:12:28 +0100
committerLuca Milanesio <luca.milanesio@gmail.com>2022-06-25 06:45:05 -0400
commit66ace4b9af137466a4dd6187a11e473351c306a8 (patch)
tree66dd717aacc9ceb32bbab9a76934a16bb8d3c4ce
parentf4cbf31ae4350f5df0f54401ba10fb9b84ec31e2 (diff)
downloadjgit-66ace4b9af137466a4dd6187a11e473351c306a8.tar.gz
jgit-66ace4b9af137466a4dd6187a11e473351c306a8.zip
UploadPack: do not check reachability of visible SHA1s
When JGit needs to serve a Git client requesting SHA1s during the want phase, it needs to make a full reachability check from the advertised refs to the ones requested to keep all objects in the correct scope of confidentiality allowed by the avertised refs. The check is also performed when the SHA1 corresponds to one of the tips of the advertised refs which is a waste of resources. Example: fetch> ref-prefix refs/heads/foo fetch< 900505eb8ce8ced2a1757906da1b25c357b9654e refs/heads/foo fetch< 0000 fetch> command=fetch fetch> 0001 fetch> thin-pack fetch> ofs-delta fetch> want 900505eb8ce8ced2a1757906da1b25c357b9654e The SHA1 in the want is the tip of refs/heads/foo and therefore the full reachability check can be shortened and resolved more quickly. Change-Id: I49bd9e2464e0bd3bca2abf14c6e9df550d07383b Signed-off-by: Luca Milanesio <luca.milanesio@gmail.com>
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java10
1 files changed, 9 insertions, 1 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
index 9080f51d7a..c389ce44f4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
@@ -1981,12 +1981,16 @@ public class UploadPack {
throws IOException {
ObjectReader reader = up.getRevWalk().getObjectReader();
+ Set<ObjectId> directlyVisibleObjects = refIdSet(visibleRefs);
+ List<ObjectId> nonTipWants = notAdvertisedWants.stream()
+ .filter(not(directlyVisibleObjects::contains))
+ .collect(Collectors.toList());
try (RevWalk walk = new RevWalk(reader)) {
walk.setRetainBody(false);
// Missing "wants" throw exception here
List<RevObject> wantsAsObjs = objectIdsToRevObjects(walk,
- notAdvertisedWants);
+ nonTipWants);
List<RevCommit> wantsAsCommits = wantsAsObjs.stream()
.filter(obj -> obj instanceof RevCommit)
.map(obj -> (RevCommit) obj)
@@ -2046,6 +2050,10 @@ public class UploadPack {
}
}
+ private static <T> Predicate<T> not(Predicate<T> t) {
+ return t.negate();
+ }
+
static Stream<Ref> importantRefsFirst(
Collection<Ref> visibleRefs) {
Predicate<Ref> startsWithRefsHeads = ref -> ref.getName()