diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/HBaseClient.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/HBaseClient.java index 855e8dc..7fd0370 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/HBaseClient.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/HBaseClient.java @@ -1026,7 +1026,7 @@ public class HBaseClient { if (responseHeader.hasCellBlockMeta()) { int size = responseHeader.getCellBlockMeta().getLength(); byte [] cellBlock = new byte[size]; - IOUtils.readFully(this.in, cellBlock, 0, cellBlock.length); + IPCUtil.readChunked(this.in, cellBlock, 0, size); cellBlockScanner = ipcUtil.createCellScanner(this.codec, this.compressor, cellBlock); } // it's possible that this call may have been cleaned up due to a RPC diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/IPCUtil.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/IPCUtil.java index 707c2bf..19c786d 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/IPCUtil.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/IPCUtil.java @@ -18,6 +18,7 @@ package org.apache.hadoop.hbase.ipc; import java.io.ByteArrayInputStream; +import java.io.DataInput; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; @@ -231,6 +232,23 @@ class IPCUtil { } /** + * Read in chunks of 8K (HBASE-7239) + * @param in + * @param dest + * @param offset + * @param len + * @throws IOException + */ + static void readChunked(final DataInput in, byte[] dest, int offset, int len) + throws IOException { + int maxRead = 8192; + + for (; offset < len; offset += maxRead) { + in.readFully(dest, offset, Math.min(len - offset, maxRead)); + } + } + + /** * @param header * @param body * @return Size on the wire when the two messages are written with writeDelimitedTo