aboutsummaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit
diff options
context:
space:
mode:
authorJonathan Tan <jonathantanmy@google.com>2023-05-08 13:51:28 -0700
committerJonathan Tan <jonathantanmy@google.com>2023-07-18 14:21:48 -0700
commit77aec62141cd22067f853eb0e0f7a2df757e3155 (patch)
treeb23e1dc92f2a9c8b771b96ea237074e390026cf1 /org.eclipse.jgit
parentd3b40e72acd30b8842da8f450775a5c847ad20ef (diff)
downloadjgit-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')
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/commitgraph/CommitGraphWriter.java63
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommit.java2
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommitCG.java2
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;
}
}