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

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


The following commit(s) were added to refs/heads/arraysize by this push:
     new 2939373  new strategy
2939373 is described below

commit 2939373f3a35bd6a685083df9ebbc3918633e956
Author: Steve Yurong Su <[email protected]>
AuthorDate: Thu Jul 1 20:21:46 2021 +0800

    new strategy
---
 .../iotdb/db/rescon/PrimitiveArrayManager.java     | 98 ++++++++++------------
 1 file changed, 46 insertions(+), 52 deletions(-)

diff --git 
a/server/src/main/java/org/apache/iotdb/db/rescon/PrimitiveArrayManager.java 
b/server/src/main/java/org/apache/iotdb/db/rescon/PrimitiveArrayManager.java
index 91e4d7a..a525c8c 100644
--- a/server/src/main/java/org/apache/iotdb/db/rescon/PrimitiveArrayManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/rescon/PrimitiveArrayManager.java
@@ -56,10 +56,10 @@ public class PrimitiveArrayManager {
       config.getAllocateMemoryForWrite() * 
config.getBufferedArraysMemoryProportion();
 
   /** total size of buffered arrays */
-  private static AtomicLong bufferedArraysRamSize = new AtomicLong();
+  private static final AtomicLong bufferedArraysRamSize = new AtomicLong();
 
   /** total size of out of buffer arrays */
-  private static AtomicLong outOfBufferArraysRamSize = new AtomicLong();
+  private static final AtomicLong outOfBufferArraysRamSize = new AtomicLong();
 
   static {
     bufferedArraysMap.put(TSDataType.BOOLEAN, new ArrayDeque<>());
@@ -81,11 +81,12 @@ public class PrimitiveArrayManager {
    * @return an array
    */
   public static Object getPrimitiveArraysByType(TSDataType dataType) {
+    long delta = (long) ARRAY_SIZE * dataType.getDataTypeSize();
+
     // check memory of buffered array, if already full, generate OOB
-    if (bufferedArraysRamSize.get() + ARRAY_SIZE * dataType.getDataTypeSize()
-        > BUFFERED_ARRAY_SIZE_THRESHOLD) {
+    if (bufferedArraysRamSize.get() + delta > BUFFERED_ARRAY_SIZE_THRESHOLD) {
       // return an out of buffer array
-      outOfBufferArraysRamSize.addAndGet((long) ARRAY_SIZE * 
dataType.getDataTypeSize());
+      outOfBufferArraysRamSize.addAndGet(delta);
       return createPrimitiveArray(dataType);
     }
 
@@ -96,8 +97,9 @@ public class PrimitiveArrayManager {
         return dataArray;
       }
     }
+
     // no buffered array, create one
-    bufferedArraysRamSize.addAndGet((long) ARRAY_SIZE * 
dataType.getDataTypeSize());
+    bufferedArraysRamSize.addAndGet(delta);
     return createPrimitiveArray(dataType);
   }
 
@@ -205,34 +207,29 @@ public class PrimitiveArrayManager {
     }
 
     // Check out of buffer array num
-    if (outOfBufferArraysRamSize.get() > 0 && 
isCurrentDataTypeExceeded(dataType)) {
-      // release an out of buffer array
-      bringBackOOBArray(dataType, ARRAY_SIZE);
-    } else if (outOfBufferArraysRamSize.get() > 0 && 
!isCurrentDataTypeExceeded(dataType)) {
-      // if the ratio of buffered arrays of this data type does not exceed the 
schema ratio,
-      // choose one replaced array who has larger ratio than schema 
recommended ratio
-      TSDataType replacedDataType = null;
-      for (Entry<TSDataType, ArrayDeque<Object>> entry : 
bufferedArraysMap.entrySet()) {
-        if (isCurrentDataTypeExceeded(entry.getKey())) {
-          replacedDataType = entry.getKey();
-          // bring back the replaced array as OOB array
-          bringBackOOBArray(replacedDataType, ARRAY_SIZE);
-          break;
+    if (outOfBufferArraysRamSize.get() > 0) {
+      if (!isCurrentDataTypeExceeded(dataType)) {
+        // if the ratio of buffered arrays of this data type does not exceed 
the schema ratio,
+        // choose one replaced array who has larger ratio than schema 
recommended ratio
+        for (Entry<TSDataType, ArrayDeque<Object>> entry : 
bufferedArraysMap.entrySet()) {
+          TSDataType replacedDataType = entry.getKey();
+          if (isCurrentDataTypeExceeded(replacedDataType)) {
+            // if we find a replaced array, bring back the original array as a 
buffered array
+            if (logger.isDebugEnabled()) {
+              logger.debug(
+                  "The ratio of {} in buffered array has not reached the 
schema ratio. Replaced by {}",
+                  dataType,
+                  replacedDataType);
+            }
+            // bring back the replaced array as OOB array
+            bringBackOutOfBufferArray(replacedDataType);
+            replaceBufferedArray(dataType, replacedDataType, dataArray);
+            return;
+          }
         }
       }
-      if (replacedDataType != null) {
-        // if we find a replaced array, bring back the original array as a 
buffered array
-        if (logger.isDebugEnabled()) {
-          logger.debug(
-              "The ratio of {} in buffered array has not reached the schema 
ratio. Replaced by {}",
-              dataType,
-              replacedDataType);
-        }
-        replaceBufferedArray(dataType, replacedDataType, dataArray);
-      } else {
-        // or else bring back the original array as OOB array
-        bringBackOOBArray(dataType, ARRAY_SIZE);
-      }
+
+      bringBackOutOfBufferArray(dataType);
     } else {
       // if there is no out of buffer array, bring back as buffered array 
directly
       bringBackBufferedArray(dataType, dataArray);
@@ -251,30 +248,27 @@ public class PrimitiveArrayManager {
     }
   }
 
-  /**
-   * Replace a buffered array with an out-of-buffered array
-   *
-   * @param dataType data type
-   * @param dataArray data array
-   */
-  private static void replaceBufferedArray(TSDataType dataType, TSDataType 
replacedDataType, Object dataArray) {
-    synchronized (bufferedArraysMap.get(dataType)) {
+  private static void replaceBufferedArray(
+      TSDataType dataType, TSDataType replacedDataType, Object dataArray) {
+    if (BUFFERED_ARRAY_SIZE_THRESHOLD
+        < bufferedArraysRamSize.get()
+            + (long) ARRAY_SIZE
+                * (dataType.getDataTypeSize() - 
replacedDataType.getDataTypeSize())) {
+      synchronized (bufferedArraysMap.get(dataType)) {
+        bufferedArraysMap.get(dataType).add(dataArray);
+      }
+      bufferedArraysRamSize.addAndGet((long) ARRAY_SIZE * 
dataType.getDataTypeSize());
+    }
+
+    synchronized (bufferedArraysMap.get(replacedDataType)) {
       bufferedArraysMap.get(replacedDataType).poll();
-      bufferedArraysMap.get(dataType).add(dataArray);
-      
     }
-    bufferedArraysRamSize.addAndGet(-ARRAY_SIZE * 
replacedDataType.getDataTypeSize());
-    bufferedArraysRamSize.addAndGet(ARRAY_SIZE * dataType.getDataTypeSize());
+    bufferedArraysRamSize.addAndGet((long) -ARRAY_SIZE * 
replacedDataType.getDataTypeSize());
   }
 
-  /**
-   * Bring back out of buffered array
-   *
-   * @param dataType data type
-   * @param size capacity
-   */
-  private static void bringBackOOBArray(TSDataType dataType, int size) {
-    outOfBufferArraysRamSize.addAndGet((long) -size * 
dataType.getDataTypeSize());
+  private static void bringBackOutOfBufferArray(TSDataType dataType) {
+    outOfBufferArraysRamSize.getAndUpdate(
+        l -> Math.max(0, l - (long) ARRAY_SIZE * dataType.getDataTypeSize()));
   }
 
   /**

Reply via email to