Browse Source

Merge "Scan through all merged reftables for max/min update indices"

stable-5.8
Terry Parker 5 years ago committed by Gerrit Code Review @ Eclipse.org
parent
commit
459fc28cf6
  1. 117
      org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/reftable/MergedReftableTest.java
  2. 24
      org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/MergedReftable.java

117
org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/reftable/MergedReftableTest.java

@ -286,6 +286,123 @@ public class MergedReftableTest {
} }
} }
@Test
public void nonOverlappedUpdateIndices() throws IOException {
ByteArrayOutputStream buf = new ByteArrayOutputStream();
ReftableWriter writer = new ReftableWriter(buf)
.setMinUpdateIndex(1)
.setMaxUpdateIndex(2)
.begin();
writer.writeRef(ref("refs/heads/a", 1), 1);
writer.writeRef(ref("refs/heads/b", 2), 2);
writer.finish();
byte[] base = buf.toByteArray();
buf = new ByteArrayOutputStream();
writer = new ReftableWriter(buf)
.setMinUpdateIndex(3)
.setMaxUpdateIndex(4)
.begin();
writer.writeRef(ref("refs/heads/a", 10), 3);
writer.writeRef(ref("refs/heads/b", 20), 4);
writer.finish();
byte[] delta = buf.toByteArray();
MergedReftable mr = merge(base, delta);
assertEquals(1, mr.minUpdateIndex());
assertEquals(4, mr.maxUpdateIndex());
try (RefCursor rc = mr.allRefs()) {
assertTrue(rc.next());
assertEquals("refs/heads/a", rc.getRef().getName());
assertEquals(id(10), rc.getRef().getObjectId());
assertEquals(3, rc.getRef().getUpdateIndex());
assertTrue(rc.next());
assertEquals("refs/heads/b", rc.getRef().getName());
assertEquals(id(20), rc.getRef().getObjectId());
assertEquals(4, rc.getRef().getUpdateIndex());
}
}
@Test
public void overlappedUpdateIndices() throws IOException {
ByteArrayOutputStream buf = new ByteArrayOutputStream();
ReftableWriter writer = new ReftableWriter(buf)
.setMinUpdateIndex(1)
.setMaxUpdateIndex(3)
.begin();
writer.writeRef(ref("refs/heads/a", 1), 1);
writer.writeRef(ref("refs/heads/b", 2), 3);
writer.finish();
byte[] base = buf.toByteArray();
buf = new ByteArrayOutputStream();
writer = new ReftableWriter(buf)
.setMinUpdateIndex(2)
.setMaxUpdateIndex(4)
.begin();
writer.writeRef(ref("refs/heads/a", 10), 2);
writer.writeRef(ref("refs/heads/b", 20), 4);
writer.finish();
byte[] delta = buf.toByteArray();
MergedReftable mr = merge(base, delta);
assertEquals(1, mr.minUpdateIndex());
assertEquals(4, mr.maxUpdateIndex());
try (RefCursor rc = mr.allRefs()) {
assertTrue(rc.next());
assertEquals("refs/heads/a", rc.getRef().getName());
assertEquals(id(10), rc.getRef().getObjectId());
assertEquals(2, rc.getRef().getUpdateIndex());
assertTrue(rc.next());
assertEquals("refs/heads/b", rc.getRef().getName());
assertEquals(id(20), rc.getRef().getObjectId());
assertEquals(4, rc.getRef().getUpdateIndex());
}
}
@Test
public void enclosedUpdateIndices() throws IOException {
ByteArrayOutputStream buf = new ByteArrayOutputStream();
ReftableWriter writer = new ReftableWriter(buf)
.setMinUpdateIndex(1)
.setMaxUpdateIndex(4)
.begin();
writer.writeRef(ref("refs/heads/a", 1), 1);
writer.writeRef(ref("refs/heads/b", 20), 4);
writer.finish();
byte[] base = buf.toByteArray();
buf = new ByteArrayOutputStream();
writer = new ReftableWriter(buf)
.setMinUpdateIndex(2)
.setMaxUpdateIndex(3)
.begin();
writer.writeRef(ref("refs/heads/a", 10), 2);
writer.writeRef(ref("refs/heads/b", 2), 3);
writer.finish();
byte[] delta = buf.toByteArray();
MergedReftable mr = merge(base, delta);
assertEquals(1, mr.minUpdateIndex());
assertEquals(4, mr.maxUpdateIndex());
try (RefCursor rc = mr.allRefs()) {
assertTrue(rc.next());
assertEquals("refs/heads/a", rc.getRef().getName());
assertEquals(id(10), rc.getRef().getObjectId());
assertEquals(2, rc.getRef().getUpdateIndex());
assertTrue(rc.next());
assertEquals("refs/heads/b", rc.getRef().getName());
assertEquals(id(20), rc.getRef().getObjectId());
assertEquals(4, rc.getRef().getUpdateIndex());
}
}
@Test @Test
public void compaction() throws IOException { public void compaction() throws IOException {
List<Ref> delta1 = Arrays.asList( List<Ref> delta1 = Arrays.asList(

24
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/MergedReftable.java

@ -61,8 +61,16 @@ public class MergedReftable extends Reftable {
*/ */
@Override @Override
public long maxUpdateIndex() throws IOException { public long maxUpdateIndex() throws IOException {
return tables.length > 0 ? tables[tables.length - 1].maxUpdateIndex() if (tables.length == 0) {
: 0; return 0;
}
long maxUpdateIndex = tables[tables.length - 1].maxUpdateIndex();
for (int i = tables.length - 2; i >= 0; i--) {
if (maxUpdateIndex < tables[i].maxUpdateIndex()) {
maxUpdateIndex = tables[i].maxUpdateIndex();
}
}
return maxUpdateIndex;
} }
/** /**
@ -70,8 +78,16 @@ public class MergedReftable extends Reftable {
*/ */
@Override @Override
public long minUpdateIndex() throws IOException { public long minUpdateIndex() throws IOException {
return tables.length > 0 ? tables[0].minUpdateIndex() if (tables.length == 0) {
: 0; return 0;
}
long minUpdateIndex = tables[0].minUpdateIndex();
for (int i = 0; i < tables.length - 1; i++) {
if (tables[i].minUpdateIndex() < minUpdateIndex) {
minUpdateIndex = tables[i].minUpdateIndex();
}
}
return minUpdateIndex;
} }
/** {@inheritDoc} */ /** {@inheritDoc} */

Loading…
Cancel
Save