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());
 
     }
 }

Reply via email to