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

rajeshbabu commented on HBASE-12583:
------------------------------------

[~stack]
bq. This is for the secondary index with the companion regions?
Yes [~stack]. It's for region level secondary indexing.
bq.  we cannot support custom half-store readers and the writing of reference 
files outside of a region's key range.
The split row definitely in the region's key range but may not in the storefile 
key range. Earlier we were creating reference files even the split row out side 
the storefile range but as part of some performance improvement added the check 
to skip if it's outside.
The custom half-store reader is extends StoreFile.reader and as Ram told we are 
creating it in coprocessor hooks. 
bq. Can this be done at a higher level, at the CP level?
not able to do this through coprocessors.

Thanks.

> Allow creating reference files even the split row not lies in the storefile 
> range if required
> ---------------------------------------------------------------------------------------------
>
>                 Key: HBASE-12583
>                 URL: https://issues.apache.org/jira/browse/HBASE-12583
>             Project: HBase
>          Issue Type: Improvement
>            Reporter: rajeshbabu
>            Assignee: rajeshbabu
>              Labels: Phoenix
>             Fix For: 2.0.0, 0.98.9, 0.99.2
>
>
> Currently in HRegionFileSystem#splitStoreFile we are not creating reference 
> files if the split row not lies in the storefile range that means one of the 
> child region doesn't have any data.
> {code}
>    // Check whether the split row lies in the range of the store file
>     // If it is outside the range, return directly.
>     if (top) {
>       //check if larger than last key.
>       KeyValue splitKey = KeyValueUtil.createFirstOnRow(splitRow);
>       byte[] lastKey = f.createReader().getLastKey();
>       // If lastKey is null means storefile is empty.
>       if (lastKey == null) return null;
>       if (f.getReader().getComparator().compareFlatKey(splitKey.getBuffer(),
>           splitKey.getKeyOffset(), splitKey.getKeyLength(), lastKey, 0, 
> lastKey.length) > 0) {
>         return null;
>       }
>     } else {
>       //check if smaller than first key
>       KeyValue splitKey = KeyValueUtil.createLastOnRow(splitRow);
>       byte[] firstKey = f.createReader().getFirstKey();
>       // If firstKey is null means storefile is empty.
>       if (firstKey == null) return null;
>       if (f.getReader().getComparator().compareFlatKey(splitKey.getBuffer(),
>           splitKey.getKeyOffset(), splitKey.getKeyLength(), firstKey, 0, 
> firstKey.length) < 0) {
>         return null;
>       }
>     }
> {code}
> In some cases when split row should be compared with part of rowkey(in 
> composite rowkey) mainly for secondary index tables we need to create 
> reference files even when split row not lies in the storefile range so that 
> they can be rewritten to it's child regions by some custom half store file 
> reader which compare the part of row key with split row.
> The check of comparing split row with storefile range and returning directly 
> can be avoided by having special boolean attribute in table descriptor when 
> it set to true. Or else we can have coprocessor hooks so that in the hooks we 
> can create the references and bypass.



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

Reply via email to