[ 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)