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) {