Skip to content

Commit 394467b

Browse files
authored
[IOTDB-1541] Change sequence of wal and memtable in insert (#3660)
1 parent 1462869 commit 394467b

File tree

3 files changed

+59
-10
lines changed

3 files changed

+59
-10
lines changed

server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -392,14 +392,24 @@ public void addTVListRamCost(long cost) {
392392
this.tvListRamCost += cost;
393393
}
394394

395+
@Override
396+
public void releaseTVListRamCost(long cost) {
397+
this.tvListRamCost -= cost;
398+
}
399+
395400
@Override
396401
public long getTVListsRamCost() {
397402
return tvListRamCost;
398403
}
399404

400405
@Override
401-
public void addTextDataSize(long testDataSize) {
402-
this.memSize += testDataSize;
406+
public void addTextDataSize(long textDataSize) {
407+
this.memSize += textDataSize;
408+
}
409+
410+
@Override
411+
public void releaseTextDataSize(long textDataSize) {
412+
this.memSize -= textDataSize;
403413
}
404414

405415
@Override

server/src/main/java/org/apache/iotdb/db/engine/memtable/IMemTable.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ public interface IMemTable {
5757
/** only used when mem control enabled */
5858
void addTVListRamCost(long cost);
5959

60+
/** only used when mem control enabled */
61+
void releaseTVListRamCost(long cost);
62+
6063
/** only used when mem control enabled */
6164
long getTVListsRamCost();
6265

@@ -137,6 +140,9 @@ ReadOnlyMemChunk query(
137140
/** only used when mem control enabled */
138141
void addTextDataSize(long textDataIncrement);
139142

143+
/** only used when mem control enabled */
144+
void releaseTextDataSize(long textDataDecrement);
145+
140146
long getMaxPlanIndex();
141147

142148
long getMinPlanIndex();

server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -209,16 +209,18 @@ public void insert(InsertRowPlan insertRowPlan) throws WriteProcessException {
209209
}
210210
}
211211

212+
long[] memIncrements = null;
212213
if (enableMemControl) {
213-
checkMemCostAndAddToTspInfo(insertRowPlan);
214+
memIncrements = checkMemCostAndAddToTspInfo(insertRowPlan);
214215
}
215216

216-
workMemTable.insert(insertRowPlan);
217-
218217
if (IoTDBDescriptor.getInstance().getConfig().isEnableWal()) {
219218
try {
220219
getLogNode().write(insertRowPlan);
221220
} catch (Exception e) {
221+
if (enableMemControl && memIncrements != null) {
222+
rollbackMemoryInfo(memIncrements);
223+
}
222224
throw new WriteProcessException(
223225
String.format(
224226
"%s: %s write WAL failed",
@@ -227,6 +229,8 @@ public void insert(InsertRowPlan insertRowPlan) throws WriteProcessException {
227229
}
228230
}
229231

232+
workMemTable.insert(insertRowPlan);
233+
230234
// update start time of this memtable
231235
tsFileResource.updateStartTime(
232236
insertRowPlan.getPrefixPath().getFullPath(), insertRowPlan.getTime());
@@ -261,29 +265,43 @@ public void insertTablet(
261265
}
262266
}
263267

268+
long[] memIncrements = null;
264269
try {
265270
if (enableMemControl) {
266-
checkMemCostAndAddToTspInfo(insertTabletPlan, start, end);
271+
memIncrements = checkMemCostAndAddToTspInfo(insertTabletPlan, start, end);
267272
}
268273
} catch (WriteProcessException e) {
269274
for (int i = start; i < end; i++) {
270275
results[i] = RpcUtils.getStatus(TSStatusCode.WRITE_PROCESS_REJECT, e.getMessage());
271276
}
272277
throw new WriteProcessException(e);
273278
}
279+
274280
try {
275-
workMemTable.insertTablet(insertTabletPlan, start, end);
276281
if (IoTDBDescriptor.getInstance().getConfig().isEnableWal()) {
277282
insertTabletPlan.setStart(start);
278283
insertTabletPlan.setEnd(end);
279284
getLogNode().write(insertTabletPlan);
280285
}
281286
} catch (Exception e) {
287+
for (int i = start; i < end; i++) {
288+
results[i] = RpcUtils.getStatus(TSStatusCode.INTERNAL_SERVER_ERROR, e.getMessage());
289+
}
290+
if (enableMemControl && memIncrements != null) {
291+
rollbackMemoryInfo(memIncrements);
292+
}
293+
throw new WriteProcessException(e);
294+
}
295+
296+
try {
297+
workMemTable.insertTablet(insertTabletPlan, start, end);
298+
} catch (WriteProcessException e) {
282299
for (int i = start; i < end; i++) {
283300
results[i] = RpcUtils.getStatus(TSStatusCode.INTERNAL_SERVER_ERROR, e.getMessage());
284301
}
285302
throw new WriteProcessException(e);
286303
}
304+
287305
for (int i = start; i < end; i++) {
288306
results[i] = RpcUtils.SUCCESS_STATUS;
289307
}
@@ -300,7 +318,7 @@ public void insertTablet(
300318
}
301319

302320
@SuppressWarnings("squid:S3776") // high Cognitive Complexity
303-
private void checkMemCostAndAddToTspInfo(InsertRowPlan insertRowPlan)
321+
private long[] checkMemCostAndAddToTspInfo(InsertRowPlan insertRowPlan)
304322
throws WriteProcessException {
305323
// memory of increased PrimitiveArray and TEXT values, e.g., add a long[128], add 128*8
306324
long memTableIncrement = 0L;
@@ -347,12 +365,13 @@ private void checkMemCostAndAddToTspInfo(InsertRowPlan insertRowPlan)
347365
}
348366
}
349367
updateMemoryInfo(memTableIncrement, chunkMetadataIncrement, textDataIncrement);
368+
return new long[] {memTableIncrement, textDataIncrement, chunkMetadataIncrement};
350369
}
351370

352-
private void checkMemCostAndAddToTspInfo(InsertTabletPlan insertTabletPlan, int start, int end)
371+
private long[] checkMemCostAndAddToTspInfo(InsertTabletPlan insertTabletPlan, int start, int end)
353372
throws WriteProcessException {
354373
if (start >= end) {
355-
return;
374+
return new long[] {0, 0, 0};
356375
}
357376
long[] memIncrements = new long[3]; // memTable, text, chunk metadata
358377

@@ -388,6 +407,7 @@ private void checkMemCostAndAddToTspInfo(InsertTabletPlan insertTabletPlan, int
388407
long textDataIncrement = memIncrements[1];
389408
long chunkMetadataIncrement = memIncrements[2];
390409
updateMemoryInfo(memTableIncrement, chunkMetadataIncrement, textDataIncrement);
410+
return memIncrements;
391411
}
392412

393413
private void updateMemCost(
@@ -492,6 +512,19 @@ private void updateMemoryInfo(
492512
workMemTable.addTextDataSize(textDataIncrement);
493513
}
494514

515+
private void rollbackMemoryInfo(long[] memIncrements) {
516+
long memTableIncrement = memIncrements[0];
517+
long textDataIncrement = memIncrements[1];
518+
long chunkMetadataIncrement = memIncrements[2];
519+
520+
memTableIncrement += textDataIncrement;
521+
storageGroupInfo.releaseStorageGroupMemCost(memTableIncrement);
522+
tsFileProcessorInfo.releaseTSPMemCost(chunkMetadataIncrement);
523+
SystemInfo.getInstance().resetStorageGroupStatus(storageGroupInfo);
524+
workMemTable.releaseTVListRamCost(memTableIncrement);
525+
workMemTable.releaseTextDataSize(textDataIncrement);
526+
}
527+
495528
/**
496529
* Delete data which belongs to the timeseries `deviceId.measurementId` and the timestamp of which
497530
* <= 'timestamp' in the deletion. <br>

0 commit comments

Comments
 (0)