I recall someone doing some work in Astyanax and I don't know if it made it back in where astyanax would retry at a lower CL level when 2 nodes were down so things could continue to work which was a VERY VERY cool feature. You may want to look into that….I know at some point, I plan to.
Later, Dean From: Edward Capriolo <edlinuxg...@gmail.com<mailto:edlinuxg...@gmail.com>> Reply-To: "user@cassandra.apache.org<mailto:user@cassandra.apache.org>" <user@cassandra.apache.org<mailto:user@cassandra.apache.org>> Date: Wednesday, January 30, 2013 7:31 AM To: "user@cassandra.apache.org<mailto:user@cassandra.apache.org>" <user@cassandra.apache.org<mailto:user@cassandra.apache.org>> Subject: Re: Node selection when both partition key and secondary index field constrained? Any query is going to fail quorum + rf3 + 2 nodes down. One thing about 2x indexes (both user defined and built in) is that finding an answer using them requires more nodes to be up then just a single get or slice. On Monday, January 28, 2013, Mike Sample <mike.sam...@gmail.com<mailto:mike.sam...@gmail.com>> wrote: > Thanks Aaron. So basically it's merging the results 2 separate queries: > Indexed scan (token-range) intersect foo.flag_index=true where the latter > query hits the entire cluster as per the secondary index FAQ entry. Thus > the overall query would fail if LOCAL_QUORUM was requested, RF=3 and 2 nodes > in a given replication group were down. Darn. Is there any way of > efficiently getting around this (ie scope the query to just the nodes in the > token range)? > > > > > On Mon, Jan 28, 2013 at 11:44 AM, aaron morton > <aa...@thelastpickle.com<mailto:aa...@thelastpickle.com>> wrote: >> >> It uses the index... >> >> cqlsh:dev> tracing on; >> Now tracing requests. >> cqlsh:dev> >> cqlsh:dev> >> cqlsh:dev> SELECT id, flag from foo WHERE TOKEN(id) > '-9939393' AND >> TOKEN(id) <= '0' AND flag=true; >> >> Tracing session: 128cab90-6982-11e2-8cd1-51eaa232562e >> >> activity | timestamp | source >> | source_elapsed >> ----------------------------------------------------+--------------+-----------+---------------- >> execute_cql3_query | 08:36:55,244 | >> 127.0.0.1 | 0 >> Parsing statement | 08:36:55,244 | >> 127.0.0.1 | 600 >> Peparing statement | 08:36:55,245 | >> 127.0.0.1 | 1408 >> Determining replicas to query | 08:36:55,246 | >> 127.0.0.1 | 1924 >> Executing indexed scan for (max(-9939393), max(0)] | 08:36:55,247 | >> 127.0.0.1 | 2956 >> Executing single-partition query on foo.flag_index | 08:36:55,247 | >> 127.0.0.1 | 3192 >> Acquiring sstable references | 08:36:55,247 | >> 127.0.0.1 | 3220 >> Merging memtable contents | 08:36:55,247 | >> 127.0.0.1 | 3265 >> Scanned 0 rows and matched 0 | 08:36:55,247 | >> 127.0.0.1 | 3396 >> Request complete | 08:36:55,247 | >> 127.0.0.1 | 3644 >> >> >> It reads from the secondary index and discards keys that are outside of the >> token range. >> >> Cheers >> >> >> ----------------- >> Aaron Morton >> Freelance Cassandra Developer >> New Zealand >> >> @aaronmorton >> http://www.thelastpickle.com >> >> On 28/01/2013, at 4:24 PM, Mike Sample >> <mike.sam...@gmail.com<mailto:mike.sam...@gmail.com>> wrote: >> >> > Does the following FAQ entry hold even when the partion key is also >> > constrained in the query (by token())? >> > >> > http://wiki.apache.org/cassandra/SecondaryIndexes: >> > == >> > Q: How does choice of Consistency Level affect cluster availability >> > when using secondary indexes? >> > >> > A: Because secondary indexes are distributed, you must have CL nodes >> > available for all token ranges in the cluster in order to complete a >> > query. For example, with RF = 3, when two out of three consecutive nodes >> > in the ring are unavailable, all secondary index queries at CL = QUORUM >> > will fail, however secondary index queries at CL = ONE will succeed. This >> > is true regardless of cluster size." >> > == >> > >> > For example: >> > >> > CREATE TABLE foo ( >> > id uuid, >> > seq_num bigint, >> > flag boolean, >> > some_other_data blob, >> > PRIMARY KEY (id,seq_num) >> > ); >> > >> > CREATE INDEX flag_index ON foo (flag); >> > >> > SELECT id, flag from foo WHERE TOKEN(id) > '-9939393' AND TOKEN(id) <= '0' >> > AND flag=true; >> > >> > Would the above query with LOCAL_QUORUM succeed given the following? IE is >> > the token range used first trim node selection? >> > >> > * the cluster has 18 nodes >> > * foo is in a keyspace with a replication factor of 3 for that data center >> > * 2 nodes in one of the replication groups are down >> > * the token range in the query is not in the range of the down nodes >> > >> > >> > Thanks in advance! >> > >