in src/main/java/com/spotify/sparkey/IndexHash.java [246:292]
private static void fillFromLog(ReadWriteData indexData, File logFile, IndexHeader header, long start, long end, LogHeader logHeader) throws IOException {
SparkeyLogIterator iterator = new SparkeyLogIterator(logFile, start, end);
BlockRandomInput logData = logHeader.getCompressionTypeBackend().createRandomAccessData(new ReadOnlyMemMap(logFile), logHeader.getCompressionBlockSize());
HashType hashData = header.getHashType();
AddressSize addressData = header.getAddressData();
int entryIndexbits = header.getEntryBlockBits();
int entryBlockBitsBitmask = header.getEntryBlockBitsBitmask();
long hashCapacity = header.getHashCapacity();
byte[] keyBuf = new byte[(int) header.getMaxKeyLen()];
try {
long prevBlock = -1;
int entryIndex = 0;
for (SparkeyReader.Entry entry2 : iterator) {
// Safe cast, since the iterator is known to be a SparkeyLogIterator
SparkeyLogIterator.Entry entry = (SparkeyLogIterator.Entry) entry2;
final SparkeyReader.Type type = entry.getType();
long curBlock = entry.getPosition();
if (curBlock != prevBlock) {
prevBlock = curBlock;
entryIndex = 0;
} else {
entryIndex++;
}
final long address = (curBlock << entryIndexbits) | entryIndex;
byte[] key = entry.getKeyBuf();
int keyLen = entry.getKeyLength();
long hash = hashData.hash(keyLen, key, header.getHashSeed());
switch (type) {
case PUT:
put(indexData, header, hashCapacity, keyLen, key,
logData, keyBuf, hashData, addressData, entryBlockBitsBitmask, entryIndexbits,
hash, address);
break;
case DELETE:
delete(indexData, header, hashCapacity, keyLen, key, logData, keyBuf,
hashData, addressData, entryBlockBitsBitmask, entryIndexbits,
hash, address);
break;
}
}
} finally {
logData.close();
}
}