[ 
https://issues.apache.org/jira/browse/HBASE-6200?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Jieshan Bean updated HBASE-6200:
--------------------------------

    Attachment: 6200-trunk-v3.patch

I tried my best to decrease the calculate times in this version of patch. And I 
changed the test case to test comparison directly(Do 1,000,000 compares each 
time). 
With the same steps:
1. Test comparing between 'famia:qualia' with 'famib:qualia'. Run for 1000000 
times. Calculate the time consumed(Using System.currentTimeMillis() to get 
current time).
2. Test comparing between 'fami:qualia' with 'fami:qualib'. Run for 1,000,000 
times. Calculate the time consumed.
3. Repeats 1~2 for 20 times. Accumulate the total consumed time at step 1 and 
step 2, and then calculate for the average time.

Test code:
{noformat}
   for (int loop = 0; loop < 20; loop++) {
      long start = System.currentTimeMillis();
      for (int i = 0; i < 1000000; i++) {
        compareIgnoringPrefix(c, 0, kvf_a, kvf_b);
      }
      long end = System.currentTimeMillis();
      long useTimeA = end - start;
      start = end;
      for (int i = 0; i < 1000000; i++) {
        compareIgnoringPrefix(c, 0, kvq_a, kvq_b);
      }
      end = System.currentTimeMillis();
      long useTimeB = end - start;
      totalTimeA += useTimeA;
      totalTimeB += useTimeB;
   }
 private void compareIgnoringPrefix(KeyValue.KeyComparator c, int common, 
KeyValue less,
      KeyValue greater) {
    int cmp = c.compareIgnoringPrefix(common, less.getBuffer(), less.getOffset()
        + KeyValue.ROW_OFFSET, less.getKeyLength(), greater.getBuffer(),
        greater.getOffset() + KeyValue.ROW_OFFSET, greater.getKeyLength());
  }     
{noformat}
And this is the new result:     
[without patch 6200]
{noformat}
Compare {famia:qualia} with {famib:qualia}, run for 1,000,000 times. used time 
-> 50
Compare {fami:qualia} with {fami:qualib}, run for 1,000,000 times. used time -> 
58
{noformat}
[with patch 6200]
{noformat}
Compare {famia:qualia} with {famib:qualia}, run for 1,000,000 times.  used time 
-> 56
Compare {fami:qualia} with {fami:qualib}, run for 1,000,000 times.  used time 
-> 64
{noformat}

                
> KeyComparator.compareWithoutRow can be wrong when families have the same 
> prefix
> -------------------------------------------------------------------------------
>
>                 Key: HBASE-6200
>                 URL: https://issues.apache.org/jira/browse/HBASE-6200
>             Project: HBase
>          Issue Type: Bug
>    Affects Versions: 0.90.6, 0.92.1, 0.94.0
>            Reporter: Jean-Daniel Cryans
>            Assignee: Jieshan Bean
>            Priority: Blocker
>             Fix For: 0.90.7, 0.92.2, 0.96.0, 0.94.1
>
>         Attachments: 6200-trunk-v2.patch, 6200-trunk-v3.patch, 
> HBASE-6200-90-v2.patch, HBASE-6200-92-v2.patch, HBASE-6200-94-v2.patch
>
>
> As reported by Desert Rose on IRC and on the ML, {{Result}} has a weird 
> behavior when some families share the same prefix. He posted a link to his 
> code to show how it fails, http://pastebin.com/7TBA1XGh
> Basically {{KeyComparator.compareWithoutRow}} doesn't differentiate families 
> and qualifiers so "f:a" is said to be bigger than "f1:", which is false. Then 
> what happens is that the KVs are returned in the right order from the RS but 
> then doing {{Result.binarySearch}} it uses 
> {{KeyComparator.compareWithoutRow}} which has a different sorting so the end 
> result is undetermined.
> I added some debug and I can see that the data is returned in the right order 
> but {{Arrays.binarySearch}} returned the wrong KV, which is then verified 
> agains the passed family and qualifier which fails so null is returned.
> I don't know how frequent it is for users to have families with the same 
> prefix, but those that do have that and that use those families at the same 
> time will have big correctness issues. This is why I mark this as a blocker.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira


Reply via email to