diff --git src/main/java/org/apache/hadoop/hbase/io/hfile/HFileBlock.java src/main/java/org/apache/hadoop/hbase/io/hfile/HFileBlock.java index 151e189..45fe488 100644 --- src/main/java/org/apache/hadoop/hbase/io/hfile/HFileBlock.java +++ src/main/java/org/apache/hadoop/hbase/io/hfile/HFileBlock.java @@ -1911,6 +1911,23 @@ public class HFileBlock extends SchemaConfigured implements Cacheable { } /** + * 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. diff --git src/main/java/org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoderImpl.java src/main/java/org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoderImpl.java index f86d5a1..9d0f66e 100644 --- src/main/java/org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoderImpl.java +++ src/main/java/org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoderImpl.java @@ -71,7 +71,7 @@ public class HFileDataBlockEncoderImpl implements HFileDataBlockEncoder { */ public HFileDataBlockEncoderImpl(DataBlockEncoding onDisk, DataBlockEncoding inCache, byte[] dummyHeader) { - dummyHeader = dummyHeader == null ? HFileBlock.DUMMY_HEADER : dummyHeader; + dummyHeader = dummyHeader == null? block.getDummyHeaderForVersion(): dummyHeader; this.onDisk = onDisk != null ? onDisk : DataBlockEncoding.NONE; this.inCache = inCache != null ? @@ -96,19 +96,26 @@ public class HFileDataBlockEncoderImpl implements HFileDataBlockEncoder { 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;