Browse Source

reftable: clear cache on full compaction

The merged table contains handles to open files. A full compaction
causes those files to be closed, and so further lookups would fail
with EBADF.

Change-Id: I7bb74f7228ecc7fec9535b00e56a617a9c18e00e
Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
stable-5.6
Han-Wen Nienhuys 5 years ago committed by Matthias Sohn
parent
commit
8c9f7656c3
  1. 38
      org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/FileReftableTest.java
  2. 1
      org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileReftableDatabase.java

38
org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/FileReftableTest.java

@ -59,6 +59,7 @@ import static org.junit.Assert.fail;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.security.SecureRandom;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -542,6 +543,43 @@ public class FileReftableTest extends SampleDataRepositoryTestCase {
assertEquals(RefUpdate.Result.LOCK_FAILURE, rename.rename()); assertEquals(RefUpdate.Result.LOCK_FAILURE, rename.rename());
} }
@Test
public void compactFully() throws Exception {
FileReftableDatabase refDb = (FileReftableDatabase) db.getRefDatabase();
PersonIdent person = new PersonIdent("jane", "jane@invalid");
ObjectId aId = db.exactRef("refs/heads/a").getObjectId();
ObjectId bId = db.exactRef("refs/heads/b").getObjectId();
SecureRandom random = new SecureRandom();
List<String> strs = new ArrayList<>();
for (int i = 0; i < 1024; i++) {
strs.add(String.format("%02x",
Integer.valueOf(random.nextInt(256))));
}
String randomStr = String.join("", strs);
String refName = "branch";
for (long i = 0; i < 2; i++) {
RefUpdate ru = refDb.newUpdate(refName, false);
ru.setNewObjectId(i % 2 == 0 ? aId : bId);
ru.setForceUpdate(true);
// Only write a large string in the first table, so it becomes much larger
// than the second, and the result is not autocompacted.
ru.setRefLogMessage(i == 0 ? randomStr : "short", false);
ru.setRefLogIdent(person);
RefUpdate.Result res = ru.update();
assertTrue(res == Result.NEW || res == FORCED);
}
assertEquals(refDb.exactRef(refName).getObjectId(), bId);
assertTrue(randomStr.equals(refDb.getReflogReader(refName).getReverseEntry(1).getComment()));
refDb.compactFully();
assertEquals(refDb.exactRef(refName).getObjectId(), bId);
assertTrue(randomStr.equals(refDb.getReflogReader(refName).getReverseEntry(1).getComment()));
}
@Test @Test
public void reftableRefsStorageClass() throws IOException { public void reftableRefsStorageClass() throws IOException {
Ref b = db.exactRef("refs/heads/b"); Ref b = db.exactRef("refs/heads/b");

1
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileReftableDatabase.java

@ -139,6 +139,7 @@ public class FileReftableDatabase extends RefDatabase {
reftableDatabase.getLock().lock(); reftableDatabase.getLock().lock();
try { try {
reftableStack.compactFully(); reftableStack.compactFully();
reftableDatabase.clearCache();
} finally { } finally {
reftableDatabase.getLock().unlock(); reftableDatabase.getLock().unlock();
} }

Loading…
Cancel
Save