diff options
author | Jonathan Tan <jonathantanmy@google.com> | 2023-05-08 13:51:28 -0700 |
---|---|---|
committer | Jonathan Tan <jonathantanmy@google.com> | 2023-07-18 14:21:48 -0700 |
commit | 77aec62141cd22067f853eb0e0f7a2df757e3155 (patch) | |
tree | b23e1dc92f2a9c8b771b96ea237074e390026cf1 /org.eclipse.jgit | |
parent | d3b40e72acd30b8842da8f450775a5c847ad20ef (diff) | |
download | jgit-77aec62141cd22067f853eb0e0f7a2df757e3155.tar.gz jgit-77aec62141cd22067f853eb0e0f7a2df757e3155.zip |
CommitGraphWriter: reuse changed path filters
Teach CommitGraphWriter to reuse changed path filters that have been
read from the commit graph file whenever possible.
Change-Id: I1acbfa1613ca7198386a49209028886af360ddb6
Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Diffstat (limited to 'org.eclipse.jgit')
3 files changed, 53 insertions, 14 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphWriter.java index f1b4f55299..eb9dfb4d9c 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphWriter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphWriter.java @@ -93,16 +93,18 @@ public class CommitGraphWriter { * output stream of commit-graph data. The stream should be * buffered by the caller. The caller is responsible for closing * the stream. + * @return statistics gathered during the run * @throws IOException * if an error occurred */ - public void write(@NonNull ProgressMonitor monitor, + public Stats write(@NonNull ProgressMonitor monitor, @NonNull OutputStream commitGraphStream) throws IOException { + Stats stats = new Stats(); if (graphCommits.size() == 0) { - return; + return stats; } - List<ChunkHeader> chunks = createChunks(); + List<ChunkHeader> chunks = createChunks(stats); long writeCount = 256 + 2 * graphCommits.size() + graphCommits.getExtraEdgeCnt(); monitor.beginTask( @@ -122,9 +124,11 @@ public class CommitGraphWriter { } finally { monitor.endTask(); } + return stats; } - private List<ChunkHeader> createChunks() throws MissingObjectException, + private List<ChunkHeader> createChunks(Stats stats) + throws MissingObjectException, IncorrectObjectTypeException, CorruptObjectException, IOException { List<ChunkHeader> chunks = new ArrayList<>(); chunks.add(new ChunkHeader(CHUNK_ID_OID_FANOUT, GRAPH_FANOUT_SIZE)); @@ -136,7 +140,7 @@ public class CommitGraphWriter { chunks.add(new ChunkHeader(CHUNK_ID_EXTRA_EDGE_LIST, graphCommits.getExtraEdgeCnt() * 4)); } - BloomFilterChunks bloomFilterChunks = computeBloomFilterChunks(); + BloomFilterChunks bloomFilterChunks = computeBloomFilterChunks(stats); chunks.add(new ChunkHeader(CHUNK_ID_BLOOM_FILTER_INDEX, bloomFilterChunks.index)); chunks.add(new ChunkHeader(CHUNK_ID_BLOOM_FILTER_DATA, @@ -363,7 +367,7 @@ public class CommitGraphWriter { return Optional.of(paths); } - private BloomFilterChunks computeBloomFilterChunks() + private BloomFilterChunks computeBloomFilterChunks(Stats stats) throws MissingObjectException, IncorrectObjectTypeException, CorruptObjectException, IOException { @@ -383,13 +387,18 @@ public class CommitGraphWriter { int dataHeaderSize = data.size(); for (RevCommit cmit : graphCommits) { - Optional<HashSet<ByteBuffer>> paths = computeBloomFilterPaths( - graphCommits.getObjectReader(), cmit); - ChangedPathFilter cpf; - if (paths.isEmpty()) { - cpf = ChangedPathFilter.FULL; + ChangedPathFilter cpf = cmit.getChangedPathFilter(); + if (cpf != null) { + stats.changedPathFiltersReused++; } else { - cpf = ChangedPathFilter.fromPaths(paths.get()); + stats.changedPathFiltersComputed++; + Optional<HashSet<ByteBuffer>> paths = computeBloomFilterPaths( + graphCommits.getObjectReader(), cmit); + if (paths.isEmpty()) { + cpf = ChangedPathFilter.FULL; + } else { + cpf = ChangedPathFilter.fromPaths(paths.get()); + } } cpf.writeTo(data); NB.encodeInt32(scratch, 0, data.size() - dataHeaderSize); @@ -450,4 +459,34 @@ public class CommitGraphWriter { this.data = data; } } + + /** + * Statistics collected during a single commit graph write. + */ + public static class Stats { + + private long changedPathFiltersReused = 0; + + private long changedPathFiltersComputed = 0; + + /** + * Returns the number of existing changed path filters that were reused + * when writing, for statistical purposes. + * + * @return count of changed path filters + */ + public long getChangedPathFiltersReused() { + return changedPathFiltersReused; + } + + /** + * Returns the number of changed path filters that were computed from + * scratch, for statistical purposes. + * + * @return count of changed path filters + */ + public long getChangedPathFiltersComputed() { + return changedPathFiltersComputed; + } + } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommit.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommit.java index 316aeda4f4..e0bdf3eaf9 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommit.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommit.java @@ -697,7 +697,7 @@ public class RevCommit extends RevObject { * @return the changed path filter * @since 6.7 */ - ChangedPathFilter getChangedPathFilter() { + public ChangedPathFilter getChangedPathFilter() { return null; } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommitCG.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommitCG.java index bfc0c59aad..8c8100320a 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommitCG.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommitCG.java @@ -110,7 +110,7 @@ class RevCommitCG extends RevCommit { /** {@inheritDoc} */ @Override - ChangedPathFilter getChangedPathFilter() { + public ChangedPathFilter getChangedPathFilter() { return changedPathFilter; } } |