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

tanxinyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new cec66b62f5 Use CAS way to reserve memory (#7939)
cec66b62f5 is described below

commit cec66b62f57d3b947125618f475303b4a031566a
Author: ZhangHongYin <[email protected]>
AuthorDate: Tue Nov 8 21:36:10 2022 +0800

    Use CAS way to reserve memory (#7939)
---
 .../logdispatcher/MultiLeaderMemoryManager.java    | 40 +++++++++++++---------
 1 file changed, 23 insertions(+), 17 deletions(-)

diff --git 
a/consensus/src/main/java/org/apache/iotdb/consensus/multileader/logdispatcher/MultiLeaderMemoryManager.java
 
b/consensus/src/main/java/org/apache/iotdb/consensus/multileader/logdispatcher/MultiLeaderMemoryManager.java
index 36c6c98b2b..fb64f8a489 100644
--- 
a/consensus/src/main/java/org/apache/iotdb/consensus/multileader/logdispatcher/MultiLeaderMemoryManager.java
+++ 
b/consensus/src/main/java/org/apache/iotdb/consensus/multileader/logdispatcher/MultiLeaderMemoryManager.java
@@ -24,6 +24,7 @@ import org.apache.iotdb.commons.service.metric.MetricService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicLong;
 
 public class MultiLeaderMemoryManager {
@@ -36,23 +37,28 @@ public class MultiLeaderMemoryManager {
   }
 
   public boolean reserve(long size) {
-    synchronized (this) {
-      if (size > maxMemorySizeInByte - memorySizeInByte.get()) {
-        logger.debug(
-            "consensus memory limited. required: {}, used: {}, total: {}",
-            size,
-            memorySizeInByte.get(),
-            maxMemorySizeInByte);
-        return false;
-      }
-      memorySizeInByte.addAndGet(size);
-    }
-    logger.debug(
-        "{} add {} bytes, total memory size: {} bytes.",
-        Thread.currentThread().getName(),
-        size,
-        memorySizeInByte.get());
-    return true;
+    AtomicBoolean result = new AtomicBoolean(false);
+    memorySizeInByte.updateAndGet(
+        (memorySize) -> {
+          if (size > maxMemorySizeInByte - memorySize) {
+            logger.debug(
+                "consensus memory limited. required: {}, used: {}, total: {}",
+                size,
+                memorySize,
+                maxMemorySizeInByte);
+            result.set(false);
+            return memorySize;
+          } else {
+            logger.debug(
+                "{} add {} bytes, total memory size: {} bytes.",
+                Thread.currentThread().getName(),
+                size,
+                memorySize + size);
+            result.set(true);
+            return memorySize + size;
+          }
+        });
+    return result.get();
   }
 
   public void free(long size) {

Reply via email to