[ 
https://issues.apache.org/jira/browse/HBASE-12270?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14259128#comment-14259128
 ] 

Liu Shaohui commented on HBASE-12270:
-------------------------------------

[~kdiaa] [~ram_krish]
The problem is the wrong checksum header of hfile block when writing block to 
bucket cache on wrtiing
See: HFileBlock.java#1161
{code}
    /**
     * Creates a new HFileBlock. Checksums have already been validated, so
     * the byte buffer passed into the constructor of this newly created
     * block does not have checksum data even though the header minor
     * version is MINOR_VERSION_WITH_CHECKSUM. This is indicated by setting a
     * 0 value in bytesPerChecksum.
     */
    public HFileBlock getBlockForCaching(CacheConfig cacheConf) {
      HFileContext newContext = new HFileContextBuilder()
                                .withBlockSize(fileContext.getBlocksize())
                                .withBytesPerCheckSum(0)
                                .withChecksumType(ChecksumType.NULL) // no 
checksums in cached data
                                .withCompression(fileContext.getCompression())
                                
.withDataBlockEncoding(fileContext.getDataBlockEncoding())
                                
.withHBaseCheckSum(fileContext.isUseHBaseChecksum())
                                .withCompressTags(fileContext.isCompressTags())
                                .withIncludesMvcc(fileContext.isIncludesMvcc())
                                .withIncludesTags(fileContext.isIncludesTags())
                                .build();
      return new HFileBlock(blockType, getOnDiskSizeWithoutHeader(),
          getUncompressedSizeWithoutHeader(), prevOffset,
          cacheConf.shouldCacheCompressed(blockType.getCategory()) ?
            getOnDiskBufferWithHeader() :                    <----------------
            getUncompressedBufferWithHeader(),
          DONT_FILL_HEADER, startOffset,
          onDiskBytesWithHeader.length + onDiskChecksum.length, newContext);
    }
{code}

The OnDiskBufferWithHeader or UncompressedBufferWithHeader has a checksum 
header that the checksum type is CRC32 and BytesPerCheckSum is 16k for writing 
block to disk.
Actually there is no checksum bytes in this buffer. The checksum bytes is 
appended to output stream in HFileBlock.java#finishBlockAndWriteHeaderAndData.

So when we deserialized the block from bucket cache, there is a checksum 
header, but there is no checksum bytes in buffer, so we got wrong buffer limit.

Simple solution to fix this bug is rewriting the header when caching block on 
writing.
Suggestions are welcomed, thx~



> A bug in the bucket cache, with cache blocks on write enabled
> -------------------------------------------------------------
>
>                 Key: HBASE-12270
>                 URL: https://issues.apache.org/jira/browse/HBASE-12270
>             Project: HBase
>          Issue Type: Bug
>    Affects Versions: 0.98.6.1
>         Environment: I can reproduce it on a simple 2 node cluster, one 
> running the master and another running a RS. I was testing on ec2.
> I used the following configurations for the cluster. 
> hbase-env:HBASE_REGIONSERVER_OPTS=-Xmx2G -XX:MaxDirectMemorySize=5G 
> -XX:CMSInitiatingOccupancyFraction=88 -XX:+AggressiveOpts -verbose:gc 
> -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xlog 
> gc:/tmp/hbase-regionserver-gc.log
> hbase-site:
> hbase.bucketcache.ioengine=offheap
> hbase.bucketcache.size=4196
> hbase.rs.cacheblocksonwrite=true
> hfile.block.index.cacheonwrite=true
> hfile.block.bloom.cacheonwrite=true
>            Reporter: Khaled Elmeleegy
>            Assignee: Liu Shaohui
>            Priority: Critical
>         Attachments: TestHBase.java, TestKey.java
>
>
> In my experiments, I have writers streaming their output to HBase. The reader 
> powers a web page and does this scatter/gather, where it reads 1000 keys 
> written last and passes them the the front end. With this workload, I get the 
> exception below at the region server. Again, I am using HBAse (0.98.6.1). Any 
> help is appreciated.
> 2014-10-10 15:06:44,173 ERROR 
> [B.DefaultRpcServer.handler=62,queue=2,port=60020] ipc.RpcServer: Unexpected 
> throwable object 
> java.lang.IllegalArgumentException
>   at java.nio.Buffer.position(Buffer.java:236)
>  at 
> org.apache.hadoop.hbase.util.ByteBufferUtils.skip(ByteBufferUtils.java:434)
>       at 
> org.apache.hadoop.hbase.io.hfile.HFileReaderV2$ScannerV2.readKeyValueLen(HFileReaderV2.java:849)
>       at 
> org.apache.hadoop.hbase.io.hfile.HFileReaderV2$ScannerV2.next(HFileReaderV2.java:760)
>  at 
> org.apache.hadoop.hbase.regionserver.StoreFileScanner.seekAtOrAfter(StoreFileScanner.java:248)
>    at 
> org.apache.hadoop.hbase.regionserver.StoreFileScanner.seek(StoreFileScanner.java:152)
>       at 
> org.apache.hadoop.hbase.regionserver.StoreScanner.seekScanners(StoreScanner.java:317)
>  at 
> org.apache.hadoop.hbase.regionserver.StoreScanner.<init>(StoreScanner.java:176)
>   at org.apache.hadoop.hbase.regionserver.HStore.getScanner(HStore.java:1780)
>   at 
> org.apache.hadoop.hbase.regionserver.HRegion$RegionScannerImpl.<init>(HRegion.java:3758)
>   at 
> org.apache.hadoop.hbase.regionserver.HRegion.instantiateRegionScanner(HRegion.java:1950)
>   at 
> org.apache.hadoop.hbase.regionserver.HRegion.getScanner(HRegion.java:1936)
>         at 
> org.apache.hadoop.hbase.regionserver.HRegion.getScanner(HRegion.java:1913)
>       at 
> org.apache.hadoop.hbase.regionserver.HRegionServer.scan(HRegionServer.java:3157)
>       at 
> org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:29587)
>    at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2027)
>     at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:108)
>      at 
> org.apache.hadoop.hbase.ipc.RpcExecutor.consumerLoop(RpcExecutor.java:114)
>    at org.apache.hadoop.hbase.ipc.RpcExecutor$1.run(RpcExecutor.java:94)
>  at java.lang.Thread.run(Thread.java:744)



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to