Merge "reftable: fix lookup by ID in merged reftables"

This commit is contained in:
Jonathan Tan 2019-10-16 13:33:20 -04:00 committed by Gerrit Code Review @ Eclipse.org
commit 3b96aeb2c9
2 changed files with 50 additions and 1 deletions

View File

@ -187,6 +187,19 @@ public void twoTableById() throws IOException {
}
}
@Test
public void tableByIDDeletion() throws IOException {
List<Ref> delta1 = Arrays.asList(
ref("refs/heads/apple", 1),
ref("refs/heads/master", 2));
List<Ref> delta2 = Arrays.asList(ref("refs/heads/master", 3));
MergedReftable mr = merge(write(delta1), write(delta2));
try (RefCursor rc = mr.byObjectId(id(2))) {
assertFalse(rc.next());
}
}
@SuppressWarnings("boxing")
@Test
public void fourTableScan() throws IOException {

View File

@ -131,7 +131,7 @@ public RefCursor seekRefsWithPrefix(String prefix) throws IOException {
/** {@inheritDoc} */
@Override
public RefCursor byObjectId(AnyObjectId name) throws IOException {
MergedRefCursor m = new MergedRefCursor();
MergedRefCursor m = new FilteringMergedRefCursor(name);
for (int i = 0; i < tables.length; i++) {
m.add(new RefQueueEntry(tables[i].byObjectId(name), i));
}
@ -250,6 +250,42 @@ public void close() {
}
}
private class FilteringMergedRefCursor extends MergedRefCursor {
final AnyObjectId filterId;
Ref filteredRef;
FilteringMergedRefCursor(AnyObjectId id) {
filterId = id;
filteredRef = null;
}
@Override
public Ref getRef() {
return filteredRef;
}
@Override
public boolean next() throws IOException {
for (;;) {
boolean ok = super.next();
if (!ok) {
return false;
}
String name = super.getRef().getName();
try (RefCursor c = seekRef(name)) {
if (c.next()) {
if (filterId.equals(c.getRef().getObjectId())) {
filteredRef = c.getRef();
return true;
}
}
}
}
}
}
private static class RefQueueEntry {
static int compare(RefQueueEntry a, RefQueueEntry b) {
int cmp = a.name().compareTo(b.name());