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

Alex Petrov commented on CASSANDRA-12373:
-----------------------------------------

bq. In the ctor, for isDense, we seem to force re-computation for non-SC 
non-dense tables (which happens to include non-compact tables).

Corrected it. This didn't cause any trouble (because was checking for an empty 
name, too), but now we'll recompute only for the supercolumn ones, which is 
much better.

bq. But for I'm also not 100% sure this work in all upgrade scenario.

Thing is the re-computation is necessary only for the upgrade from 2.x -> 
current 3.x -> 3.x + this patch, in which case we have two clustering columns 
instead of one just a single "empty" value column, which is a collection. 
3.x-created supercolumns are calculated correctly 
[here|https://github.com/apache/cassandra/blob/cassandra-3.0/src/java/org/apache/cassandra/thrift/ThriftConversion.java#L184].

You are right that some testing in that regard won't hurt, so I've added some 
3-step upgrade tests with the scenarios similar to the current one. For the 
sakes of completeness, I've also added a test for current 3.x -created 
supercolumn families. 

bq. Unfortunately, while we were supposed to have a SC upgrade dtests

I've added some dtests as well as upgrade tests.

bq. I'm not entirely sure if/how column renaming works for the SC key and value 
"fake" column

You're right: I did leave it off as I thought read/write path is the only 
support that's required for migrating off SCF, but adding this is trivial. I've 
added tests for all sorts of renames. However, there is no special-casing done 
in {{AlterStatement}}: {{getColumnDefinition}} would return the "fake" columns 
as well. {{removeColumn}} would be a no-op in case of fake columns and adding 
column would force re-initialisation and the new column would get picked up 
correctly.

bq. In UpdateParameters#addCounter, not sure the change from 
CounterContext#createUpdate to CounterContext#createLocal is corret.

Yes, sorry, I have overlooked it. 

bq. In getSuperCfKeyColumn, not sure what "3.x-created supercolumn family" 
refers to (is that SC tables created from thrift in 3.x? or SC tables whose 
schema had been upgraded by a previous 3.x version?) and more importantly, why 
it would differ in number of clustering columns?

You are right, SC columns created from Thrift in 3.x. When upgrading from 2.x, 
you'll get {{column1}} and {{column2}} as clustering keys (which they kind of 
are). When created via thrift in 3.x, {{column2}} is entirely virtual (which it 
kind of is). 

bq. There is a typo in a comment, where in "... can't be change to support 
inclusive slice ...", I believe you want "exclusive".

Fixed.

bq. in the 2nd branch (else if ...), we should use result.add(cell) directly. 
Not only does that already handle counters, but more importantly, if we don't 
do that, things like ttl(v) will not work on the compact column value.

Good point. Fixed.

bq. the last else is confusing: by definition we shouldn't be exposing any 
other column than the "compact value" column, so that branch should probably 
not be there (or be an assertion that we shouldn't get there).

You're right. This is an artefact of the previous incorrect dense table 
handling.

bq. In the updates loop in prepareUpdateOperations, not sure why the 2 first 
cases seem to assume that cfm.isSuperColumnValueColumn(def), but the 3rd case 
tests it explicitely (but after having assigned superColumnValue). In general, 
not sure why the 3rd case looks different from the other 2. Also, I find it a 
bit hard to follow the mix of if using continue and sometime using else, 
sometimes not. I'm personally prefer using else when needed and remove all the 
continue. Lastly, seems the method could use a check for superColumnKey != null.

I've refactored this method even further. There were many things that were 
technically correct, but were added on earlier stages, so got there 
historically. Also, did a bit of further improvements with 
{{collectMarkerSpecifications}}

bq. In prepareInsertForJSONOperations, I believe the 2nd call to 
getRawTermForColumn is unecessary, you can use the raw for before the if. 
Further, the overall code of this method feels very similar to the one in 
prepareInsertOperations: can we extract the bulk of what's common? (the loop 
seems to be operating on a ColumnDefinition and the associated value, so either 
pass an Iterable<Pair<...>>, or build 2 lists; I don't think we care about the 
performance difference here).

