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

Piotr Jastrzebski commented on CASSANDRA-9991:
----------------------------------------------

Hi Branimir,

Thanks for the review.

I wasn't sure how important the performance is in this case. I somehow assumed 
it's quite important. I was definitely trying to avoid array copying but I 
wasn't sure how expensive is Comparator.compare on the keys. I can imagine keys 
with very expensive comparison.

If we don't mind some unnecessary compare calls then remove() can be reduced to:

public static <V> Object[] remove(final Object[] btree, final Comparator<? 
super V> comparator, V elem)
    {
        if (BTree.isEmpty(btree))
            return btree;
        final Object[] node = BTree.findNode(btree, comparator, elem);
        if (node == null)
            return btree;
        if (BTree.size(btree) == 1)
            return BTree.empty();
        V valueToSwap = null;
        if (!BTree.isLeaf(node))
        {
            valueToSwap = elem;
            elem = BTree.lower(btree, comparator, elem);
        }
        Object[] result = removeFromLeaf(btree, comparator, elem);
        if (valueToSwap != null)
        {
            // we can modify result because the node containing elem is a copy
            swap(result, comparator, valueToSwap, elem);
        }
        return result;
    }

I tried different approaches and this was the cleanest. Bottom up was messier 
but a recursive top down solution will probably be cleaner. Looking at 
BTree.java I assumed recursion is not welcome since it has some performance 
penalty.

If you don't mind I would like to leave the checks around System.arraycopy - it 
does JNI call which is much more expensive than a simple check and they are 
well encapsulated in copyKeys/Children anyway.

I added the check to isWellFormed.

Two parameters in copyBranchWithKeyAndChildRemove were useful in different 
versions I had. Now I changed it to copyWithKeyAndChildRemoved and used in 
rotateLeft/Right.

Calculation of newNextNode size was meant to be '((nextKeyEnd & 1) == 1 ? 2 : 
1)'  thanks for catching this. Fixed.

I reordered cases in removeFromLeaf.

I introduced copyWithKeyAndChildInserted.

About the random test - I don't think it's a good idea to create a random unit 
tests. The fundamental attribute of unit test is its repeatability. Is there 
any convention in Cassandra how to create a randomized fuzzy tests?

Please have another look.

> Implement efficient btree removal
> ---------------------------------
>
>                 Key: CASSANDRA-9991
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-9991
>             Project: Cassandra
>          Issue Type: Sub-task
>            Reporter: Benedict
>              Labels: patch
>             Fix For: 3.x
>
>         Attachments: trunk-9991.txt
>
>
> Currently removal is implemented as a reconstruction by filtering and 
> iterator over the original btree. This could be much more efficient, editing 
> just the necessary nodes. 



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

Reply via email to