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

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

commit 5829923e85a5b19c7d96f86a2f2f8aea443a98f1
Author: HTHou <[email protected]>
AuthorDate: Thu Jul 1 17:58:57 2021 +0800

    Fix primitive array size
---
 .../iotdb/db/rescon/PrimitiveArrayManager.java     | 43 +++++++++++++---------
 1 file changed, 26 insertions(+), 17 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 aa6c264..91e4d7a 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
@@ -31,6 +31,7 @@ import java.util.ArrayDeque;
 import java.util.Arrays;
 import java.util.EnumMap;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.concurrent.atomic.AtomicLong;
 
 /** Manage all primitive data list in memory, including get and release 
operation. */
@@ -40,10 +41,6 @@ public class PrimitiveArrayManager {
   private static final Map<TSDataType, ArrayDeque<Object>> bufferedArraysMap =
       new EnumMap<>(TSDataType.class);
 
-  /** data type -> current number of buffered arrays */
-  private static final Map<TSDataType, Integer> bufferedArraysNumMap =
-      new EnumMap<>(TSDataType.class);
-
   /** data type -> ratio of data type in schema, which could be seen as 
recommended ratio */
   private static final Map<TSDataType, Double> bufferedArraysNumRatio =
       new EnumMap<>(TSDataType.class);
@@ -98,11 +95,9 @@ public class PrimitiveArrayManager {
       if (dataArray != null) {
         return dataArray;
       }
-      // no buffered array, create one
-      bufferedArraysNumMap.put(dataType, 
bufferedArraysNumMap.getOrDefault(dataType, 0) + 1);
-      bufferedArraysRamSize.addAndGet((long) ARRAY_SIZE * 
dataType.getDataTypeSize());
     }
-
+    // no buffered array, create one
+    bufferedArraysRamSize.addAndGet((long) ARRAY_SIZE * 
dataType.getDataTypeSize());
     return createPrimitiveArray(dataType);
   }
 
@@ -217,7 +212,7 @@ public class PrimitiveArrayManager {
       // 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 (Map.Entry<TSDataType, Integer> entry : 
bufferedArraysNumMap.entrySet()) {
+      for (Entry<TSDataType, ArrayDeque<Object>> entry : 
bufferedArraysMap.entrySet()) {
         if (isCurrentDataTypeExceeded(entry.getKey())) {
           replacedDataType = entry.getKey();
           // bring back the replaced array as OOB array
@@ -233,7 +228,7 @@ public class PrimitiveArrayManager {
               dataType,
               replacedDataType);
         }
-        bringBackBufferedArray(dataType, dataArray);
+        replaceBufferedArray(dataType, replacedDataType, dataArray);
       } else {
         // or else bring back the original array as OOB array
         bringBackOOBArray(dataType, ARRAY_SIZE);
@@ -253,9 +248,23 @@ public class PrimitiveArrayManager {
   private static void bringBackBufferedArray(TSDataType dataType, Object 
dataArray) {
     synchronized (bufferedArraysMap.get(dataType)) {
       bufferedArraysMap.get(dataType).add(dataArray);
-      bufferedArraysNumMap.put(dataType, 
bufferedArraysNumMap.getOrDefault(dataType, 0) + 1);
     }
-    bufferedArraysRamSize.addAndGet((long) -ARRAY_SIZE * 
dataType.getDataTypeSize());
+  }
+
+  /**
+   * 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)) {
+      bufferedArraysMap.get(replacedDataType).poll();
+      bufferedArraysMap.get(dataType).add(dataArray);
+      
+    }
+    bufferedArraysRamSize.addAndGet(-ARRAY_SIZE * 
replacedDataType.getDataTypeSize());
+    bufferedArraysRamSize.addAndGet(ARRAY_SIZE * dataType.getDataTypeSize());
   }
 
   /**
@@ -290,12 +299,13 @@ public class PrimitiveArrayManager {
    */
   private static boolean isCurrentDataTypeExceeded(TSDataType dataType) {
     int total = 0;
-    for (int num : bufferedArraysNumMap.values()) {
-      total += num;
+    for (ArrayDeque<Object> value : bufferedArraysMap.values()) {
+      total += value.size();
     }
+    int arrayNumInBuffer =
+        bufferedArraysMap.get(dataType) == null ? 0 : 
bufferedArraysMap.get(dataType).size();
     return total != 0
-        && ((double) bufferedArraysNumMap.getOrDefault(dataType, 0) / total
-            > bufferedArraysNumRatio.getOrDefault(dataType, 0.0));
+        && ((double) arrayNumInBuffer / total > 
bufferedArraysNumRatio.getOrDefault(dataType, 0.0));
   }
 
   public static void close() {
@@ -303,7 +313,6 @@ public class PrimitiveArrayManager {
       dataListQueue.clear();
     }
 
-    bufferedArraysNumMap.clear();
     bufferedArraysNumRatio.clear();
 
     bufferedArraysRamSize.set(0);

Reply via email to