You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by la...@apache.org on 2012/04/08 02:41:25 UTC
svn commit: r1310932 - in
/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io/hfile:
HFileBlock.java HFileDataBlockEncoderImpl.java
Author: larsh
Date: Sun Apr 8 00:41:24 2012
New Revision: 1310932
URL: http://svn.apache.org/viewvc?rev=1310932&view=rev
Log:
HBASE-5720 HFileDataBlockEncoderImpl uses wrong header size when reading HFiles with no checksums (Matt Corgan)
Modified:
hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileBlock.java
hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoderImpl.java
Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileBlock.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileBlock.java?rev=1310932&r1=1310931&r2=1310932&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileBlock.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileBlock.java Sun Apr 8 00:41:24 2012
@@ -2073,6 +2073,23 @@ public class HFileBlock extends SchemaCo
}
/**
+ * Return the appropriate DUMMY_HEADER for the minor version
+ */
+ public byte[] getDummyHeaderForVersion() {
+ return getDummyHeaderForVersion(minorVersion);
+ }
+
+ /**
+ * Return the appropriate DUMMY_HEADER for the minor version
+ */
+ static private byte[] getDummyHeaderForVersion(int minorVersion) {
+ if (minorVersion < MINOR_VERSION_WITH_CHECKSUM) {
+ return DUMMY_HEADER_NO_CHECKSUM;
+ }
+ return DUMMY_HEADER;
+ }
+
+ /**
* Convert the contents of the block header into a human readable string.
* This is mostly helpful for debugging. This assumes that the block
* has minor version > 0.
Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoderImpl.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoderImpl.java?rev=1310932&r1=1310931&r2=1310932&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoderImpl.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoderImpl.java Sun Apr 8 00:41:24 2012
@@ -23,6 +23,7 @@ import java.nio.ByteBuffer;
import org.apache.hadoop.hbase.io.encoding.DataBlockEncoder;
import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;
+import org.apache.hadoop.hbase.io.hfile.HFileBlock;
import org.apache.hadoop.hbase.io.hfile.HFile.FileInfo;
import org.apache.hadoop.hbase.regionserver.StoreFile;
import org.apache.hadoop.hbase.util.Bytes;
@@ -65,19 +66,26 @@ public class HFileDataBlockEncoderImpl i
public static HFileDataBlockEncoder createFromFileInfo(
FileInfo fileInfo, DataBlockEncoding preferredEncodingInCache)
throws IOException {
- byte[] dataBlockEncodingType =
- fileInfo.get(StoreFile.DATA_BLOCK_ENCODING);
- if (dataBlockEncodingType == null) {
+
+ boolean hasPreferredCacheEncoding = preferredEncodingInCache != null
+ && preferredEncodingInCache != DataBlockEncoding.NONE;
+
+ byte[] dataBlockEncodingType = fileInfo.get(StoreFile.DATA_BLOCK_ENCODING);
+ if (dataBlockEncodingType == null && !hasPreferredCacheEncoding) {
return NoOpDataBlockEncoder.INSTANCE;
}
- String dataBlockEncodingStr = Bytes.toString(dataBlockEncodingType);
DataBlockEncoding onDisk;
- try {
- onDisk = DataBlockEncoding.valueOf(dataBlockEncodingStr);
- } catch (IllegalArgumentException ex) {
- throw new IOException("Invalid data block encoding type in file info: " +
- dataBlockEncodingStr, ex);
+ if (dataBlockEncodingType == null) {
+ onDisk = DataBlockEncoding.NONE;
+ }else {
+ String dataBlockEncodingStr = Bytes.toString(dataBlockEncodingType);
+ try {
+ onDisk = DataBlockEncoding.valueOf(dataBlockEncodingStr);
+ } catch (IllegalArgumentException ex) {
+ throw new IOException("Invalid data block encoding type in file info: "
+ + dataBlockEncodingStr, ex);
+ }
}
DataBlockEncoding inCache;
@@ -194,7 +202,7 @@ public class HFileDataBlockEncoderImpl i
DataBlockEncoding algo, boolean includesMemstoreTS) {
ByteBuffer compressedBuffer = encodeBufferToHFileBlockBuffer(
block.getBufferWithoutHeader(), algo, includesMemstoreTS,
- HFileBlock.DUMMY_HEADER);
+ block.getDummyHeaderForVersion());
int sizeWithoutHeader = compressedBuffer.limit() - block.headerSize();
HFileBlock encodedBlock = new HFileBlock(BlockType.ENCODED_DATA,
block.getOnDiskSizeWithoutHeader(),