diff options
author | Terry Parker <tparker@google.com> | 2018-02-11 13:29:38 -0800 |
---|---|---|
committer | Terry Parker <tparker@google.com> | 2018-02-12 13:59:42 -0800 |
commit | 302596cc675d00e41f0ff07efef58063afe20c79 (patch) | |
tree | 60e48b46b14fe8ebb73b2ba4227972ff4bed2714 | |
parent | 5efc3dcc6c9f5c93ba8b1f75b7070d3eb281f08d (diff) | |
download | jgit-302596cc675d00e41f0ff07efef58063afe20c79.tar.gz jgit-302596cc675d00e41f0ff07efef58063afe20c79.zip |
Add negotiation statistics to PackStatistics
Add fetch statistics for the counts of advertised refs, wants and haves.
Also add the duration in milliseconds for the negotiation phase. For
non-bidirectional transports like HTTP, this is the time for the final
round that sends the pack back to the user.
Change-Id: I1af7ffd3cb7b62182340682e2a243691ea24ec2e
Signed-off-by: Terry Parker <tparker@google.com>
3 files changed, 113 insertions, 10 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java index 71d10ac45d..42df1a6588 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java @@ -81,6 +81,7 @@ import java.util.zip.Deflater; import java.util.zip.DeflaterOutputStream; import org.eclipse.jgit.annotations.NonNull; +import org.eclipse.jgit.annotations.Nullable; import org.eclipse.jgit.errors.CorruptObjectException; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.errors.LargeObjectException; @@ -355,6 +356,24 @@ public class PackWriter implements AutoCloseable { * reader to read from the repository with. */ public PackWriter(final PackConfig config, final ObjectReader reader) { + this(config, reader, null); + } + + /** + * Create writer with a specified configuration. + * <p> + * Objects for packing are specified in {@link #preparePack(Iterator)} or + * {@link #preparePack(ProgressMonitor, Set, Set)}. + * + * @param config + * configuration for the pack writer. + * @param reader + * reader to read from the repository with. + * @param statsAccumulator + * accumulator for statics + */ + public PackWriter(PackConfig config, final ObjectReader reader, + @Nullable PackStatistics.Accumulator statsAccumulator) { this.config = config; this.reader = reader; if (reader instanceof ObjectReuseAsIs) @@ -365,7 +384,8 @@ public class PackWriter implements AutoCloseable { deltaBaseAsOffset = config.isDeltaBaseAsOffset(); reuseDeltas = config.isReuseDeltas(); reuseValidate = true; // be paranoid by default - stats = new PackStatistics.Accumulator(); + stats = statsAccumulator != null ? statsAccumulator + : new PackStatistics.Accumulator(); state = new MutableState(); selfRef = new WeakReference<>(this); instances.put(selfRef, Boolean.TRUE); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackStatistics.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackStatistics.java index 68cffd5b38..68878e5a61 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackStatistics.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackStatistics.java @@ -166,6 +166,36 @@ public class PackStatistics { * POJO for accumulating the statistics. */ public static class Accumulator { + /** + * The count of references in the ref advertisement. + * + * @since 4.11 + */ + public long advertised; + + /** + * The count of client wants. + * + * @since 4.11 + */ + public long wants; + + /** + * The count of client haves. + * + * @since 4.11 + */ + public long haves; + + /** + * Time in ms spent in the negotiation phase. For non-bidirectional + * transports (e.g., HTTP), this is only for the final request that + * sends back the pack file. + * + * @since 4.11 + */ + public long timeNegotiating; + /** The set of objects to be included in the pack. */ public Set<ObjectId> interestingObjects; @@ -271,6 +301,48 @@ public class PackStatistics { } /** + * Get the count of references in the ref advertisement. + * + * @return count of refs in the ref advertisement. + * @since 4.11 + */ + public long getAdvertised() { + return statistics.advertised; + } + + /** + * Get the count of client wants. + * + * @return count of client wants. + * @since 4.11 + */ + public long getWants() { + return statistics.wants; + } + + /** + * Get the count of client haves. + * + * @return count of client haves. + * @since 4.11 + */ + public long getHaves() { + return statistics.haves; + } + + /** + * Time in ms spent in the negotiation phase. For non-bidirectional + * transports (e.g., HTTP), this is only for the final request that sends + * back the pack file. + * + * @return time for ref advertisement in ms. + * @since 4.11 + */ + public long getTimeNegotiating() { + return statistics.timeNegotiating; + } + + /** * Get unmodifiable collection of objects to be included in the pack. * * @return unmodifiable collection of objects to be included in the pack. 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 5034c34d84..0209be1f73 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java @@ -773,6 +773,7 @@ public class UploadPack { boolean sendPack = false; // If it's a non-bidi request, we need to read the entire request before // writing a response. Buffer the response until then. + PackStatistics.Accumulator accumulator = new PackStatistics.Accumulator(); try { if (biDirectionalPipe) sendAdvertisedRefs(new PacketLineOutRefAdvertiser(pckOut)); @@ -781,12 +782,15 @@ public class UploadPack { else advertised = refIdSet(getAdvertisedOrDefaultRefs().values()); + long negotiateStart = System.currentTimeMillis(); + accumulator.advertised = advertised.size(); recvWants(); if (wantIds.isEmpty()) { preUploadHook.onBeginNegotiateRound(this, wantIds, 0); preUploadHook.onEndNegotiateRound(this, wantIds, 0, 0, false); return; } + accumulator.wants = wantIds.size(); if (options.contains(OPTION_MULTI_ACK_DETAILED)) { multiAck = MultiAck.DETAILED; @@ -802,7 +806,10 @@ public class UploadPack { processShallow(); if (!clientShallowCommits.isEmpty()) walk.assumeShallow(clientShallowCommits); - sendPack = negotiate(); + sendPack = negotiate(accumulator); + accumulator.timeNegotiating += System.currentTimeMillis() + - negotiateStart; + if (sendPack && !biDirectionalPipe) { // Ensure the request was fully consumed. Any remaining input must // be a protocol error. If we aren't at EOF the implementation is broken. @@ -849,7 +856,7 @@ public class UploadPack { } if (sendPack) - sendPack(); + sendPack(accumulator); } private static Set<ObjectId> refIdSet(Collection<Ref> refs) { @@ -1093,7 +1100,8 @@ public class UploadPack { return UserAgent.getAgent(options, userAgent); } - private boolean negotiate() throws IOException { + private boolean negotiate(PackStatistics.Accumulator accumulator) + throws IOException { okToGiveUp = Boolean.FALSE; ObjectId last = ObjectId.zeroId(); @@ -1127,7 +1135,7 @@ public class UploadPack { } else if (line.startsWith("have ") && line.length() == 45) { //$NON-NLS-1$ peerHas.add(ObjectId.fromString(line.substring(5))); - + accumulator.haves++; } else if (line.equals("done")) { //$NON-NLS-1$ last = processHaveLines(peerHas, last); @@ -1485,12 +1493,13 @@ public class UploadPack { return false; } - private void sendPack() throws IOException { + private void sendPack(PackStatistics.Accumulator accumulator) + throws IOException { final boolean sideband = options.contains(OPTION_SIDE_BAND) || options.contains(OPTION_SIDE_BAND_64K); if (sideband) { try { - sendPack(true); + sendPack(true, accumulator); } catch (ServiceMayNotContinueException noPack) { // This was already reported on (below). throw noPack; @@ -1511,7 +1520,7 @@ public class UploadPack { throw err; } } else { - sendPack(false); + sendPack(false, accumulator); } } @@ -1532,7 +1541,8 @@ public class UploadPack { } @SuppressWarnings("deprecation") - private void sendPack(final boolean sideband) throws IOException { + private void sendPack(final boolean sideband, + PackStatistics.Accumulator accumulator) throws IOException { ProgressMonitor pm = NullProgressMonitor.INSTANCE; OutputStream packOut = rawOut; @@ -1573,7 +1583,8 @@ public class UploadPack { PackConfig cfg = packConfig; if (cfg == null) cfg = new PackConfig(db); - final PackWriter pw = new PackWriter(cfg, walk.getObjectReader()); + final PackWriter pw = new PackWriter(cfg, walk.getObjectReader(), + accumulator); try { pw.setIndexDisabled(true); pw.setUseCachedPacks(true); |