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

Andres de la Peña commented on CASSANDRA-18939:
-----------------------------------------------

The last changes look to me. Do we have CI results for them?

As for the SASI/SAI index selection, I think it makes sense to prioritize SAI 
over SASI. It be done by making {{SASIIndex#getEstimatedResultRows()}} return 
{{Long.MIN_VALUE + 1}}, although we might just check the index class or have a 
separate method giving the priority of the implementation in case of having an 
identical number of estimated rows, which might be a bit less hacky. In any 
case, I think that should be done in a separate ticket since it's not related 
to the specific bug that we're fixing here.

I also wondered whether we allow multiple index implementations on the same 
column, even when all implementations should return the same results for the 
same expression. I think the main reason is allowing transitioning from one 
index implementation to another. Is that right? Another more convoluted use 
case might be having separate columns with different index implementations, and 
then other columns that might be queried combined with either of those 
single-indexed columns.


> Creating a SASI index after creating an SAI index breaks secondary index 
> queries
> --------------------------------------------------------------------------------
>
>                 Key: CASSANDRA-18939
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-18939
>             Project: Cassandra
>          Issue Type: Bug
>          Components: Feature/2i Index
>            Reporter: Jon Haddad
>            Assignee: Stefan Miklosovic
>            Priority: Normal
>             Fix For: 5.0-rc, 5.x
>
>          Time Spent: 1h
>  Remaining Estimate: 0h
>
> In the 5.0 branch, HEAD is e45c1092f91edd63591f562b2120ea6a5fd3edd5, I was 
> able to break secondary indexes by doing the following:
> {code}
> cqlsh -e "create KEYSPACE test WITH replication = {'class': 'SimpleStrategy', 
> 'replication_factor': 1};"
> cqlsh -e "create table test.blah (id int primary key, val text);"
> cqlsh -e "create INDEX on test.blah (val) using 'sai';"
> bin/nodetool flush
> ❯ cqlsh -e "SELECT * from test.blah WHERE val = 'something';"
>  id | val
> ----+-----
> (0 rows)
> cqlsh -e "create custom INDEX on test.blah (val) using 
> 'org.apache.cassandra.index.sasi.SASIIndex';"
> Warnings :
> SASI indexes are experimental and are not recommended for production use.
> cqlsh -e "SELECT * from test.blah WHERE val = 'something';"
> <stdin>:1:ReadFailure: Error from server: code=1300 [Replica(s) failed to 
> execute read] message="Operation failed - received 0 responses and 1 
> failures: UNKNOWN from localhost/127.0.0.1:7000" info={'consistency': 'ONE', 
> 'required_responses': 1, 'received_responses': 0, 'failures': 1, 
> 'error_code_map': {'127.0.0.1': '0x0000'}}
> {code}
> Server throws an exception:
> {code}
> ERROR [ReadStage-2] 2023-10-18 12:09:42,391 JVMStabilityInspector.java:70 - 
> Exception in thread Thread[ReadStage-2,10,SharedPool]
> java.lang.RuntimeException: java.lang.ClassCastException: class 
> org.apache.cassandra.index.sai.StorageAttachedIndex cannot be cast to class 
> org.apache.cassandra.index.sasi.SASIIndex 
> (org.apache.cassandra.index.sai.StorageAttachedIndex and 
> org.apache.cassandra.index.sasi.SASIIndex are in unnamed module of loader 
> 'app')
>       at 
> org.apache.cassandra.service.StorageProxy$DroppableRunnable.run(StorageProxy.java:2585)
>       at 
> org.apache.cassandra.concurrent.ExecutionFailure$2.run(ExecutionFailure.java:163)
>       at org.apache.cassandra.concurrent.SEPWorker.run(SEPWorker.java:143)
>       at 
> io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
>       at java.base/java.lang.Thread.run(Thread.java:829)
> Caused by: java.lang.ClassCastException: class 
> org.apache.cassandra.index.sai.StorageAttachedIndex cannot be cast to class 
> org.apache.cassandra.index.sasi.SASIIndex 
> (org.apache.cassandra.index.sai.StorageAttachedIndex and 
> org.apache.cassandra.index.sasi.SASIIndex are in unnamed module of loader 
> 'app')
>       at 
> org.apache.cassandra.index.sasi.plan.QueryController.getIndex(QueryController.java:96)
>       at 
> org.apache.cassandra.index.sasi.plan.Operation.analyzeGroup(Operation.java:282)
>       at 
> org.apache.cassandra.index.sasi.plan.Operation$Builder.complete(Operation.java:433)
>       at 
> org.apache.cassandra.index.sasi.plan.SASIIndexSearcher.analyze(SASIIndexSearcher.java:65)
>       at 
> org.apache.cassandra.index.sasi.plan.SASIIndexSearcher.search(SASIIndexSearcher.java:77)
>       at 
> org.apache.cassandra.db.ReadCommand.executeLocally(ReadCommand.java:425)
>       at 
> org.apache.cassandra.service.StorageProxy$LocalReadRunnable.runMayThrow(StorageProxy.java:2184)
>       at org.apache.cassandra.service
> {code}
> Dropping the SASI index restores correct behavior.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org
For additional commands, e-mail: commits-h...@cassandra.apache.org

Reply via email to