[
https://issues.apache.org/jira/browse/CASSANDRA-8206?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Tyler Hobbs updated CASSANDRA-8206:
-----------------------------------
Attachment: 8206-WIP.txt
So, the root of the issue is that {{CompositesIndexOnClusteringKey}} returns
{{true}} for any column name in {{indexes()}}. Any time an individual column
is deleted, {{delete()}} gets called and the index entry for the whole row is
deleted.
I've attached a WIP patch that overrides {{delete()}} in
{{CompositesIndexOnClusteringKey}} to make it do nothing, since the row should
only be removed from the index when the full row is deleted. However, I'm not
at all familiar with the other ways that the secondary index is updated, so I
believe there's more work to be done (or maybe a better approach).
Additionally, we definitely need some test coverage around deletions for
secondary indexes on partition keys and clustering keys. There are a couple of
dtests that could be expanded (clustering_index_test,
edge_2i_on_complex_pk_test).
[~slebresne] or [~beobal], would one of you two like to take over this ticket?
> Deleting columns breaks secondary index on clustering column
> ------------------------------------------------------------
>
> Key: CASSANDRA-8206
> URL: https://issues.apache.org/jira/browse/CASSANDRA-8206
> Project: Cassandra
> Issue Type: Bug
> Components: Core
> Reporter: Tuukka Mustonen
> Assignee: Tyler Hobbs
> Priority: Critical
> Fix For: 2.0.12, 2.1.2
>
> Attachments: 8206-WIP.txt
>
>
> Removing items from a set breaks index for field {{id}}:
> {noformat}
> cqlsh:cs> CREATE TABLE buckets (
> ... tenant int,
> ... id int,
> ... items set<text>,
> ... PRIMARY KEY (tenant, id)
> ... );
> cqlsh:cs> CREATE INDEX buckets_ids ON buckets(id);
> cqlsh:cs> INSERT INTO buckets (tenant, id, items) VALUES (1, 1, {'foo',
> 'bar'});
> cqlsh:cs> SELECT * FROM buckets;
> tenant | id | items
> --------+----+----------------
> 1 | 1 | {'bar', 'foo'}
> (1 rows)
> cqlsh:cs> SELECT * FROM buckets WHERE id = 1;
> tenant | id | items
> --------+----+----------------
> 1 | 1 | {'bar', 'foo'}
> (1 rows)
> cqlsh:cs> UPDATE buckets SET items=items-{'foo'} WHERE tenant=1 AND id=1;
> cqlsh:cs> SELECT * FROM buckets;
> tenant | id | items
> --------+----+---------
> 1 | 1 | {'bar'}
> (1 rows)
> cqlsh:cs> SELECT * FROM buckets WHERE id = 1;
> (0 rows)
> {noformat}
> Re-building the index fixes the issue:
> {noformat}
> cqlsh:cs> DROP INDEX buckets_ids;
> cqlsh:cs> CREATE INDEX buckets_ids ON buckets(id);
> cqlsh:cs> SELECT * FROM buckets WHERE id = 1;
> tenant | id | items
> --------+----+---------
> 1 | 1 | {'bar'}
> (1 rows)
> {noformat}
> Adding items does not cause similar failure, only delete. Also didn't test if
> other collections are also affected(?)
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)