@@ -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