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