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 2b87ce713a7 refactor
2b87ce713a7 is described below
commit 2b87ce713a7fc7a8bf1079fee0c982c3bdbf1b49
Author: shuwenwei <[email protected]>
AuthorDate: Tue Jan 20 18:45:27 2026 +0800
refactor
---
.../AbstractTableSizeCacheWriter.java | 80 +++++++++++++++
.../TsFileTableDiskUsageCacheWriter.java | 111 ++++++++-------------
...er.java => TsFileTableSizeIndexFileWriter.java} | 6 +-
3 files changed, 122 insertions(+), 75 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/tableDiskUsageCache/AbstractTableSizeCacheWriter.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/tableDiskUsageCache/AbstractTableSizeCacheWriter.java
new file mode 100644
index 00000000000..8e10932ebd6
--- /dev/null
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/tableDiskUsageCache/AbstractTableSizeCacheWriter.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.storageengine.dataregion.utils.tableDiskUsageCache;
+
+import org.apache.iotdb.db.storageengine.StorageEngine;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+public abstract class AbstractTableSizeCacheWriter {
+ protected final int regionId;
+ protected int activeReaderNum = 0;
+ protected long previousCompactionTimestamp = System.currentTimeMillis();
+ protected long lastWriteTimestamp = System.currentTimeMillis();
+ protected int currentIndexFileVersion = 0;
+ protected final File dir;
+
+ public AbstractTableSizeCacheWriter(String database, int regionId) {
+ this.regionId = regionId;
+ this.dir = StorageEngine.getDataRegionSystemDir(database, regionId + "");
+ }
+
+ protected void deleteOldVersionFiles(int maxVersion, String prefix,
List<File> files) {
+ for (File file : files) {
+ try {
+ int version =
Integer.parseInt(file.getName().substring(prefix.length()));
+ if (version != maxVersion) {
+ Files.deleteIfExists(file.toPath());
+ }
+ } catch (Exception e) {
+ }
+ }
+ }
+
+ public void closeIfIdle() {
+ if (System.currentTimeMillis() - lastWriteTimestamp >=
TimeUnit.MINUTES.toMillis(1)) {
+ close();
+ }
+ }
+
+ public abstract boolean needCompact();
+
+ public abstract void compact();
+
+ public abstract void flush() throws IOException;
+
+ public abstract void sync() throws IOException;
+
+ public void increaseActiveReaderNum() {
+ activeReaderNum++;
+ }
+
+ public void decreaseActiveReaderNum() {
+ if (activeReaderNum > 0) {
+ activeReaderNum--;
+ }
+ }
+
+ public abstract void close();
+}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/tableDiskUsageCache/TsFileTableDiskUsageCacheWriter.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/tableDiskUsageCache/TsFileTableDiskUsageCacheWriter.java
index fd1c79b06ed..1dc81056b21 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/tableDiskUsageCache/TsFileTableDiskUsageCacheWriter.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/tableDiskUsageCache/TsFileTableDiskUsageCacheWriter.java
@@ -42,7 +42,7 @@ import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;
-public class TsFileTableDiskUsageCacheWriter {
+public class TsFileTableDiskUsageCacheWriter extends
AbstractTableSizeCacheWriter {
private static final Logger logger =
LoggerFactory.getLogger(TsFileTableDiskUsageCacheWriter.class);
private static final String TSFILE_CACHE_KEY_FILENAME_PREFIX =
"TableSizeKeyFile_";
@@ -53,24 +53,17 @@ public class TsFileTableDiskUsageCacheWriter {
public static final byte KEY_FILE_RECORD_TYPE_OFFSET = 1;
public static final byte KEY_FILE_RECORD_TYPE_REDIRECT = 2;
- private final int regionId;
- private int activeReaderNum = 0;
- private long previousCompactionTimestamp = System.currentTimeMillis();
- private long lastWriteTimestamp = System.currentTimeMillis();
- private int currentTsFileIndexFileVersion = 0;
- private final File dir;
- private TsFileTableSizeCacheWriter tsFileTableSizeCacheWriter;
+ private TsFileTableSizeIndexFileWriter tsFileTableSizeIndexFileWriter;
public TsFileTableDiskUsageCacheWriter(String database, int regionId) {
- this.regionId = regionId;
- this.dir = StorageEngine.getDataRegionSystemDir(database, regionId + "");
+ super(database, regionId);
recoverTsFileTableSizeIndexFile(true);
}
private void recoverTsFileTableSizeIndexFile(boolean needRecover) {
dir.mkdirs();
File[] files = dir.listFiles();
- currentTsFileIndexFileVersion = 0;
+ currentIndexFileVersion = 0;
List<File> keyFiles = new ArrayList<>();
List<File> valueFiles = new ArrayList<>();
if (files != null) {
@@ -114,54 +107,36 @@ public class TsFileTableDiskUsageCacheWriter {
continue;
}
}
- currentTsFileIndexFileVersion =
Math.max(currentTsFileIndexFileVersion, version);
+ currentIndexFileVersion = Math.max(currentIndexFileVersion, version);
keyFiles.add(file);
}
if (keyFiles.size() > 1) {
- deleteOldVersionFiles(
- currentTsFileIndexFileVersion, TSFILE_CACHE_KEY_FILENAME_PREFIX,
keyFiles);
+ deleteOldVersionFiles(currentIndexFileVersion,
TSFILE_CACHE_KEY_FILENAME_PREFIX, keyFiles);
}
if (valueFiles.size() > 1) {
deleteOldVersionFiles(
- currentTsFileIndexFileVersion, TSFILE_CACHE_VALUE_FILENAME_PREFIX,
valueFiles);
+ currentIndexFileVersion, TSFILE_CACHE_VALUE_FILENAME_PREFIX,
valueFiles);
}
}
- File currentKeyIndexFile = generateKeyFile(currentTsFileIndexFileVersion,
false);
- File currentValueIndexFile =
generateValueFile(currentTsFileIndexFileVersion, false);
+ File currentKeyIndexFile = generateKeyFile(currentIndexFileVersion, false);
+ File currentValueIndexFile = generateValueFile(currentIndexFileVersion,
false);
try {
- this.tsFileTableSizeCacheWriter =
- new TsFileTableSizeCacheWriter(
+ this.tsFileTableSizeIndexFileWriter =
+ new TsFileTableSizeIndexFileWriter(
regionId, currentKeyIndexFile, currentValueIndexFile,
needRecover);
} catch (IOException ignored) {
}
}
- private void deleteOldVersionFiles(int maxVersion, String prefix, List<File>
files) {
- for (File file : files) {
- try {
- int version =
Integer.parseInt(file.getName().substring(prefix.length()));
- if (version != maxVersion) {
- Files.deleteIfExists(file.toPath());
- }
- } catch (Exception e) {
- }
- }
- }
-
public void write(TsFileID tsFileID, Map<String, Long> tableSizeMap) throws
IOException {
- tsFileTableSizeCacheWriter.write(tsFileID, tableSizeMap);
+ tsFileTableSizeIndexFileWriter.write(tsFileID, tableSizeMap);
}
public void write(TsFileID originTsFileID, TsFileID newTsFileID) throws
IOException {
- tsFileTableSizeCacheWriter.write(originTsFileID, newTsFileID);
- }
-
- public void closeIfIdle() {
- if (System.currentTimeMillis() - lastWriteTimestamp >=
TimeUnit.MINUTES.toMillis(1)) {
- close();
- }
+ tsFileTableSizeIndexFileWriter.write(originTsFileID, newTsFileID);
}
+ @Override
public boolean needCompact() {
if (activeReaderNum > 0) {
return false;
@@ -180,15 +155,16 @@ public class TsFileTableDiskUsageCacheWriter {
return delta >= 1000;
}
+ @Override
public void compact() {
previousCompactionTimestamp = System.currentTimeMillis();
- this.tsFileTableSizeCacheWriter.close();
+ this.tsFileTableSizeIndexFileWriter.close();
TsFileTableSizeCacheReader cacheFileReader =
new TsFileTableSizeCacheReader(
- tsFileTableSizeCacheWriter.getKeyFile().length(),
- tsFileTableSizeCacheWriter.getKeyFile(),
- tsFileTableSizeCacheWriter.getValueFile().length(),
- tsFileTableSizeCacheWriter.getValueFile(),
+ tsFileTableSizeIndexFileWriter.getKeyFile().length(),
+ tsFileTableSizeIndexFileWriter.getKeyFile(),
+ tsFileTableSizeIndexFileWriter.getValueFile().length(),
+ tsFileTableSizeIndexFileWriter.getValueFile(),
regionId);
Map<Long, TimePartitionTableSizeQueryContext> contextMap = new HashMap<>();
try {
@@ -236,13 +212,13 @@ public class TsFileTableDiskUsageCacheWriter {
}
validFilesOrderByOffset.sort(Comparator.comparingLong(Pair::getRight));
- TsFileTableSizeCacheWriter targetFileWriter = null;
+ TsFileTableSizeIndexFileWriter targetFileWriter = null;
try {
targetFileWriter =
- new TsFileTableSizeCacheWriter(
+ new TsFileTableSizeIndexFileWriter(
regionId,
- generateKeyFile(currentTsFileIndexFileVersion + 1, true),
- generateValueFile(currentTsFileIndexFileVersion + 1, true));
+ generateKeyFile(currentIndexFileVersion + 1, true),
+ generateValueFile(currentIndexFileVersion + 1, true));
cacheFileReader.openValueFile();
for (Pair<TsFileID, Long> pair : validFilesOrderByOffset) {
TsFileID tsFileID = pair.getLeft();
@@ -253,16 +229,16 @@ public class TsFileTableDiskUsageCacheWriter {
targetFileWriter.close();
// replace
- File targetKeyFile = generateKeyFile(currentTsFileIndexFileVersion + 1,
false);
- File targetValueFile = generateValueFile(currentTsFileIndexFileVersion +
1, false);
+ File targetKeyFile = generateKeyFile(currentIndexFileVersion + 1, false);
+ File targetValueFile = generateValueFile(currentIndexFileVersion + 1,
false);
targetFileWriter.getKeyFile().renameTo(targetKeyFile);
targetFileWriter.getValueFile().renameTo(targetValueFile);
- this.tsFileTableSizeCacheWriter.close();
+ this.tsFileTableSizeIndexFileWriter.close();
} catch (Exception e) {
logger.error("Failed to execute compaction for tsfile table size cache
file", e);
} finally {
- if (tsFileTableSizeCacheWriter != null) {
- tsFileTableSizeCacheWriter.close();
+ if (tsFileTableSizeIndexFileWriter != null) {
+ tsFileTableSizeIndexFileWriter.close();
}
if (targetFileWriter != null) {
targetFileWriter.close();
@@ -290,43 +266,34 @@ public class TsFileTableDiskUsageCacheWriter {
+ (isTempFile ? TEMP_CACHE_FILE_SUBFIX : ""));
}
+ @Override
public void flush() throws IOException {
- tsFileTableSizeCacheWriter.flush();
+ tsFileTableSizeIndexFileWriter.flush();
}
public File getKeyFile() {
- return tsFileTableSizeCacheWriter.getKeyFile();
+ return tsFileTableSizeIndexFileWriter.getKeyFile();
}
public File getValueFile() {
- return tsFileTableSizeCacheWriter.getValueFile();
+ return tsFileTableSizeIndexFileWriter.getValueFile();
}
public long keyFileLength() {
- return tsFileTableSizeCacheWriter.keyFileLength();
+ return tsFileTableSizeIndexFileWriter.keyFileLength();
}
public long valueFileLength() {
- return tsFileTableSizeCacheWriter.valueFileLength();
+ return tsFileTableSizeIndexFileWriter.valueFileLength();
}
+ @Override
public void sync() throws IOException {
- tsFileTableSizeCacheWriter.sync();
- }
-
- public void increaseActiveReaderNum() {
- activeReaderNum++;
- }
-
- public void decreaseActiveReaderNum() {
- if (activeReaderNum > 0) {
- activeReaderNum--;
- }
+ tsFileTableSizeIndexFileWriter.sync();
}
- public void removeFiles() {}
-
+ @Override
public void close() {
- this.tsFileTableSizeCacheWriter.close();
+ this.tsFileTableSizeIndexFileWriter.close();
}
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/tableDiskUsageCache/TsFileTableSizeCacheWriter.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/tableDiskUsageCache/TsFileTableSizeIndexFileWriter.java
similarity index 98%
rename from
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/tableDiskUsageCache/TsFileTableSizeCacheWriter.java
rename to
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/tableDiskUsageCache/TsFileTableSizeIndexFileWriter.java
index b073a5f2204..a5f6aba555d 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/tableDiskUsageCache/TsFileTableSizeCacheWriter.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/tableDiskUsageCache/TsFileTableSizeIndexFileWriter.java
@@ -36,7 +36,7 @@ import java.util.Map;
import static
org.apache.iotdb.db.storageengine.dataregion.utils.tableDiskUsageCache.TsFileTableDiskUsageCacheWriter.KEY_FILE_RECORD_TYPE_OFFSET;
import static
org.apache.iotdb.db.storageengine.dataregion.utils.tableDiskUsageCache.TsFileTableDiskUsageCacheWriter.KEY_FILE_RECORD_TYPE_REDIRECT;
-public class TsFileTableSizeCacheWriter {
+public class TsFileTableSizeIndexFileWriter {
private final int regionId;
private final File currentKeyIndexFile;
private final File currentValueIndexFile;
@@ -47,12 +47,12 @@ public class TsFileTableSizeCacheWriter {
private long keyFileSize;
private long valueFileSize;
- public TsFileTableSizeCacheWriter(
+ public TsFileTableSizeIndexFileWriter(
int regionId, File currentKeyIndexFile, File currentValueIndexFile)
throws IOException {
this(regionId, currentKeyIndexFile, currentValueIndexFile, true);
}
- public TsFileTableSizeCacheWriter(
+ public TsFileTableSizeIndexFileWriter(
int regionId, File currentKeyIndexFile, File currentValueIndexFile,
boolean recover)
throws IOException {
this.regionId = regionId;