Skip to content

Commit 27e9856

Browse files
committed
Add tests for lazy aligned array accounting
1 parent 6ef2009 commit 27e9856

2 files changed

Lines changed: 58 additions & 0 deletions

File tree

iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/memtable/TsFileProcessorTest.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import org.apache.iotdb.db.storageengine.rescon.memory.SystemInfo;
4646
import org.apache.iotdb.db.utils.EnvironmentUtils;
4747
import org.apache.iotdb.db.utils.constant.TestConstant;
48+
import org.apache.iotdb.db.utils.datastructure.AlignedTVList;
4849
import org.apache.iotdb.rpc.RpcUtils;
4950
import org.apache.iotdb.rpc.TSStatusCode;
5051

@@ -933,6 +934,31 @@ record = new TSRecord("root.vehicle.d2", 102);
933934
Assert.assertEquals(memTable1.memSize(), memTable2.memSize());
934935
}
935936

937+
@Test
938+
public void testAlignedSparseRowDoesNotChargeUnallocatedPrimitiveArrayOnNewBlock()
939+
throws IOException, WriteProcessException, IllegalPathException {
940+
processor = newTestProcessor(filePath);
941+
String sparseDevice = deviceId + ".sparse";
942+
String denseDevice = deviceId + ".dense";
943+
for (int i = 0; i < PrimitiveArrayManager.ARRAY_SIZE; i++) {
944+
insertAlignedRow(processor, sparseDevice, i, true);
945+
insertAlignedRow(processor, denseDevice, i, true);
946+
}
947+
948+
IMemTable memTable = processor.getWorkMemTable();
949+
long ramCostBeforeSparseRow = memTable.getTVListsRamCost();
950+
insertAlignedRow(processor, sparseDevice, PrimitiveArrayManager.ARRAY_SIZE, false);
951+
long sparseRowRamIncrement = memTable.getTVListsRamCost() - ramCostBeforeSparseRow;
952+
953+
long ramCostBeforeDenseRow = memTable.getTVListsRamCost();
954+
insertAlignedRow(processor, denseDevice, PrimitiveArrayManager.ARRAY_SIZE, true);
955+
long denseRowRamIncrement = memTable.getTVListsRamCost() - ramCostBeforeDenseRow;
956+
957+
Assert.assertEquals(
958+
AlignedTVList.primitiveArrayMemCost(dataType),
959+
denseRowRamIncrement - sparseRowRamIncrement);
960+
}
961+
936962
@Test
937963
public void testAlignedRamCostIgnoresRelationalNonFieldAndNullFieldColumns()
938964
throws IllegalPathException, WriteProcessException, IOException {
@@ -1308,6 +1334,22 @@ private TsFileProcessor newTestProcessor(String path) throws IOException, WriteP
13081334
return newProcessor;
13091335
}
13101336

1337+
private void insertAlignedRow(
1338+
TsFileProcessor targetProcessor,
1339+
String targetDevice,
1340+
long timestamp,
1341+
boolean writeSecondColumn)
1342+
throws IllegalPathException, WriteProcessException {
1343+
TSRecord record = new TSRecord(targetDevice, timestamp);
1344+
record.addTuple(DataPoint.getDataPoint(dataType, measurementId, Long.toString(timestamp)));
1345+
if (writeSecondColumn) {
1346+
record.addTuple(DataPoint.getDataPoint(dataType, "s1", Long.toString(timestamp)));
1347+
}
1348+
InsertRowNode node = buildInsertRowNodeByTSRecord(record);
1349+
node.setAligned(true);
1350+
targetProcessor.insert(node, new long[5]);
1351+
}
1352+
13111353
private InsertTabletNode genSingleMeasurementTablet(int rowCount, boolean isAligned)
13121354
throws IllegalPathException {
13131355
String[] measurements = new String[] {measurementId};

iotdb-core/datanode/src/test/java/org/apache/iotdb/db/utils/datastructure/AlignedTVListTest.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,22 @@ public void testPrimitiveArraysAreAllocatedOnFirstWrite() {
264264
Assert.assertEquals(2, tvList.getIntByValueIndex(ARRAY_SIZE + 2, 2));
265265
}
266266

267+
@Test
268+
public void testCalculateRamSizeExcludesUnallocatedPrimitiveArrays() {
269+
AlignedTVList tvList =
270+
AlignedTVList.newAlignedList(Arrays.asList(TSDataType.INT64, TSDataType.INT64));
271+
for (int i = 0; i <= ARRAY_SIZE; i++) {
272+
tvList.putAlignedValue(i, new Object[] {(long) i, null});
273+
}
274+
275+
int blockCount = tvList.getValues().get(0).size();
276+
long denseRamSize = blockCount * tvList.alignedTvListArrayMemCost();
277+
long expectedRamSize =
278+
denseRamSize - blockCount * AlignedTVList.primitiveArrayMemCost(TSDataType.INT64);
279+
280+
Assert.assertEquals(expectedRamSize, tvList.calculateRamSize().getRamSize());
281+
}
282+
267283
@Test
268284
public void testBatchDoesNotAllocateAllNullPrimitiveArray() {
269285
AlignedTVList tvList =

0 commit comments

Comments
 (0)