[
https://issues.apache.org/jira/browse/CASSANDRA-8099?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14601530#comment-14601530
]
Branimir Lambov commented on CASSANDRA-8099:
--------------------------------------------
Continuing my review with the {{db.filter}} package, apart from
{{ColumnFilter.Expression.Serializer.serializedSize}} which appears to be
missing a byte when the messaging version is 3.0, I see no correctness problems
with the code. More unit testing would definitely help, though. Below are some
suggestions that should not be treated as blocking commit.
{{PartitionFilter}}:
* The name implies it is something that filters partitions, in fact it applies
to rows within partition. I'd rename this to {{RowFilter}} or, if there's a
reason to keep partition in its name, {{PartitionContentFilter}}.
* {{forPaging}} javadoc is contradictory-- on one hand strictly after, on the
other could be inclusive. Please clarify.
* {{filter(UnfilteredRowIterator)}} is risky, people will call the wrong filter
overload by mistake. Rename?
* {{filter(SliceableUnfilteredRowIterator)}} does not seem to apply
{{queriedColumns}} in either {{NamesPartitionFilter}} or
{{SlicePartitionFilter}}. Is this on purpose? If it is, the method above is not
its counterpart. Please document.
{{NamesPartitionFilter}}:
* {{clusterings}} should be {{NavigableSet}} to enable reverse traversal
without duplication ({{TreeSet}} implements that too). This simplifies other
code in file.
* {{toString}} misses a closing bracket.
{{SliceableUnfilteredRowIterator}}:
* JavaDoc: what is 'seekTo'? 'slice'?
{{ColumnSubselection}}:
* ELT_SELECTION is not easily decipherable. Why not just ELEMENT instead? And
'element' elsewhere? (elt also)
{{ColumnSelection}}:
* {{includes/newTester}}: It appears these should only be called if the columns
filter is already applied. This is not obvious; I'd state it in JavaDoc and/or
assert that {{columns.contains(cell.column())}}.
{{DataLimits}}:
* {{DISTINCT_NONE}} is not the same as {{CQLLimits.distinct(MAX_VALUE)}}. Would
you add a comment to say why it is so?
* {{countCells}} should be {{countsCells}}.
* {{CQLLimits.isDistinct}} does not appear to be used for anything.
Throughout, there are lots of easy-to-fix (just add <?>) raw type warnings. I
would also use a virtual method instead of an instance field for {{kind}}
everywhere, as done in {{ColumnSubselection}}.
[Here|https://github.com/pcmanus/cassandra/compare/8099...blambov:8099-db-filter-suggestions]
I've uploaded a branch that includes fixes to a few of the above.
> Refactor and modernize the storage engine
> -----------------------------------------
>
> Key: CASSANDRA-8099
> URL: https://issues.apache.org/jira/browse/CASSANDRA-8099
> Project: Cassandra
> Issue Type: Improvement
> Reporter: Sylvain Lebresne
> Assignee: Sylvain Lebresne
> Fix For: 3.0 beta 1
>
> Attachments: 8099-nit
>
>
> The current storage engine (which for this ticket I'll loosely define as "the
> code implementing the read/write path") is suffering from old age. One of the
> main problem is that the only structure it deals with is the cell, which
> completely ignores the more high level CQL structure that groups cell into
> (CQL) rows.
> This leads to many inefficiencies, like the fact that during a reads we have
> to group cells multiple times (to count on replica, then to count on the
> coordinator, then to produce the CQL resultset) because we forget about the
> grouping right away each time (so lots of useless cell names comparisons in
> particular). But outside inefficiencies, having to manually recreate the CQL
> structure every time we need it for something is hindering new features and
> makes the code more complex that it should be.
> Said storage engine also has tons of technical debt. To pick an example, the
> fact that during range queries we update {{SliceQueryFilter.count}} is pretty
> hacky and error prone. Or the overly complex ways {{AbstractQueryPager}} has
> to go into to simply "remove the last query result".
> So I want to bite the bullet and modernize this storage engine. I propose to
> do 2 main things:
> # Make the storage engine more aware of the CQL structure. In practice,
> instead of having partitions be a simple iterable map of cells, it should be
> an iterable list of row (each being itself composed of per-column cells,
> though obviously not exactly the same kind of cell we have today).
> # Make the engine more iterative. What I mean here is that in the read path,
> we end up reading all cells in memory (we put them in a ColumnFamily object),
> but there is really no reason to. If instead we were working with iterators
> all the way through, we could get to a point where we're basically
> transferring data from disk to the network, and we should be able to reduce
> GC substantially.
> Please note that such refactor should provide some performance improvements
> right off the bat but it's not it's primary goal either. It's primary goal is
> to simplify the storage engine and adds abstraction that are better suited to
> further optimizations.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)