CommitGraphWriter: Unnest generation-number progress

The ProgressMonitor task to track the calculation of generation
numbers is nested inside the task that follows the writing of all
lines in the commit-graph. ProgressMonitor doesn't support nested
tasks and this confuses the counting.

Move the start/end of the "writing commit graph" task to the
writeCommitData section, after calculating the generation
numbers. Make that task track by commits instead of by lines.

Moving the start/end of the progress task to the chunk-writing
functions is clearer and easier to extend.

Logging of GC before:
Writing out commit-graph in 3 passes:  51% ( 9807/19358)
Computing commit-graph generation numbers: 100% (9551/9551)

Logging of GC after:
Computing commit-graph generation numbers: 100% (9551/9551)
Writing out commit-graph: 100% (9551/9551)

Change-Id: I87d69c06c9a3c7e75be12b6f0d1a63b5924e298a
This commit is contained in:
Ivan Frade 2023-11-07 11:36:51 -08:00
parent 3937300f3e
commit c46b54eeac
3 changed files with 56 additions and 11 deletions

View File

@ -14,6 +14,7 @@
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayOutputStream;
@ -31,6 +32,7 @@
import org.eclipse.jgit.lib.ConfigConstants;
import org.eclipse.jgit.lib.NullProgressMonitor;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ProgressMonitor;
import org.eclipse.jgit.revwalk.RevBlob;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
@ -135,6 +137,56 @@ public void testWriterWithoutExtraEdgeList() throws Exception {
NB.decodeInt32(data, 56));
}
@Test
public void testProgressMonitor() throws Exception {
RevCommit root = commit();
RevCommit a = commit(root);
RevCommit b = commit(root);
RevCommit tip = commit(a, b);
Set<ObjectId> wants = Collections.singleton(tip);
NonNestedTasksProgressMonitor nonNested = new NonNestedTasksProgressMonitor();
GraphCommits graphCommits = GraphCommits.fromWalk(nonNested, wants,
walk);
writer = new CommitGraphWriter(graphCommits, true);
writer.write(nonNested, os);
}
private static class NonNestedTasksProgressMonitor
implements ProgressMonitor {
boolean inTask;
@Override
public void start(int totalTasks) {
}
@Override
public void beginTask(String title, int totalWork) {
assertFalse("Previous monitoring task is not closed", inTask);
inTask = true;
}
@Override
public void update(int completed) {
}
@Override
public void endTask() {
assertTrue("Closing task that wasn't started", inTask);
inTask = false;
}
@Override
public boolean isCancelled() {
return false;
}
@Override
public void showDuration(boolean enabled) {
}
}
static HashSet<String> changedPathStrings(byte[] data) {
int oidf_offset = -1;
int bidx_offset = -1;

View File

@ -886,7 +886,7 @@ writerAlreadyInitialized=Writer already initialized
writeTimedOut=Write timed out after {0} ms
writingNotPermitted=Writing not permitted
writingNotSupported=Writing {0} not supported.
writingOutCommitGraph=Writing out commit-graph in {0} passes
writingOutCommitGraph=Writing out commit-graph
writingObjects=Writing objects
wrongDecompressedLength=wrong decompressed length
wrongRepositoryState=Wrong Repository State: {0}

View File

@ -31,7 +31,6 @@
import java.io.InterruptedIOException;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
@ -131,13 +130,6 @@ public Stats write(@NonNull ProgressMonitor monitor,
chunks = Collections.unmodifiableList(chunks);
long expectedSize = calculateExpectedSize(chunks);
long writeCount = 256L + 2 * graphCommits.size()
+ graphCommits.getExtraEdgeCnt();
monitor.beginTask(
MessageFormat.format(JGitText.get().writingOutCommitGraph,
Integer.valueOf(chunks.size())),
(int) writeCount);
try (CancellableDigestOutputStream out = new CancellableDigestOutputStream(
monitor, commitGraphStream)) {
writeHeader(out, chunks.size());
@ -153,8 +145,6 @@ public Stats write(@NonNull ProgressMonitor monitor,
} catch (InterruptedIOException e) {
throw new IOException(JGitText.get().commitGraphWritingCancelled,
e);
} finally {
monitor.endTask();
}
return Stats.from(bloomFilterChunks);
}
@ -290,6 +280,8 @@ private void writeOidLookUp(CancellableDigestOutputStream out)
private void writeCommitData(ProgressMonitor monitor,
CancellableDigestOutputStream out) throws IOException {
int[] generations = computeGenerationNumbers(monitor);
monitor.beginTask(JGitText.get().writingOutCommitGraph,
graphCommits.size());
int num = 0;
byte[] tmp = new byte[hashsz + COMMIT_DATA_WIDTH];
int i = 0;
@ -330,6 +322,7 @@ private void writeCommitData(ProgressMonitor monitor,
out.getWriteMonitor().update(1);
i++;
}
monitor.endTask();
}
private int[] computeGenerationNumbers(ProgressMonitor monitor)