You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by zy...@apache.org on 2023/04/13 05:14:59 UTC

[iotdb] branch rel/1.1 updated: [To rel/1.1] Fix SchemaEngine memory control concurrent bug (#9602)

This is an automated email from the ASF dual-hosted git repository.

zyk pushed a commit to branch rel/1.1
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/rel/1.1 by this push:
     new 0346f2fd71 [To rel/1.1] Fix SchemaEngine memory control concurrent bug (#9602)
0346f2fd71 is described below

commit 0346f2fd71cb54902a117750db401f389a5ad4f1
Author: Marcos_Zyk <38...@users.noreply.github.com>
AuthorDate: Thu Apr 13 13:14:52 2023 +0800

    [To rel/1.1] Fix SchemaEngine memory control concurrent bug (#9602)
---
 .../mtree/store/disk/cache/CacheMemoryManager.java |  2 +-
 .../metadata/rescon/MemSchemaEngineStatistics.java | 26 +++++++++++++++-------
 2 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/cache/CacheMemoryManager.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/cache/CacheMemoryManager.java
index 9e46ce5285..b10ea98500 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/cache/CacheMemoryManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/cache/CacheMemoryManager.java
@@ -203,7 +203,7 @@ public class CacheMemoryManager {
                     store ->
                         CompletableFuture.runAsync(
                             () -> {
-                              store.getLock().threadReadLock();
+                              store.getLock().threadReadLock(true);
                               try {
                                 executeMemoryRelease(store);
                               } finally {
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/rescon/MemSchemaEngineStatistics.java b/server/src/main/java/org/apache/iotdb/db/metadata/rescon/MemSchemaEngineStatistics.java
index a683e343dc..d1df6690c1 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/rescon/MemSchemaEngineStatistics.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/rescon/MemSchemaEngineStatistics.java
@@ -46,6 +46,8 @@ public class MemSchemaEngineStatistics implements ISchemaEngineStatistics {
 
   private volatile boolean allowToCreateNewSeries = true;
 
+  private final Object allowToCreateNewSeriesLock = new Object();
+
   @Override
   public boolean isAllowToCreateNewSeries() {
     return allowToCreateNewSeries;
@@ -69,19 +71,27 @@ public class MemSchemaEngineStatistics implements ISchemaEngineStatistics {
   public void requestMemory(long size) {
     memoryUsage.addAndGet(size);
     if (memoryUsage.get() >= memoryCapacity) {
-      logger.warn("Current series memory {} is too large...", memoryUsage);
-      allowToCreateNewSeries = false;
+      synchronized (allowToCreateNewSeriesLock) {
+        if (allowToCreateNewSeries && memoryUsage.get() >= memoryCapacity) {
+          logger.warn("Current series memory {} is too large...", memoryUsage);
+          allowToCreateNewSeries = false;
+        }
+      }
     }
   }
 
   public void releaseMemory(long size) {
     memoryUsage.addAndGet(-size);
-    if (!allowToCreateNewSeries && memoryUsage.get() < memoryCapacity) {
-      logger.info(
-          "Current series memory {} come back to normal level, total series number is {}.",
-          memoryUsage,
-          totalSeriesNumber);
-      allowToCreateNewSeries = true;
+    if (memoryUsage.get() < memoryCapacity) {
+      synchronized (allowToCreateNewSeriesLock) {
+        if (!allowToCreateNewSeries && memoryUsage.get() < memoryCapacity) {
+          logger.info(
+              "Current series memory {} come back to normal level, total series number is {}.",
+              memoryUsage,
+              totalSeriesNumber);
+          allowToCreateNewSeries = true;
+        }
+      }
     }
   }