DfsInserter: generate object size index if config says so
DfsInserter receives objects and on flush() writes a pack and its primary index. Teach the DfsInserter to write also the object size index if the config says so. Change-Id: I89308312f8fd898d4c714a9b68ff948d3663800b
This commit is contained in:
parent
4d2a003b91
commit
cb99ff5bbb
|
@ -10,6 +10,8 @@
|
||||||
|
|
||||||
package org.eclipse.jgit.internal.storage.dfs;
|
package org.eclipse.jgit.internal.storage.dfs;
|
||||||
|
|
||||||
|
import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_MIN_BYTES_OBJ_SIZE_INDEX;
|
||||||
|
import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_PACK_SECTION;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertSame;
|
import static org.junit.Assert.assertSame;
|
||||||
|
@ -289,6 +291,27 @@ public void testObjectSizePopulated() throws IOException {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testObjectSizeIndexOnInsert() throws IOException {
|
||||||
|
db.getConfig().setInt(CONFIG_PACK_SECTION, null,
|
||||||
|
CONFIG_KEY_MIN_BYTES_OBJ_SIZE_INDEX, 0);
|
||||||
|
|
||||||
|
byte[] contents = Constants.encode("foo");
|
||||||
|
ObjectId fooId;
|
||||||
|
try (ObjectInserter ins = db.newObjectInserter()) {
|
||||||
|
fooId = ins.insert(Constants.OBJ_BLOB, contents);
|
||||||
|
ins.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
DfsReader reader = db.getObjectDatabase().newReader();
|
||||||
|
assertEquals(1, db.getObjectDatabase().listPacks().size());
|
||||||
|
DfsPackFile insertPack = db.getObjectDatabase().getPacks()[0];
|
||||||
|
assertEquals(PackSource.INSERT,
|
||||||
|
insertPack.getPackDescription().getPackSource());
|
||||||
|
assertTrue(insertPack.hasObjectSizeIndex(reader));
|
||||||
|
assertEquals(contents.length, insertPack.getIndexedObjectSize(reader, fooId));
|
||||||
|
}
|
||||||
|
|
||||||
private static String readString(ObjectLoader loader) throws IOException {
|
private static String readString(ObjectLoader loader) throws IOException {
|
||||||
return RawParseUtils.decode(readStream(loader));
|
return RawParseUtils.decode(readStream(loader));
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
package org.eclipse.jgit.internal.storage.dfs;
|
package org.eclipse.jgit.internal.storage.dfs;
|
||||||
|
|
||||||
import static org.eclipse.jgit.internal.storage.pack.PackExt.INDEX;
|
import static org.eclipse.jgit.internal.storage.pack.PackExt.INDEX;
|
||||||
|
import static org.eclipse.jgit.internal.storage.pack.PackExt.OBJECT_SIZE_INDEX;
|
||||||
import static org.eclipse.jgit.internal.storage.pack.PackExt.PACK;
|
import static org.eclipse.jgit.internal.storage.pack.PackExt.PACK;
|
||||||
import static org.eclipse.jgit.lib.Constants.OBJ_OFS_DELTA;
|
import static org.eclipse.jgit.lib.Constants.OBJ_OFS_DELTA;
|
||||||
import static org.eclipse.jgit.lib.Constants.OBJ_REF_DELTA;
|
import static org.eclipse.jgit.lib.Constants.OBJ_REF_DELTA;
|
||||||
|
@ -42,6 +43,7 @@
|
||||||
import org.eclipse.jgit.internal.JGitText;
|
import org.eclipse.jgit.internal.JGitText;
|
||||||
import org.eclipse.jgit.internal.storage.file.PackIndex;
|
import org.eclipse.jgit.internal.storage.file.PackIndex;
|
||||||
import org.eclipse.jgit.internal.storage.file.PackIndexWriter;
|
import org.eclipse.jgit.internal.storage.file.PackIndexWriter;
|
||||||
|
import org.eclipse.jgit.internal.storage.file.PackObjectSizeIndexWriter;
|
||||||
import org.eclipse.jgit.internal.storage.pack.PackExt;
|
import org.eclipse.jgit.internal.storage.pack.PackExt;
|
||||||
import org.eclipse.jgit.lib.AbbreviatedObjectId;
|
import org.eclipse.jgit.lib.AbbreviatedObjectId;
|
||||||
import org.eclipse.jgit.lib.AnyObjectId;
|
import org.eclipse.jgit.lib.AnyObjectId;
|
||||||
|
@ -52,6 +54,7 @@
|
||||||
import org.eclipse.jgit.lib.ObjectLoader;
|
import org.eclipse.jgit.lib.ObjectLoader;
|
||||||
import org.eclipse.jgit.lib.ObjectReader;
|
import org.eclipse.jgit.lib.ObjectReader;
|
||||||
import org.eclipse.jgit.lib.ObjectStream;
|
import org.eclipse.jgit.lib.ObjectStream;
|
||||||
|
import org.eclipse.jgit.storage.pack.PackConfig;
|
||||||
import org.eclipse.jgit.transport.PackedObjectInfo;
|
import org.eclipse.jgit.transport.PackedObjectInfo;
|
||||||
import org.eclipse.jgit.util.BlockList;
|
import org.eclipse.jgit.util.BlockList;
|
||||||
import org.eclipse.jgit.util.IO;
|
import org.eclipse.jgit.util.IO;
|
||||||
|
@ -192,6 +195,11 @@ public void flush() throws IOException {
|
||||||
sortObjectsById();
|
sortObjectsById();
|
||||||
|
|
||||||
PackIndex index = writePackIndex(packDsc, packHash, objectList);
|
PackIndex index = writePackIndex(packDsc, packHash, objectList);
|
||||||
|
PackConfig pConfig = new PackConfig(db.getRepository().getConfig());
|
||||||
|
if (pConfig.isWriteObjSizeIndex()) {
|
||||||
|
writeObjectSizeIndex(packDsc, objectList,
|
||||||
|
pConfig.getMinBytesForObjSizeIndex());
|
||||||
|
}
|
||||||
db.commitPack(Collections.singletonList(packDsc), null);
|
db.commitPack(Collections.singletonList(packDsc), null);
|
||||||
rollback = false;
|
rollback = false;
|
||||||
|
|
||||||
|
@ -314,6 +322,18 @@ private static void index(OutputStream out, byte[] packHash,
|
||||||
PackIndexWriter.createVersion(out, INDEX_VERSION).write(list, packHash);
|
PackIndexWriter.createVersion(out, INDEX_VERSION).write(list, packHash);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void writeObjectSizeIndex(DfsPackDescription pack,
|
||||||
|
List<PackedObjectInfo> packedObjs, int minSize) throws IOException {
|
||||||
|
try (DfsOutputStream os = db.writeFile(pack, PackExt.OBJECT_SIZE_INDEX);
|
||||||
|
CountingOutputStream cnt = new CountingOutputStream(os)) {
|
||||||
|
PackObjectSizeIndexWriter.createWriter(os, minSize)
|
||||||
|
.write(packedObjs);
|
||||||
|
pack.addFileExt(OBJECT_SIZE_INDEX);
|
||||||
|
pack.setBlockSize(OBJECT_SIZE_INDEX, os.blockSize());
|
||||||
|
pack.setFileSize(OBJECT_SIZE_INDEX, cnt.getCount());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private class PackStream extends OutputStream {
|
private class PackStream extends OutputStream {
|
||||||
private final DfsOutputStream out;
|
private final DfsOutputStream out;
|
||||||
private final MessageDigest md;
|
private final MessageDigest md;
|
||||||
|
|
Loading…
Reference in New Issue