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