diff options
author | Ivan Frade <ifrade@google.com> | 2019-11-14 13:56:27 -0800 |
---|---|---|
committer | Ivan Frade <ifrade@google.com> | 2019-11-21 14:07:04 -0800 |
commit | f5f5c80bf582992a1d1f8f82a6bba4b93e491eb5 (patch) | |
tree | 64cb260552c5bd6ce1f8b289f51bf6afc773adca /org.eclipse.jgit.test/tst | |
parent | 989a927a5f0aa21745d560e77e9eb7c76682c117 (diff) | |
download | jgit-f5f5c80bf582992a1d1f8f82a6bba4b93e491eb5.tar.gz jgit-f5f5c80bf582992a1d1f8f82a6bba4b93e491eb5.zip |
BitmappedReachabilityChecker: Use only one bitmap for the whole check
The checker is creating a new bitmap per branch leading to excessive
memory consumption. For the reachability check one bitmap with the
reachability of all branches aggregated is enough.
Build the reachability bitmap with a filter. The filter itself uses it
to emit only commits not reached before and the caller to check what
targets have been reached already.
BitmapCalculator is not required anymore.
Change-Id: Ic5c62f77fe0f188913215b7eaa51d849a9aae6a5
Signed-off-by: Ivan Frade <ifrade@google.com>
Diffstat (limited to 'org.eclipse.jgit.test/tst')
-rw-r--r-- | org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/BitmapCalculatorTest.java | 181 |
1 files changed, 0 insertions, 181 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/BitmapCalculatorTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/BitmapCalculatorTest.java deleted file mode 100644 index c5d4d4238d..0000000000 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/BitmapCalculatorTest.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (C) 2019, Google LLC. - * and other copyright owners as documented in the project's IP log. - * - * This program and the accompanying materials are made available - * under the terms of the Eclipse Distribution License v1.0 which - * accompanies this distribution, is reproduced below, and is - * available at http://www.eclipse.org/org/documents/edl-v10.php - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * - * - Neither the name of the Eclipse Foundation, Inc. nor the - * names of its contributors may be used to endorse or promote - * products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.eclipse.jgit.revwalk; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import org.eclipse.jgit.internal.storage.file.FileRepository; -import org.eclipse.jgit.internal.storage.file.GC; -import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase; -import org.eclipse.jgit.junit.TestRepository; -import org.eclipse.jgit.lib.BitmapIndex.BitmapBuilder; -import org.eclipse.jgit.lib.NullProgressMonitor; -import org.eclipse.jgit.lib.ProgressMonitor; -import org.junit.Before; -import org.junit.Test; - -public class BitmapCalculatorTest extends LocalDiskRepositoryTestCase { - TestRepository<FileRepository> repo; - - /** {@inheritDoc} */ - @Override - @Before - public void setUp() throws Exception { - super.setUp(); - FileRepository db = createWorkRepository(); - repo = new TestRepository<>(db); - } - - @Test - public void addOnlyCommits() throws Exception { - RevBlob abBlob = repo.blob("a_b_content"); - RevCommit root = repo.commit().add("a/b", abBlob).create(); - repo.update("refs/heads/master", root); - - // GC creates bitmap index with ALL objects - GC gc = new GC(repo.getRepository()); - gc.setAuto(false); - gc.gc(); - - // These objects are not in the bitmap index. - RevBlob acBlob = repo.blob("a_c_content"); - RevCommit head = repo.commit().parent(root).add("a/c", acBlob).create(); - repo.update("refs/heads/master", head); - - BitmapCalculator bitmapWalker = new BitmapCalculator(repo.getRevWalk()); - BitmapBuilder bitmap = bitmapWalker - .getBitmap(head, NullProgressMonitor.INSTANCE); - - assertTrue(bitmap.contains(root.getId())); - assertTrue(bitmap.contains(root.getTree().getId())); - assertTrue(bitmap.contains(abBlob.getId())); - - // BitmapCalculator added only the commit, no other objects. - assertTrue(bitmap.contains(head.getId())); - assertFalse(bitmap.contains(head.getTree().getId())); - assertFalse(bitmap.contains(acBlob.getId())); - } - - @Test - public void walkUntilBitmap() throws Exception { - RevCommit root = repo.commit().create(); - repo.update("refs/heads/master", root); - - // GC creates bitmap index with ALL objects - GC gc = new GC(repo.getRepository()); - gc.setAuto(false); - gc.gc(); - - // These objects are not in the bitmap index. - RevCommit commit1 = repo.commit(root); - RevCommit commit2 = repo.commit(commit1); - repo.update("refs/heads/master", commit2); - - CounterProgressMonitor monitor = new CounterProgressMonitor(); - BitmapCalculator bitmapWalker = new BitmapCalculator(repo.getRevWalk()); - BitmapBuilder bitmap = bitmapWalker.getBitmap(commit2, monitor); - - assertTrue(bitmap.contains(root)); - assertTrue(bitmap.contains(commit1)); - assertTrue(bitmap.contains(commit2)); - assertEquals(2, monitor.getUpdates()); - } - - @Test - public void noNeedToWalk() throws Exception { - RevCommit root = repo.commit().create(); - RevCommit commit1 = repo.commit(root); - RevCommit commit2 = repo.commit(commit1); - repo.update("refs/heads/master", commit2); - - // GC creates bitmap index with ALL objects - GC gc = new GC(repo.getRepository()); - gc.setAuto(false); - gc.gc(); - - CounterProgressMonitor monitor = new CounterProgressMonitor(); - BitmapCalculator bitmapWalker = new BitmapCalculator(repo.getRevWalk()); - BitmapBuilder bitmap = bitmapWalker.getBitmap(commit2, monitor); - - assertTrue(bitmap.contains(root)); - assertTrue(bitmap.contains(commit1)); - assertTrue(bitmap.contains(commit2)); - assertEquals(0, monitor.getUpdates()); - } - - private static class CounterProgressMonitor implements ProgressMonitor { - - private int counter; - - @Override - public void start(int totalTasks) { - // Nothing to do in tests - } - - @Override - public void beginTask(String title, int totalWork) { - // Nothing to to in tests - } - - @Override - public void update(int completed) { - counter += 1; - } - - @Override - public void endTask() { - // Nothing to do in tests - } - - @Override - public boolean isCancelled() { - return false; - } - - int getUpdates() { - return counter; - } - } -}
\ No newline at end of file |