private void addNewMap()

in graphjet-core/src/main/java/com/twitter/graphjet/hashing/ArrayBasedLongToInternalIntBiMap.java [166:199]


  private void addNewMap() {
    int numMaps = readerAccessibleInfo.maps.length;
    // first the actual maps
    ArrayBasedLongToInternalIntFixedLengthBiMap[] newMaps =
        new ArrayBasedLongToInternalIntFixedLengthBiMap[numMaps + 1];
    System.arraycopy(readerAccessibleInfo.maps, 0, newMaps, 0, numMaps);
    newMaps[numMaps] = new ArrayBasedLongToInternalIntFixedLengthBiMap(
        expectedNumKeys / 4,
        loadFactor,
        defaultGetReturnValue,
        defaultGetKeyReturnValue,
        scopedStatsReceiver.scope(Integer.toString(numMaps)));
    // now the lengths
    int[] newCumulativeMapLengths = new int[numMaps + 1];
    System.arraycopy(
        readerAccessibleInfo.cumulativeMapLengths, 0, newCumulativeMapLengths, 0, numMaps);
    newCumulativeMapLengths[numMaps] =
        newMaps[numMaps].getBackingArrayLength() + newCumulativeMapLengths[numMaps - 1];
    // and the index offsets
    int[] newMapIndexOffsets = new int[numMaps + 1];
    System.arraycopy(readerAccessibleInfo.mapIndexOffsets, 0, newMapIndexOffsets, 0, numMaps);
    newMapIndexOffsets[numMaps] = newCumulativeMapLengths[numMaps - 1];
    // change the active maps, which is only seen by the writer
    currentActiveMapId++;
    currentActiveMap = newMaps[currentActiveMapId];
    currentActiveMapIndexOffset = newMapIndexOffsets[currentActiveMapId];
    // reset the object which should publish the update to all readers
    readerAccessibleInfo = new ReaderAccessibleInfo(
        newMaps,
        newMapIndexOffsets,
        newCumulativeMapLengths);
    numFixedLengthMapsCounter.incr();
    totalAllocatedArrayBytesCounter.incr(8 * currentActiveMap.getBackingArrayLength());
  }