Skip to content

Commit 8a20619

Browse files
authored
Refactor write memory accounting into named memory blocks (#18848)
* Refactor write memory accounting into named memory blocks * Address write memory accounting review feedback
1 parent e08a738 commit 8a20619

27 files changed

Lines changed: 2348 additions & 241 deletions

File tree

‎integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBWriteMemoryLifecycleIT.java‎

Lines changed: 382 additions & 0 deletions
Large diffs are not rendered by default.

‎iotdb-core/datanode/src/main/i18n/en/org/apache/iotdb/db/i18n/StorageEngineMessages.java‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1670,6 +1670,15 @@ private StorageEngineMessages() {}
16701670
public static final String MESSAGE_THE_ASSOCIATED_RESOURCE_FILE_OF_ARG_IS_NOT_FOUND_IN_THE_SNAPSHOT_CB9152B5 = "The associated resource file of {} is not found in the snapshot";
16711671
public static final String MESSAGE_EVICTED_NON_EXISTING_EXISTING_SERIES_COUNT_ARG_ARG_ARG_TOTAL_REQUEST_ARG_3026ADBD = "Evicted non-existing/existing series count: {}/{}({}), total request: {}";
16721672

1673+
public static final String EXCEPTION_WRITE_MEMORY_BLOCK_ARG_IS_CLOSED_9E2561DF =
1674+
"Write memory block %s is closed";
1675+
public static final String EXCEPTION_WRITE_MEMORY_SIZE_MUST_BE_NON_NEGATIVE_ARG_2CBCF358 =
1676+
"Write memory size must be non-negative: %s";
1677+
public static final String EXCEPTION_CANNOT_RELEASE_ARG_BYTES_FROM_WRITE_MEMORY_BLOCK_ARG_WITH_ARG_BYTES_3783A614 =
1678+
"Cannot release %s bytes from write memory block %s with %s bytes";
1679+
public static final String EXCEPTION_WRITE_MEMORY_BLOCK_ARG_ALREADY_BELONGS_TO_ANOTHER_MANAGER_A05A8229 =
1680+
"Write memory block %s already belongs to another manager";
1681+
16731682
public static final String EXCEPTION_CHUNK_LAYOUT_IS_MISSING_E87C71C0 = "Chunk layout is missing";
16741683
public static final String EXCEPTION_CHUNK_HEADER_LIST_IS_EMPTY_5DE68C78 =
16751684
"Chunk header list is empty.";

‎iotdb-core/datanode/src/main/i18n/zh/org/apache/iotdb/db/i18n/StorageEngineMessages.java‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1591,6 +1591,15 @@ private StorageEngineMessages() {}
15911591
public static final String MESSAGE_THE_ASSOCIATED_RESOURCE_FILE_OF_ARG_IS_NOT_FOUND_IN_THE_SNAPSHOT_CB9152B5 = "在快照中未找到 {} 关联的资源文件";
15921592
public static final String MESSAGE_EVICTED_NON_EXISTING_EXISTING_SERIES_COUNT_ARG_ARG_ARG_TOTAL_REQUEST_ARG_3026ADBD = "淘汰的不存在/已存在时间序列数量:{}/{}({}),总请求数:{}";
15931593

1594+
public static final String EXCEPTION_WRITE_MEMORY_BLOCK_ARG_IS_CLOSED_9E2561DF =
1595+
"写入内存块 %s 已关闭";
1596+
public static final String EXCEPTION_WRITE_MEMORY_SIZE_MUST_BE_NON_NEGATIVE_ARG_2CBCF358 =
1597+
"写入内存大小不能为负数:%s";
1598+
public static final String EXCEPTION_CANNOT_RELEASE_ARG_BYTES_FROM_WRITE_MEMORY_BLOCK_ARG_WITH_ARG_BYTES_3783A614 =
1599+
"无法释放 %s 字节:写入内存块 %s 当前占用 %s 字节";
1600+
public static final String EXCEPTION_WRITE_MEMORY_BLOCK_ARG_ALREADY_BELONGS_TO_ANOTHER_MANAGER_A05A8229 =
1601+
"写入内存块 %s 已属于其他管理器";
1602+
15941603
public static final String EXCEPTION_CHUNK_LAYOUT_IS_MISSING_E87C71C0 = "缺少 Chunk layout";
15951604
public static final String EXCEPTION_CHUNK_HEADER_LIST_IS_EMPTY_5DE68C78 = "Chunk header 列表为空。";
15961605
public static final String EXCEPTION_FAILED_TO_ENCODE_CHUNK_USING_ALIGNEDCHUNKWRITERIMPL_5AAF9AA8 =

‎iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java‎

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ public class DataRegion implements IDataRegionForQuery {
372372
.build();
373373

374374
/** database info for mem control. */
375-
private final DataRegionInfo dataRegionInfo = new DataRegionInfo(this);
375+
private final DataRegionInfo dataRegionInfo;
376376

377377
/** whether it's ready from recovery. */
378378
private boolean isReady = false;
@@ -431,6 +431,7 @@ public DataRegion(
431431
this.dataRegionIdString = dataRegionIdString;
432432
this.dataRegionId = new DataRegionId(Integer.parseInt(dataRegionIdString));
433433
this.databaseName = databaseName;
434+
this.dataRegionInfo = new DataRegionInfo(this);
434435
this.fileFlushPolicy = fileFlushPolicy;
435436
this.isTableModel = isTableModelDatabase(databaseName);
436437
this.delayAnalyzer =
@@ -512,6 +513,7 @@ public DataRegion(String databaseName, String dataRegionIdString) {
512513
this.isTableModel = isTableModelDatabase(databaseName);
513514
this.dataRegionIdString = dataRegionIdString;
514515
this.dataRegionId = new DataRegionId(Integer.parseInt(this.dataRegionIdString));
516+
this.dataRegionInfo = new DataRegionInfo(this);
515517
this.tsFileManager = new TsFileManager(databaseName, dataRegionIdString, "");
516518
this.partitionMaxFileVersions = new HashMap<>();
517519
partitionMaxFileVersions.put(0L, 0L);
@@ -1073,7 +1075,9 @@ private void recoverUnsealedTsFileCallBack(UnsealedTsFileRecoverPerformer recove
10731075
tsFileResource.removeResourceFile();
10741076
tsFileProcessor.setTimeRangeId(timePartitionId);
10751077
writer.makeMetadataVisible();
1076-
TsFileProcessorInfo tsFileProcessorInfo = new TsFileProcessorInfo(dataRegionInfo);
1078+
TsFileProcessorInfo tsFileProcessorInfo =
1079+
new TsFileProcessorInfo(
1080+
dataRegionInfo, tsFileProcessor.getTsFileResource().getTsFilePath());
10771081
tsFileProcessor.setTsFileProcessorInfo(tsFileProcessorInfo);
10781082
this.dataRegionInfo.initTsFileProcessorInfo(tsFileProcessor);
10791083
// get chunkMetadata size
@@ -2322,7 +2326,9 @@ private TsFileProcessor getTsFileProcessor(
23222326
this::flushCallback,
23232327
sequence);
23242328

2325-
TsFileProcessorInfo tsFileProcessorInfo = new TsFileProcessorInfo(dataRegionInfo);
2329+
TsFileProcessorInfo tsFileProcessorInfo =
2330+
new TsFileProcessorInfo(
2331+
dataRegionInfo, tsFileProcessor.getTsFileResource().getTsFilePath());
23262332
tsFileProcessor.setTsFileProcessorInfo(tsFileProcessorInfo);
23272333
this.dataRegionInfo.initTsFileProcessorInfo(tsFileProcessor);
23282334

‎iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegionInfo.java‎

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.apache.iotdb.db.conf.IoTDBDescriptor;
2222
import org.apache.iotdb.db.storageengine.dataregion.memtable.TsFileProcessor;
2323
import org.apache.iotdb.db.storageengine.rescon.memory.SystemInfo;
24+
import org.apache.iotdb.db.storageengine.rescon.memory.WriteMemoryManager;
2425

2526
import java.util.List;
2627
import java.util.concurrent.CopyOnWriteArrayList;
@@ -32,11 +33,7 @@ public class DataRegionInfo {
3233

3334
private final DataRegion dataRegion;
3435

35-
/**
36-
* The total database memory cost, including unsealed TsFileResource, ChunkMetadata, WAL,
37-
* primitive arrays and TEXT values
38-
*/
39-
private final AtomicLong memoryCost;
36+
private final WriteMemoryManager writeMemoryManager;
4037

4138
/** The threshold of reporting it's size to SystemInfo */
4239
private final long storageGroupSizeReportThreshold =
@@ -57,7 +54,13 @@ public class DataRegionInfo {
5754

5855
public DataRegionInfo(DataRegion dataRegion) {
5956
this.dataRegion = dataRegion;
60-
memoryCost = new AtomicLong();
57+
this.writeMemoryManager =
58+
new WriteMemoryManager(
59+
"DataRegion["
60+
+ dataRegion.getDatabaseName()
61+
+ "/"
62+
+ dataRegion.getDataRegionIdString()
63+
+ "]");
6164
}
6265

6366
public DataRegion getDataRegion() {
@@ -69,16 +72,12 @@ public void initTsFileProcessorInfo(TsFileProcessor tsFileProcessor) {
6972
reportedTsps.add(tsFileProcessor);
7073
}
7174

72-
public void addStorageGroupMemCost(long cost) {
73-
memoryCost.getAndAdd(cost);
74-
}
75-
76-
public void releaseStorageGroupMemCost(long cost) {
77-
memoryCost.getAndAdd(-cost);
75+
public WriteMemoryManager getWriteMemoryManager() {
76+
return writeMemoryManager;
7877
}
7978

8079
public long getMemCost() {
81-
return memoryCost.get();
80+
return writeMemoryManager.getMemoryUsageInBytes();
8281
}
8382

8483
public List<TsFileProcessor> getAllReportedTsp() {
@@ -87,7 +86,7 @@ public List<TsFileProcessor> getAllReportedTsp() {
8786

8887
public boolean needToReportToSystem() {
8988
boolean needToReport =
90-
memoryCost.get() - lastReportedSize.get() > storageGroupSizeReportThreshold
89+
getMemCost() - lastReportedSize.get() > storageGroupSizeReportThreshold
9190
|| needToReportToSystem.get();
9291
// report once and then reset flag to false
9392
if (needToReportToSystem.get()) {

0 commit comments

Comments
 (0)