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

Benedict commented on CASSANDRA-9471:
-------------------------------------

I've pushed a branch [here|https://github.com/belliottsmith/cassandra/tree/9471]

This patch does quite a few things, since I thought we had better get them out 
of the way sooner than later:

# Introduces "indexing" to the BTree class, permitting lookup by positional 
index, and binarySearch semantics (so inequality lookups yield the position a 
binarySearch of the equivalent array would)
#* The size modulo remainder of a Leaf/Branch are flipped, so that a Branch has 
a spare slot at the end for an int[] index:
#** if missing, this occupies at most 1 bit per entry in the set (often 1/32), 
if present, it occupies at most 2.5 bits, and typically around 1 bit. Sets with 
<= 32 items incur no cost.
#* This index just contains the cumulative size of the tree preceding each 
branch key, rooted at the node in question
# Reintroduces BTreeSet, with extra methods for accessing by index\*, and 
simple implementations of missing NavigableMap methods using this new 
functionality
# Introduces a simple BTreeSet.Builder, and replaces all suitable uses of 
TreeMap in the codebase with a BTreeSet.Builder -> BTreeSet
# Rewrites btree.Cursor to make it far easier to understand, and to introduced 
IndexedSearchIterator, exposing the new indexing
# Reintroduces LongBTreeTest, with cleaned up more exhaustive coverage of 
iterator functionality, and new NavigableMap methods

It's more code than I expected, as I didn't plan on rewriting btree.Cursor, but 
it was frankly a bit of a mess. 8099 also extends it to cover descending 
ranges, but with no test coverage, and nor did I want to reason about (my own!) 
code when inverted in this way to corroborate its behaviour. The new 
implementation is far more declarative, and I hope should be easy for just 
about anybody to read and review, and crucially to extend/modify in future.

The Cursor rewrite was also sparked by the introduction of 
IndexedSearchIterator, which was designed to drop into 
SimpleRowDataBlock.CellWriter. Unfortunately, the comments here _suggesting_ 
columns would be provided in-order was optimistic. It seems that the call-sites 
would need to at least specify if this is the case. This means that the Cursor 
rewrite is not helpful for this _yet_, but hopefully will be soon, and I think 
it was warranted by our dependence on new functionality and by its existing 
ugliness.

It is possible we could split this ticket into (1, 5.1); (2, 5.2); 3; (4, 5.3), 
but this all seemed naturally grouped together, and given it's a follow on to 
8099...

I was hoping [~blambov] could review the changes to BTree, BTreeSet and Cursor 
in particular? If [~slebresne] or [~blerer] could review the more modest places 
it touches the 8099 code that would be great.

\*A simple follow up to this ticket would be to make BTreeSet implement both 
{{Set}} _and_ {{List}}

> Columns should be backed by a BTree, not an array
> -------------------------------------------------
>
>                 Key: CASSANDRA-9471
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-9471
>             Project: Cassandra
>          Issue Type: Improvement
>          Components: Core
>            Reporter: Benedict
>            Assignee: Benedict
>             Fix For: 3.0 beta 1
>
>
> Follow up to 8099. 
> We have pretty terrible lookup performance as the number of columns grows 
> (linear). In at least one location, this results in quadratic performance. 
> We don't however want this structure to be either any more expensive to 
> build, nor to store. Some small modifications to BTree will permit it to 
> serve here, by permitting efficient lookup by index, and calculation _of_ 
> index for a given key.



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

Reply via email to