private static void fillFromLog()

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();
    }
  }