Repository: cassandra
Updated Branches:
  refs/heads/cassandra-2.0 c6867c2c2 -> b353aa34e


apply CASSANDRA-8027 to cassandra-2.0 branch


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/b353aa34
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/b353aa34
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/b353aa34

Branch: refs/heads/cassandra-2.0
Commit: b353aa34e31c1388fe64a560413c855535af3665
Parents: c6867c2
Author: T Jake Luciani <j...@apache.org>
Authored: Mon Oct 20 13:04:23 2014 -0400
Committer: T Jake Luciani <j...@apache.org>
Committed: Mon Oct 20 13:04:23 2014 -0400

----------------------------------------------------------------------
 .../org/apache/cassandra/config/CFMetaData.java | 17 ++++
 .../cassandra/io/sstable/SSTableReader.java     |  4 +-
 .../cql3/SSTableMetadataTrackingTest.java       | 82 +++++++++++++++++++-
 3 files changed, 98 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/b353aa34/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 e726957..60eb70e 100644
--- a/src/java/org/apache/cassandra/config/CFMetaData.java
+++ b/src/java/org/apache/cassandra/config/CFMetaData.java
@@ -633,6 +633,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/b353aa34/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 92dee99..87f084c 100644
--- a/src/java/org/apache/cassandra/io/sstable/SSTableReader.java
+++ b/src/java/org/apache/cassandra/io/sstable/SSTableReader.java
@@ -626,7 +626,9 @@ public class SSTableReader extends SSTable implements 
Closeable
 
         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/b353aa34/test/unit/org/apache/cassandra/cql3/SSTableMetadataTrackingTest.java
----------------------------------------------------------------------
diff --git 
a/test/unit/org/apache/cassandra/cql3/SSTableMetadataTrackingTest.java 
b/test/unit/org/apache/cassandra/cql3/SSTableMetadataTrackingTest.java
index 9104269..356c9e2 100644
--- a/test/unit/org/apache/cassandra/cql3/SSTableMetadataTrackingTest.java
+++ b/test/unit/org/apache/cassandra/cql3/SSTableMetadataTrackingTest.java
@@ -17,10 +17,7 @@
  */
 package org.apache.cassandra.cql3;
 
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.*;
 
 import org.apache.cassandra.SchemaLoader;
 import org.apache.cassandra.db.ColumnFamilyStore;
@@ -179,6 +176,83 @@ public class SSTableMetadataTrackingTest
         assertEquals(metadata.maxTimestamp, metadata2.maxTimestamp);
     }
 
+    @Test
+    public void testChangingCrcCheckChance() throws Throwable
+    {
+        String currentTable = "crctest";
+
+        //Start with crc_check_chance of 99%
+        createTable("CREATE TABLE %s.crctest (p text, c text, v text, s text 
static, PRIMARY KEY (p, c)) WITH compression = {'sstable_compression': 
'LZ4Compressor', 'crc_check_chance' : 0.99}");
+
+        createTable("CREATE INDEX foo ON %s.crctest(v)");
+
+        execute("INSERT INTO %s.crctest(p, c, v, s) values ('p1', 'k1', 'v1', 
'sv1')");
+        execute("INSERT INTO %s.crctest(p, c, v) values ('p1', 'k2', 'v2')");
+        execute("INSERT INTO %s.crctest(p, s) values ('p2', 'sv2')");
+
+
+        ColumnFamilyStore cfs = 
Keyspace.open(keyspace).getColumnFamilyStore(currentTable);
+        ColumnFamilyStore indexCfs = 
cfs.indexManager.getIndexesBackedByCfs().iterator().next();
+        cfs.forceBlockingFlush();
+
+        Assert.assertEquals(0.99, 
cfs.metadata.compressionParameters.getCrcCheckChance(), 0.00);
+        Assert.assertEquals(0.99, 
cfs.getSSTables().iterator().next().getCompressionMetadata().parameters.getCrcCheckChance(),
 0.00);
+        Assert.assertEquals(0.99, 
indexCfs.metadata.compressionParameters.getCrcCheckChance(), 0.00);
+        Assert.assertEquals(0.99, 
indexCfs.getSSTables().iterator().next().getCompressionMetadata().parameters.getCrcCheckChance(),
 0.00);
+
+
+        Assert.assertEquals(execute("SELECT * FROM %s.crctest WHERE 
p='p1'").size(), 2);
+        Assert.assertEquals(execute("SELECT * FROM %s.crctest WHERE 
v='v1'").size(), 1);
+
+
+
+
+        //Write a few SSTables then Compact
+
+        execute("INSERT INTO %s.crctest(p, c, v, s) values ('p1', 'k1', 'v1', 
'sv1')");
+        execute("INSERT INTO %s.crctest(p, c, v) values ('p1', 'k2', 'v2')");
+        execute("INSERT INTO %s.crctest(p, s) values ('p2', 'sv2')");
+
+        cfs.forceBlockingFlush();
+
+        execute("INSERT INTO %s.crctest(p, c, v, s) values ('p1', 'k1', 'v1', 
'sv1')");
+        execute("INSERT INTO %s.crctest(p, c, v) values ('p1', 'k2', 'v2')");
+        execute("INSERT INTO %s.crctest(p, s) values ('p2', 'sv2')");
+
+
+        cfs.forceBlockingFlush();
+
+        execute("INSERT INTO %s.crctest(p, c, v, s) values ('p1', 'k1', 'v1', 
'sv1')");
+        execute("INSERT INTO %s.crctest(p, c, v) values ('p1', 'k2', 'v2')");
+        execute("INSERT INTO %s.crctest(p, s) values ('p2', 'sv2')");
+
+
+        cfs.forceBlockingFlush();
+
+        cfs.forceMajorCompaction();
+
+        //Verify when we alter the value the live sstable readers hold the new 
one
+        createTable("ALTER TABLE %s.crctest WITH compression = 
{'sstable_compression': 'LZ4Compressor', 'crc_check_chance': 0.01}");
+
+        Assert.assertEquals( 0.01, 
cfs.metadata.compressionParameters.getCrcCheckChance(), 0.00);
+        Assert.assertEquals( 0.01, 
cfs.getSSTables().iterator().next().getCompressionMetadata().parameters.getCrcCheckChance(),
 0.00);
+        Assert.assertEquals( 0.01, 
indexCfs.metadata.compressionParameters.getCrcCheckChance(), 0.00);
+        Assert.assertEquals( 0.01, 
indexCfs.getSSTables().iterator().next().getCompressionMetadata().parameters.getCrcCheckChance(),
 0.00);
+
+
+        Assert.assertEquals(execute("SELECT * FROM %s.crctest WHERE 
p='p1'").size(), 2);
+        Assert.assertEquals(execute("SELECT * FROM %s.crctest WHERE 
v='v1'").size(), 1);
+
+
+        //Verify the call used by JMX still works
+        cfs.setCrcCheckChance(0.03);
+        Assert.assertEquals( 0.03, 
cfs.metadata.compressionParameters.getCrcCheckChance(), 0.00);
+        Assert.assertEquals( 0.03, 
cfs.getSSTables().iterator().next().getCompressionMetadata().parameters.getCrcCheckChance(),
 0.00);
+        Assert.assertEquals( 0.03, 
indexCfs.metadata.compressionParameters.getCrcCheckChance(), 0.00);
+        Assert.assertEquals( 0.03, 
indexCfs.getSSTables().iterator().next().getCompressionMetadata().parameters.getCrcCheckChance(),
 0.00);
+
+    }
+
     @AfterClass
     public static void stopGossiper()
     {

Reply via email to