[
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