[
https://issues.apache.org/jira/browse/CASSANDRA-5732?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13791509#comment-13791509
]
Sam Tunnicliffe commented on CASSANDRA-5732:
--------------------------------------------
The reason for the missing results is that in CFS.getColumnFamily() we look up
the cfs id from Schema to calculate the cache key. However, 2i CFSes are never
loaded into the Schema, so Schema.instance.getId always returns null. Simply
fixing this by calling Schema.instance.load() with the 2i CFMD when the index
is initialized uncovers another issue. The cfid is now retrievable, but the
deserialization of a cached 2i row fails as it depends on the 2i CFMD being
present in the enclosing KSMD for the eventual call to Schema.getCFMD(). Once
we start adding index CFs to Schema they then become involved in schema
migrations which makes everything very messy. So rather than adding them
directly to KSMD like regular CFs, I added a separate cfId->CFMD map to Schema,
so as far as most things are concerned nothing has changed, just we have one
further place to look when retrieving CFMD for a given cfId.
The attached patch is against the 1.2 branch, CASSANDRA-4875 is a duplicate of
this, but has a fixver of 1.1 [~jbellis], do you want me to submit a patch
against 1.1 also?
I wrote a dtest for this, pull request for that here:
https://github.com/riptano/cassandra-dtest/pull/22
Looking at this, I also uncovered what I think is an issue with the setup of
the 2i cache config. In AbstractSimplePerColumnSecondaryIndex (in 1.2, the same
code is in KeysIndex in 1.1), the estimated key and mean column counts are used
to gauge the index's cardinality then use that to decide whether or not to
enable row caching. This calculation is first performed prior to the index
actually being built, so there are no SSTables to provide the estimates, which
results in row caching always being disabled until the next time the index is
initialized when C* is restarted (this appears to be why the repro steps
require a restart). If this is a genuine problem, I'll create a separate JIRA
to address it.
> Can not query secondary index
> -----------------------------
>
> Key: CASSANDRA-5732
> URL: https://issues.apache.org/jira/browse/CASSANDRA-5732
> Project: Cassandra
> Issue Type: Bug
> Components: Core
> Affects Versions: 1.2.5
> Environment: Windows 8, Jre 1.6.0_45 32-bit
> Reporter: Tony Anecito
> Assignee: Sam Tunnicliffe
> Attachments: 5732-1.2
>
>
> Noticed after taking a column family that already existed and assigning to an
> IntegerType index_type:KEYS and the caching was already set to 'ALL' that the
> prepared statement do not return rows neither did it throw an exception. Here
> is the sequence.
> 1. Starting state query running with caching off for a Column Family with the
> query using the secondary index for te WHERE clause.
> 2, Set Column Family caching to ALL using Cassandra-CLI and update CQL.
> Cassandra-cli Describe shows column family caching set to ALL
> 3. Rerun query and it works.
> 4. Restart Cassandra and run query and no rows returned. Cassandra-cli
> Describe shows column family caching set to ALL
> 5. Set Column Family caching to NONE using Cassandra-cli and update CQL.
> Rerun query and no rows returned. Cassandra-cli Describe for column family
> shows caching set to NONE.
> 6. Restart Cassandra. Rerun query and it is working again. We are now back to
> the starting state.
> Best Regards,
> -Tony
--
This message was sent by Atlassian JIRA
(v6.1#6144)