apurtell commented on a change in pull request #3244:
URL: https://github.com/apache/hbase/pull/3244#discussion_r629759791
##########
File path:
hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALCellCodec.java
##########
@@ -256,6 +278,26 @@ public void write(Cell cell) throws IOException {
}
}
}
+
+ private byte[] compressValue(Cell cell) throws IOException {
+ byte[] buffer = new byte[4096];
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ Deflater deflater = compression.getValueCompressor().getDeflater();
+ deflater.setInput(cell.getValueArray(), cell.getValueOffset(),
cell.getValueLength());
+ boolean finished = false;
+ do {
+ int bytesOut = deflater.deflate(buffer);
+ if (bytesOut > 0) {
+ baos.write(buffer, 0, bytesOut);
+ } else {
+ bytesOut = deflater.deflate(buffer, 0, buffer.length,
Deflater.SYNC_FLUSH);
Review comment:
Yes you are missing the semantics of Deflator#deflate.
Deflator#deflate will only return 0 if it needs more input. At this point
because there is no more input, we are now done, but we still need to flush. To
flush it we call deflate() again using the method that allows us to specify a
sync flag.
Also, buffer can be reused here like this. It's fine. buffer does not
accumulate output. It is used per pass as part of the API contract with the
compressor and then the contents are sent to the output stream.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]