Repository: cassandra Updated Branches: refs/heads/trunk 116d05b3e -> e68f52b8d
Fix for live CFMetadata on SecondaryIndexes Patch by tjake; reviewed by carl yeksigian for CASSANDRA-8027 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/e68f52b8 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/e68f52b8 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/e68f52b8 Branch: refs/heads/trunk Commit: e68f52b8d163ce0a9409ba23fd520f28e12b2a48 Parents: 116d05b Author: Jake Luciani <[email protected]> Authored: Thu Oct 2 14:31:08 2014 -0400 Committer: Jake Luciani <[email protected]> Committed: Thu Oct 2 14:34:50 2014 -0400 ---------------------------------------------------------------------- .../org/apache/cassandra/config/CFMetaData.java | 18 ++++++++- .../cassandra/io/sstable/SSTableReader.java | 4 +- .../cassandra/cql3/CrcCheckChanceTest.java | 42 ++++++++++++++++++++ 3 files changed, 62 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/e68f52b8/src/java/org/apache/cassandra/config/CFMetaData.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/config/CFMetaData.java b/src/java/org/apache/cassandra/config/CFMetaData.java index 8997507..1e2a2e1 100644 --- a/src/java/org/apache/cassandra/config/CFMetaData.java +++ b/src/java/org/apache/cassandra/config/CFMetaData.java @@ -499,7 +499,6 @@ public final class CFMetaData public CFMetaData droppedColumns(Map<ColumnIdentifier, Long> cols) {droppedColumns = cols; return this;} public CFMetaData triggers(Map<String, TriggerDefinition> prop) {triggers = prop; return this;} public CFMetaData isDense(Boolean prop) {isDense = prop; return this;} - /** * Create new ColumnFamily metadata with generated random ID. * When loading from existing schema, use CFMetaData @@ -704,6 +703,23 @@ public final class CFMetaData return cfType == ColumnFamilyType.Super; } + /** + * The '.' char is the only way to identify if the CFMetadata is for a secondary index + */ + public boolean isSecondaryIndex() + { + return cfName.contains("."); + } + + /** + * + * @return The name of the parent cf if this is a seconday index + */ + public String getParentColumnFamilyName() + { + return isSecondaryIndex() ? cfName.substring(0, cfName.indexOf('.')) : null; + } + public double getReadRepairChance() { return readRepairChance; http://git-wip-us.apache.org/repos/asf/cassandra/blob/e68f52b8/src/java/org/apache/cassandra/io/sstable/SSTableReader.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableReader.java b/src/java/org/apache/cassandra/io/sstable/SSTableReader.java index 52054e6..15dcd08 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTableReader.java +++ b/src/java/org/apache/cassandra/io/sstable/SSTableReader.java @@ -1128,7 +1128,9 @@ public class SSTableReader extends SSTable CompressionMetadata cmd = ((ICompressedFile) dfile).getMetadata(); - cmd.parameters.setLiveMetadata(Schema.instance.getCFMetaData(descriptor)); + //We need the parent cf metadata + String cfName = metadata.isSecondaryIndex() ? metadata.getParentColumnFamilyName() : metadata.cfName; + cmd.parameters.setLiveMetadata(Schema.instance.getCFMetaData(metadata.ksName, cfName)); return cmd; } http://git-wip-us.apache.org/repos/asf/cassandra/blob/e68f52b8/test/unit/org/apache/cassandra/cql3/CrcCheckChanceTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/CrcCheckChanceTest.java b/test/unit/org/apache/cassandra/cql3/CrcCheckChanceTest.java index 0cd9202..b9d23cd 100644 --- a/test/unit/org/apache/cassandra/cql3/CrcCheckChanceTest.java +++ b/test/unit/org/apache/cassandra/cql3/CrcCheckChanceTest.java @@ -31,39 +31,81 @@ public class CrcCheckChanceTest extends CQLTester //Start with crc_check_chance of 99% createTable("CREATE TABLE %s (p text, c text, v text, s text static, PRIMARY KEY (p, c)) WITH compression = {'sstable_compression': 'LZ4Compressor', 'crc_check_chance' : 0.99}"); + execute("CREATE INDEX foo ON %s(v)"); + execute("INSERT INTO %s(p, c, v, s) values (?, ?, ?, ?)", "p1", "k1", "v1", "sv1"); execute("INSERT INTO %s(p, c, v) values (?, ?, ?)", "p1", "k2", "v2"); execute("INSERT INTO %s(p, s) values (?, ?)", "p2", "sv2"); ColumnFamilyStore cfs = Keyspace.open(CQLTester.KEYSPACE).getColumnFamilyStore(currentTable()); + ColumnFamilyStore indexCfs = cfs.indexManager.getIndexesBackedByCfs().iterator().next(); cfs.forceBlockingFlush(); Assert.assertEquals(0.99, cfs.metadata.compressionParameters.getCrcCheckChance()); Assert.assertEquals(0.99, cfs.getSSTables().iterator().next().getCompressionMetadata().parameters.getCrcCheckChance()); + Assert.assertEquals(0.99, indexCfs.metadata.compressionParameters.getCrcCheckChance()); + Assert.assertEquals(0.99, indexCfs.getSSTables().iterator().next().getCompressionMetadata().parameters.getCrcCheckChance()); + assertRows(execute("SELECT * FROM %s WHERE p=?", "p1"), row("p1", "k1", "sv1", "v1"), row("p1", "k2", "sv1", "v2") ); + assertRows(execute("SELECT * FROM %s WHERE v=?", "v1"), + row("p1", "k1", "sv1", "v1") + ); + + + + //Write a few SSTables then Compact + + execute("INSERT INTO %s(p, c, v, s) values (?, ?, ?, ?)", "p1", "k1", "v1", "sv1"); + execute("INSERT INTO %s(p, c, v) values (?, ?, ?)", "p1", "k2", "v2"); + execute("INSERT INTO %s(p, s) values (?, ?)", "p2", "sv2"); + + cfs.forceBlockingFlush(); + + + execute("INSERT INTO %s(p, c, v, s) values (?, ?, ?, ?)", "p1", "k1", "v1", "sv1"); + execute("INSERT INTO %s(p, c, v) values (?, ?, ?)", "p1", "k2", "v2"); + execute("INSERT INTO %s(p, s) values (?, ?)", "p2", "sv2"); + + cfs.forceBlockingFlush(); + + execute("INSERT INTO %s(p, c, v, s) values (?, ?, ?, ?)", "p1", "k1", "v1", "sv1"); + execute("INSERT INTO %s(p, c, v) values (?, ?, ?)", "p1", "k2", "v2"); + execute("INSERT INTO %s(p, s) values (?, ?)", "p2", "sv2"); + + cfs.forceBlockingFlush(); + + cfs.forceMajorCompaction(); //Verify when we alter the value the live sstable readers hold the new one alterTable("ALTER TABLE %s WITH compression = {'sstable_compression': 'LZ4Compressor', 'crc_check_chance': 0.01}"); Assert.assertEquals( 0.01, cfs.metadata.compressionParameters.getCrcCheckChance()); Assert.assertEquals( 0.01, cfs.getSSTables().iterator().next().getCompressionMetadata().parameters.getCrcCheckChance()); + Assert.assertEquals( 0.01, indexCfs.metadata.compressionParameters.getCrcCheckChance()); + Assert.assertEquals( 0.01, indexCfs.getSSTables().iterator().next().getCompressionMetadata().parameters.getCrcCheckChance()); assertRows(execute("SELECT * FROM %s WHERE p=?", "p1"), row("p1", "k1", "sv1", "v1"), row("p1", "k2", "sv1", "v2") ); + assertRows(execute("SELECT * FROM %s WHERE v=?", "v1"), + row("p1", "k1", "sv1", "v1") + ); + //Verify the call used by JMX still works cfs.setCrcCheckChance(0.03); Assert.assertEquals( 0.03, cfs.metadata.compressionParameters.getCrcCheckChance()); Assert.assertEquals( 0.03, cfs.getSSTables().iterator().next().getCompressionMetadata().parameters.getCrcCheckChance()); + Assert.assertEquals( 0.03, indexCfs.metadata.compressionParameters.getCrcCheckChance()); + Assert.assertEquals( 0.03, indexCfs.getSSTables().iterator().next().getCompressionMetadata().parameters.getCrcCheckChance()); } }
