This is an automated email from the ASF dual-hosted git repository.
shuwenwei pushed a commit to branch table_disk_usage_statistics_with_cache
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to
refs/heads/table_disk_usage_statistics_with_cache by this push:
new b6988599e3f add ut
b6988599e3f is described below
commit b6988599e3f560339d48d20fa4f1dba75c321758
Author: shuwenwei <[email protected]>
AuthorDate: Tue Jan 27 11:22:27 2026 +0800
add ut
---
.../utils/TsFileTableSizeCacheWriterTest.java | 143 +++++++++++++++++----
1 file changed, 118 insertions(+), 25 deletions(-)
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/utils/TsFileTableSizeCacheWriterTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/utils/TsFileTableSizeCacheWriterTest.java
index e65be56db80..7b860c570e0 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/utils/TsFileTableSizeCacheWriterTest.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/utils/TsFileTableSizeCacheWriterTest.java
@@ -25,12 +25,16 @@ import org.apache.iotdb.db.exception.StorageEngineException;
import org.apache.iotdb.db.storageengine.StorageEngine;
import org.apache.iotdb.db.storageengine.dataregion.DataRegion;
import
org.apache.iotdb.db.storageengine.dataregion.compaction.AbstractCompactionTest;
+import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileID;
import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileManager;
import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
+import
org.apache.iotdb.db.storageengine.dataregion.utils.tableDiskUsageCache.DataRegionTableSizeQueryContext;
+import
org.apache.iotdb.db.storageengine.dataregion.utils.tableDiskUsageCache.TimePartitionTableSizeQueryContext;
import
org.apache.iotdb.db.storageengine.dataregion.utils.tableDiskUsageCache.tsfile.TsFileTableDiskUsageCacheWriter;
import
org.apache.iotdb.db.storageengine.dataregion.utils.tableDiskUsageCache.tsfile.TsFileTableSizeCacheReader;
import org.apache.tsfile.exception.write.WriteProcessException;
+import org.apache.tsfile.utils.Pair;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
@@ -39,31 +43,41 @@ import org.mockito.Mockito;
import java.io.File;
import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.StandardOpenOption;
+import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
public class TsFileTableSizeCacheWriterTest extends AbstractCompactionTest {
+ private DataRegion mockDataRegion;
+ private TsFileManager mockTsFileManager;
+
@Before
public void setUp()
throws IOException, WriteProcessException, MetadataException,
InterruptedException {
super.setUp();
+ mockDataRegion = Mockito.mock(DataRegion.class);
+ Mockito.when(mockDataRegion.getDatabaseName()).thenReturn("test");
+ Mockito.when(mockDataRegion.getDataRegionIdString()).thenReturn("0");
+ StorageEngine.getInstance().setDataRegion(new DataRegionId(0),
mockDataRegion);
+ mockTsFileManager = new TsFileManager("test", "0", "");
+
Mockito.when(mockDataRegion.getTsFileManager()).thenReturn(mockTsFileManager);
}
@After
public void tearDown() throws IOException, StorageEngineException {
super.tearDown();
+ StorageEngine.getInstance().deleteDataRegion(new DataRegionId(0));
}
@Test
public void testCompactEmptyTargetFile() throws IOException {
- DataRegion dataRegion = Mockito.mock(DataRegion.class);
- Mockito.when(dataRegion.getDatabaseName()).thenReturn("root.test");
- Mockito.when(dataRegion.getDataRegionIdString()).thenReturn("0");
- StorageEngine.getInstance().setDataRegion(new DataRegionId(0), dataRegion);
- TsFileManager tsFileManager = new TsFileManager("root.test", "0", "");
- Mockito.when(dataRegion.getTsFileManager()).thenReturn(tsFileManager);
TsFileTableDiskUsageCacheWriter writer =
- new TsFileTableDiskUsageCacheWriter(dataRegion.getDatabaseName(), 0);
+ new TsFileTableDiskUsageCacheWriter(mockDataRegion.getDatabaseName(),
0);
File oldKeyFile = writer.getKeyFile();
File oldValueFile = writer.getValueFile();
Assert.assertEquals("TableSizeKeyFile_0", oldKeyFile.getName());
@@ -86,14 +100,8 @@ public class TsFileTableSizeCacheWriterTest extends
AbstractCompactionTest {
@Test
public void testCompactTargetFile1() throws IOException {
- DataRegion dataRegion = Mockito.mock(DataRegion.class);
- Mockito.when(dataRegion.getDatabaseName()).thenReturn("root.test");
- Mockito.when(dataRegion.getDataRegionIdString()).thenReturn("0");
- StorageEngine.getInstance().setDataRegion(new DataRegionId(0), dataRegion);
- TsFileManager tsFileManager = new TsFileManager("root.test", "0", "");
- Mockito.when(dataRegion.getTsFileManager()).thenReturn(tsFileManager);
TsFileTableDiskUsageCacheWriter writer =
- new TsFileTableDiskUsageCacheWriter(dataRegion.getDatabaseName(), 0);
+ new TsFileTableDiskUsageCacheWriter(mockDataRegion.getDatabaseName(),
0);
File oldKeyFile = writer.getKeyFile();
File oldValueFile = writer.getValueFile();
Assert.assertEquals("TableSizeKeyFile_0", oldKeyFile.getName());
@@ -102,8 +110,8 @@ public class TsFileTableSizeCacheWriterTest extends
AbstractCompactionTest {
TsFileResource resource1 =
createEmptyFileAndResourceWithName("1-1-0-0.tsfile", 1, true);
TsFileResource resource2 =
createEmptyFileAndResourceWithName("2-2-0-0.tsfile", 1, true);
TsFileResource resource3 =
createEmptyFileAndResourceWithName("3-3-0-0.tsfile", 1, false);
- tsFileManager.add(resource1, true);
- tsFileManager.add(resource3, false);
+ mockTsFileManager.add(resource1, true);
+ mockTsFileManager.add(resource3, false);
writer.write(resource1.getTsFileID(), Collections.singletonMap("table1",
10L));
writer.write(resource2.getTsFileID(), Collections.singletonMap("table1",
10L));
@@ -134,14 +142,8 @@ public class TsFileTableSizeCacheWriterTest extends
AbstractCompactionTest {
@Test
public void testCompactTargetFile2() throws IOException {
- DataRegion dataRegion = Mockito.mock(DataRegion.class);
- Mockito.when(dataRegion.getDatabaseName()).thenReturn("root.test");
- Mockito.when(dataRegion.getDataRegionIdString()).thenReturn("0");
- StorageEngine.getInstance().setDataRegion(new DataRegionId(0), dataRegion);
- TsFileManager tsFileManager = new TsFileManager("root.test", "0", "");
- Mockito.when(dataRegion.getTsFileManager()).thenReturn(tsFileManager);
TsFileTableDiskUsageCacheWriter writer =
- new TsFileTableDiskUsageCacheWriter(dataRegion.getDatabaseName(), 0);
+ new TsFileTableDiskUsageCacheWriter(mockDataRegion.getDatabaseName(),
0);
File oldKeyFile = writer.getKeyFile();
File oldValueFile = writer.getValueFile();
Assert.assertEquals("TableSizeKeyFile_0", oldKeyFile.getName());
@@ -150,8 +152,8 @@ public class TsFileTableSizeCacheWriterTest extends
AbstractCompactionTest {
TsFileResource resource1 =
createEmptyFileAndResourceWithName("1-1-0-0.tsfile", 1, true);
TsFileResource resource2 =
createEmptyFileAndResourceWithName("2-2-0-0.tsfile", 1, true);
TsFileResource resource3 =
createEmptyFileAndResourceWithName("3-3-0-0.tsfile", 1, false);
- tsFileManager.add(resource1, true);
- tsFileManager.add(resource2, true);
+ mockTsFileManager.add(resource1, true);
+ mockTsFileManager.add(resource2, true);
writer.write(resource1.getTsFileID(), Collections.singletonMap("table1",
10L));
writer.write(resource3.getTsFileID(), Collections.singletonMap("table2",
200L));
@@ -180,4 +182,95 @@ public class TsFileTableSizeCacheWriterTest extends
AbstractCompactionTest {
reader.closeCurrentFile();
Assert.assertEquals(2, count);
}
+
+ @Test
+ public void testReadPerformance() throws IOException {
+ TsFileTableDiskUsageCacheWriter writer =
+ new TsFileTableDiskUsageCacheWriter(mockDataRegion.getDatabaseName(),
0);
+ for (int i = 1; i <= 10; i++) {
+ for (int j = 1; j <= 10000; j++) {
+ TsFileResource resource =
+ createEmptyFileAndResourceWithName(j + "-" + j + "-0-0.tsfile", i,
true);
+ writer.write(resource.getTsFileID(), generateTableSizeMap(i));
+ }
+ }
+ Assert.assertNotEquals(writer.getKeyFile().length(),
writer.keyFileLength());
+ Assert.assertNotEquals(writer.getValueFile().length(),
writer.valueFileLength());
+ writer.close();
+ Assert.assertEquals(writer.getKeyFile().length(), writer.keyFileLength());
+ Assert.assertEquals(writer.getValueFile().length(),
writer.valueFileLength());
+ File keyFile = writer.getKeyFile();
+ File valueFile = writer.getValueFile();
+ DataRegionTableSizeQueryContext context = new
DataRegionTableSizeQueryContext(true);
+ TsFileTableSizeCacheReader reader =
+ new TsFileTableSizeCacheReader(keyFile.length(), keyFile,
valueFile.length(), valueFile, 0);
+ List<Pair<TsFileID, Long>> offsets = new ArrayList<>();
+ long start = System.currentTimeMillis();
+ reader.openKeyFile();
+ for (int i = 1; i <= 10; i++) {
+ for (int j = 1; j <= 10000; j++) {
+ Assert.assertTrue(reader.hasNextEntryInKeyFile());
+ TsFileTableSizeCacheReader.KeyFileEntry entry =
reader.readOneEntryFromKeyFile();
+ Assert.assertNotNull(entry);
+ Assert.assertNull(entry.originTsFileID);
+ Assert.assertEquals(new TsFileID(0, i, j, j, 0L), entry.tsFileID);
+ Assert.assertTrue(entry.offset >= 0);
+ offsets.add(new Pair<>(entry.tsFileID, entry.offset));
+ }
+ }
+ Assert.assertFalse(reader.hasNextEntryInKeyFile());
+ reader.closeCurrentFile();
+ reader.openValueFile();
+ reader.readFromValueFile(
+ offsets.iterator(), context, System.currentTimeMillis(),
Long.MAX_VALUE);
+ reader.closeCurrentFile();
+ System.out.println("cost: " + (System.currentTimeMillis() - start) + "ms");
+ System.out.println("keyFileLength: " + keyFile.length());
+ System.out.println("valueFileLength: " + valueFile.length());
+
+ Assert.assertEquals(10,
context.getTimePartitionTableSizeQueryContextMap().size());
+ for (Map.Entry<Long, TimePartitionTableSizeQueryContext> entry :
+ context.getTimePartitionTableSizeQueryContextMap().entrySet()) {
+ Map<String, Long> tableSizeResultMap =
entry.getValue().getTableSizeResultMap();
+ for (Map.Entry<String, Long> tableSizeEntry :
tableSizeResultMap.entrySet()) {
+ int i = Integer.parseInt(tableSizeEntry.getKey().substring(5));
+ Assert.assertEquals(Long.valueOf(i * 10000L),
tableSizeEntry.getValue());
+ }
+ }
+ }
+
+ @Test
+ public void testRecoverWriter() throws IOException {
+ TsFileTableDiskUsageCacheWriter writer =
+ new TsFileTableDiskUsageCacheWriter(mockDataRegion.getDatabaseName(),
0);
+ for (int i = 1; i <= 10; i++) {
+ for (int j = 1; j <= 10; j++) {
+ TsFileResource resource =
+ createEmptyFileAndResourceWithName(j + "-" + j + "-0-0.tsfile", i,
true);
+ writer.write(resource.getTsFileID(), generateTableSizeMap(i));
+ }
+ }
+ writer.close();
+ File keyFile = writer.getKeyFile();
+ long keyFileValidLength = keyFile.length();
+ File valueFile = writer.getValueFile();
+ long valueFileValidLength = valueFile.length();
+ Files.write(keyFile.toPath(), new byte[] {1, 2, 3, 4},
StandardOpenOption.APPEND);
+ Files.write(valueFile.toPath(), new byte[] {1, 2, 3, 4},
StandardOpenOption.APPEND);
+ Assert.assertEquals(keyFileValidLength + 4, keyFile.length());
+ Assert.assertEquals(valueFileValidLength + 4, valueFile.length());
+
+ writer = new
TsFileTableDiskUsageCacheWriter(mockDataRegion.getDatabaseName(), 0);
+ writer.close();
+ Assert.assertEquals(keyFileValidLength, keyFile.length());
+ Assert.assertEquals(valueFileValidLength, valueFile.length());
+ }
+
+ private Map<String, Long> generateTableSizeMap(int tableNum) {
+ Map<String, Long> map = new HashMap<>();
+ for (int i = 1; i <= tableNum; i++) {
+ map.put("table" + i, (long) i);
+ }
+ return map;
+ }
}