HBASE-16680 Reduce garbage in BufferChain

Signed-off-by: Yu Li <l...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/191afc8e
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/191afc8e
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/191afc8e

Branch: refs/heads/master
Commit: 191afc8eb1cd9457242773606cfbf732f17449ec
Parents: 96c5a02
Author: binlijin <binli...@gmail.com>
Authored: Fri Sep 23 11:04:08 2016 +0800
Committer: Yu Li <l...@apache.org>
Committed: Fri Sep 23 11:06:23 2016 +0800

----------------------------------------------------------------------
 .../apache/hadoop/hbase/ipc/BufferChain.java    | 17 ++----------
 .../org/apache/hadoop/hbase/ipc/RpcServer.java  | 29 ++++++++++++++------
 2 files changed, 23 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/191afc8e/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/BufferChain.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/BufferChain.java 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/BufferChain.java
index 7adc94d..26bc56c 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/BufferChain.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/BufferChain.java
@@ -20,8 +20,6 @@ package org.apache.hadoop.hbase.ipc;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.channels.GatheringByteChannel;
-import java.util.ArrayList;
-import java.util.List;
 
 import org.apache.hadoop.hbase.classification.InterfaceAudience;
 
@@ -35,22 +33,11 @@ class BufferChain {
   private int remaining = 0;
   private int bufferOffset = 0;
 
-  BufferChain(ByteBuffer ... buffers) {
-    // Some of the incoming buffers can be null
-    List<ByteBuffer> bbs = new ArrayList<ByteBuffer>(buffers.length);
+  BufferChain(ByteBuffer[] buffers) {
     for (ByteBuffer b : buffers) {
-      if (b == null) continue;
-      bbs.add(b);
       this.remaining += b.remaining();
     }
-    this.buffers = bbs.toArray(new ByteBuffer[bbs.size()]);
-  }
-
-  BufferChain(List<ByteBuffer> buffers) {
-    for (ByteBuffer b : buffers) {
-      this.remaining += b.remaining();
-    }
-    this.buffers = buffers.toArray(new ByteBuffer[buffers.size()]);
+    this.buffers = buffers;
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/hbase/blob/191afc8e/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/RpcServer.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/RpcServer.java 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/RpcServer.java
index 12c21d9..0dbaf04 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/RpcServer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/RpcServer.java
@@ -411,7 +411,9 @@ public class RpcServer implements RpcServerInterface, 
ConfigurationObserver {
     }
 
     protected synchronized void setSaslTokenResponse(ByteBuffer response) {
-      this.response = new BufferChain(response);
+      ByteBuffer[] responseBufs = new ByteBuffer[1];
+      responseBufs[0] = response;
+      this.response = new BufferChain(responseBufs);
     }
 
     protected synchronized void setResponse(Object m, final CellScanner cells,
@@ -458,10 +460,20 @@ public class RpcServer implements RpcServerInterface, 
ConfigurationObserver {
         }
         Message header = headerBuilder.build();
         byte[] b = createHeaderAndMessageBytes(result, header, cellBlockSize);
-        List<ByteBuffer> responseBufs = new ArrayList<ByteBuffer>(
-            (cellBlock == null ? 1 : cellBlock.size()) + 1);
-        responseBufs.add(ByteBuffer.wrap(b));
-        if (cellBlock != null) responseBufs.addAll(cellBlock);
+        ByteBuffer[] responseBufs = null;
+        int cellBlockBufferSize = 0;
+        if (cellBlock != null) {
+          cellBlockBufferSize = cellBlock.size();
+          responseBufs = new ByteBuffer[1 + cellBlockBufferSize];
+        } else {
+          responseBufs = new ByteBuffer[1];
+        }
+        responseBufs[0] = ByteBuffer.wrap(b);
+        if (cellBlock != null) {
+          for (int i = 0; i < cellBlockBufferSize; i++) {
+            responseBufs[i + 1] = cellBlock.get(i);
+          }
+        }
         bc = new BufferChain(responseBufs);
         if (connection.useWrap) {
           bc = wrapWithSasl(bc);
@@ -555,9 +567,10 @@ public class RpcServer implements RpcServerInterface, 
ConfigurationObserver {
             + " as call response.");
       }
 
-      ByteBuffer bbTokenLength = ByteBuffer.wrap(Bytes.toBytes(token.length));
-      ByteBuffer bbTokenBytes = ByteBuffer.wrap(token);
-      return new BufferChain(bbTokenLength, bbTokenBytes);
+      ByteBuffer[] responseBufs = new ByteBuffer[2];
+      responseBufs[0] = ByteBuffer.wrap(Bytes.toBytes(token.length));
+      responseBufs[1] = ByteBuffer.wrap(token);
+      return new BufferChain(responseBufs);
     }
 
     @Override

Reply via email to