Refactored this part as well.

bq. In prepareDeleteOperations, need to fix the "Maybe not single only" 
comment. 

I think what was meant was "not only {{SingleColumnRelation}}", but this is not 
true: multi column operations are not allowed. After writing more tests, I did 
discover that multi-column restrictions were not working properly, so I have 
added support for them. Also, for IN queries.

bq. n rebuildLWTConditions, I'd invert the initial if check (making it, imo, 
easier to read) with a direct return and "de-indent" the bulk of the method. 
Also, I'd remove the columnConditions.clear(): doesn't feel useful, and feels 
weird to do it here (what if we make that collection immutable in future?).

Good point, fixed

bq. In isSuperColumnMapColumn, can replace the first condition by 
ColumnDefinition#isRegular (not something due to this patch, but a good 
occasion to simplify).

Fixed 

bq. In SelectStatement, I believe that if you move the 
SuperColumnCompatibility#processPartition call at the beginning of 
SelectStatement#processPartition, you'd be able to remove the specific call in 
ModificationStatement#buildCasFailureResultSet (and generally reduce the 
changes of misuses).

Fixed

bq. for 'if-then-else', we never use brakets for one of the branch and not 
another (meaning that we only skip brackets if all of the branches are 
one-liner). 

I hope I've fixed all the instances.

bq. Slightly bummed by the addition of the SC special fields in 
StatementRestrictions. Can't we move most of this in 
SuperColumnCompatibility#getColumnFilter, by extracting things there (tbc, I'm 
genuninely not sure how easy change that is, and if it's too convoluted, I'm 
fine leaving things as they are; I just prefer having a much special casing in 
SuperColumnCompatibility as possible. I also assume we can't entirely remove 
all special casing from StatementRestrictions since we will at least make sure 
it doesn't complain about requiring ALLOW FILTERING if we leave the 
"superColumnKeyColumn" restriciton in)?

I agree this did not look pretty. At the time of writing that felt like it made 
sense. But after the current refactoring, I had to switch most of the things to 
restrictions anyways, and there are now more different special cases, so I have 
opted out for a class that would hold all the restriction special-cases. I've 
added a lot of documentation inline, hope this should suffice. 

bq. In ModificationStatement why not directly use cfm.superCfValueColumn 
instead of looping over cfm.allColumnsInSeelectOrder() to find it?

Good point, simplified that one, too.


A word on the latest changes in the patch: because we have to support _all_ 
{{ALTER}} statements that are supported by 2.x, we got a bit more logic in 
{{getSuper(CfKey|Value)Column}} now. Also, rebuild was changed in order to 
avoid accidentally dropping the fake columns, since we have to make sure they 
do get persisted. In order to properly interface 2.x nodes, there are several 
special-cases in {{CFMetadata}} to make sure we compose {{Selection}} 
correctly. Another big change is the way {{WHERE}} clauses are handled, pretty 
much everywhere. Biggest reason for it is that previous way (having public 
variables in {{StatementRestrictions}} was too ad-hoc and many use-cases were 
missing. Now we can correctly remap multi-column restrictions on SC key (both 
EQ and slice), slice (and EQ) restrictions on the SC key and IN restriction. 
All of them are handled somewhat differently and some require filtering on the 
very last stage. Where possible I've tried to use collection bounds. 

> 3.0 breaks CQL compatibility with super columns families
> --------------------------------------------------------
>
>                 Key: CASSANDRA-12373
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-12373
>             Project: Cassandra
>          Issue Type: Bug
>          Components: CQL
>            Reporter: Sylvain Lebresne
>            Assignee: Alex Petrov
>             Fix For: 3.0.x, 3.11.x
>
>
> This is a follow-up to CASSANDRA-12335 to fix the CQL side of super column 
> compatibility.
> The details and a proposed solution can be found in the comments of 
> CASSANDRA-12335 but the crux of the issue is that super column famillies show 
> up differently in CQL in 3.0.x/3.x compared to 2.x, hence breaking backward 
> compatibilty.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to