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

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


The following commit(s) were added to refs/heads/cluster_add_snappy by this 
push:
     new 369fb6f  buffer will not shrink benethe initial capacity
369fb6f is described below

commit 369fb6f0eec91ef03f2d434c3d8da00c8a4c8647
Author: jt <[email protected]>
AuthorDate: Thu Dec 3 11:27:56 2020 +0800

    buffer will not shrink benethe initial capacity
---
 ...xpandingBuffer.java => AutoResizingBuffer.java} | 25 ++++++++++++++--------
 .../iotdb/rpc/AutoScalingBufferReadTransport.java  |  4 ++--
 .../iotdb/rpc/AutoScalingBufferWriteTransport.java |  6 +++---
 3 files changed, 21 insertions(+), 14 deletions(-)

diff --git 
a/service-rpc/src/main/java/org/apache/iotdb/rpc/AutoExpandingBuffer.java 
b/service-rpc/src/main/java/org/apache/iotdb/rpc/AutoResizingBuffer.java
similarity index 72%
rename from 
service-rpc/src/main/java/org/apache/iotdb/rpc/AutoExpandingBuffer.java
rename to service-rpc/src/main/java/org/apache/iotdb/rpc/AutoResizingBuffer.java
index 35a74d8..620b7eb 100644
--- a/service-rpc/src/main/java/org/apache/iotdb/rpc/AutoExpandingBuffer.java
+++ b/service-rpc/src/main/java/org/apache/iotdb/rpc/AutoResizingBuffer.java
@@ -25,20 +25,27 @@ import org.slf4j.LoggerFactory;
 /**
  * Helper class that wraps a byte[] so that it can expand and be reused. Users
  * should call resizeIfNecessary to make sure the buffer has suitable capacity,
- * and then use the array as needed. Note that the internal array will grow at 
a
- * rate slightly faster than the requested capacity with the (untested)
- * objective of avoiding expensive buffer allocations and copies.
+ * and then use the array as needed.
+ *
+ * Resizing policies:
+ * Expanding:
+ *  If the required size > current capacity * 1.5, expand to the required 
size, otherwise expand
+ *  to current capacity * 1.5.
+ * Shrinking:
+ *  If initial size < the required size < current capacity * 0.6, and such 
small requests last
+ *  for more than 5 times, shrink to the middle of the required size and 
current capacity.
  */
-class AutoExpandingBuffer {
+class AutoResizingBuffer {
   // if resizeIfNecessary is called continuously with a small size for more 
than
   // MAX_BUFFER_OVERSIZE_TIME times, we will shrink the buffer to reclaim space
   private static final int MAX_BUFFER_OVERSIZE_TIME = 5;
   private byte[] array;
   private int bufTooLargeCounter = MAX_BUFFER_OVERSIZE_TIME;
+  private int initialCapacity;
 
-  private static final Logger logger = 
LoggerFactory.getLogger(AutoExpandingBuffer.class);
+  private static final Logger logger = 
LoggerFactory.getLogger(AutoResizingBuffer.class);
 
-  public AutoExpandingBuffer(int initialCapacity) {
+  public AutoResizingBuffer(int initialCapacity) {
     this.array = new byte[initialCapacity];
   }
 
@@ -51,10 +58,10 @@ class AutoExpandingBuffer {
       int newCapacity = Math.max(growCapacity, size);
       this.array = Arrays.copyOf(array, newCapacity);
       bufTooLargeCounter = MAX_BUFFER_OVERSIZE_TIME;
-      logger.info("{} expand from {} to {}", this, currentCapacity, 
newCapacity);
-    } else if (size > 8 && currentCapacity * loadFactor > size && 
bufTooLargeCounter-- <= 0) {
+      logger.info("{} expand from {} to {}, request: {}", this, 
currentCapacity, newCapacity, size);
+    } else if (size > initialCapacity && currentCapacity * loadFactor > size 
&& bufTooLargeCounter-- <= 0) {
       // do not resize if it is reading the request size
-      array = Arrays.copyOf(array, size);
+      array = Arrays.copyOf(array, size + (currentCapacity - size) / 2);
       bufTooLargeCounter = MAX_BUFFER_OVERSIZE_TIME;
       logger.info("{} shrink from {} to {}", this, currentCapacity, size);
     }
diff --git 
a/service-rpc/src/main/java/org/apache/iotdb/rpc/AutoScalingBufferReadTransport.java
 
b/service-rpc/src/main/java/org/apache/iotdb/rpc/AutoScalingBufferReadTransport.java
index d94dbf8..a428343 100644
--- 
a/service-rpc/src/main/java/org/apache/iotdb/rpc/AutoScalingBufferReadTransport.java
+++ 
b/service-rpc/src/main/java/org/apache/iotdb/rpc/AutoScalingBufferReadTransport.java
@@ -24,12 +24,12 @@ import org.apache.thrift.transport.TTransportException;
 
 public class AutoScalingBufferReadTransport extends TTransport {
 
-  private final AutoExpandingBuffer buf;
+  private final AutoResizingBuffer buf;
   private int pos = 0;
   private int limit = 0;
 
   public AutoScalingBufferReadTransport(int initialCapacity) {
-    this.buf = new AutoExpandingBuffer(initialCapacity);
+    this.buf = new AutoResizingBuffer(initialCapacity);
   }
 
   public void fill(TTransport inTrans, int length) throws TTransportException {
diff --git 
a/service-rpc/src/main/java/org/apache/iotdb/rpc/AutoScalingBufferWriteTransport.java
 
b/service-rpc/src/main/java/org/apache/iotdb/rpc/AutoScalingBufferWriteTransport.java
index 26807fb..e6eab8f 100644
--- 
a/service-rpc/src/main/java/org/apache/iotdb/rpc/AutoScalingBufferWriteTransport.java
+++ 
b/service-rpc/src/main/java/org/apache/iotdb/rpc/AutoScalingBufferWriteTransport.java
@@ -27,11 +27,11 @@ import org.apache.thrift.transport.TTransport;
  */
 public class AutoScalingBufferWriteTransport extends TTransport {
 
-  private final AutoExpandingBuffer buf;
+  private final AutoResizingBuffer buf;
   private int pos;
 
   public AutoScalingBufferWriteTransport(int initialCapacity) {
-    this.buf = new AutoExpandingBuffer(initialCapacity);
+    this.buf = new AutoResizingBuffer(initialCapacity);
     this.pos = 0;
   }
 
@@ -74,7 +74,7 @@ public class AutoScalingBufferWriteTransport extends 
TTransport {
     buf.resizeIfNecessary(size);
   }
 
-  public AutoExpandingBuffer getBuf() {
+  public AutoResizingBuffer getBuf() {
     return buf;
   }
 }

Reply via email to