From dbb1fa5690ab3d9d26f7406910e92c6294108041 Mon Sep 17 00:00:00 2001 From: Jake Luciani Date: Thu, 2 Oct 2014 14:31:08 -0400 Subject: [PATCH 1/3] Fix for live CFMetadata on SecondaryIndexes Patch by tjake; reviewed by carl yeksigian for CASSANDRA-8027 --- .../apache/cassandra/config/CFMetaData.java | 18 +++++++- .../cassandra/io/sstable/SSTableReader.java | 4 +- .../cassandra/cql3/CrcCheckChanceTest.java | 42 +++++++++++++++++++ 3 files changed, 62 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/cassandra/config/CFMetaData.java b/src/java/org/apache/cassandra/config/CFMetaData.java index 1d6e3a486c..b5784ed7dd 100644 --- a/src/java/org/apache/cassandra/config/CFMetaData.java +++ b/src/java/org/apache/cassandra/config/CFMetaData.java @@ -487,7 +487,6 @@ public final class CFMetaData public CFMetaData droppedColumns(Map cols) {droppedColumns = cols; return this;} public CFMetaData triggers(Map 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 @@ -692,6 +691,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; diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableReader.java b/src/java/org/apache/cassandra/io/sstable/SSTableReader.java index 2bd17b8475..9f2b59df9e 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; } diff --git a/test/unit/org/apache/cassandra/cql3/CrcCheckChanceTest.java b/test/unit/org/apache/cassandra/cql3/CrcCheckChanceTest.java index 0cd92029f9..b9d23cd1ed 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()); } } From 1f10bcbbbbecaec28cc98f943f526bbd6c7197ae Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Thu, 2 Oct 2014 13:33:27 -0500 Subject: [PATCH 2/3] Add bash-completion to debian/control Build-Depends Patch by Michael Shuler, reviewed by brandonwilliams for CASSANDRA-8040 --- debian/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control b/debian/control index f752769641..a48441b858 100644 --- a/debian/control +++ b/debian/control @@ -3,7 +3,7 @@ Section: misc Priority: extra Maintainer: Eric Evans Uploaders: Sylvain Lebresne -Build-Depends: debhelper (>= 5), openjdk-7-jdk | java7-jdk, ant (>= 1.7), ant-optional (>= 1.7), python-support, dpatch +Build-Depends: debhelper (>= 5), openjdk-7-jdk | java7-jdk, ant (>= 1.7), ant-optional (>= 1.7), python-support, dpatch, bash-completion Homepage: http://cassandra.apache.org Vcs-Git: http://git-wip-us.apache.org/repos/asf/cassandra.git Vcs-Browser: https://git-wip-us.apache.org/repos/asf?p=cassandra.git From c4c56fa665a5d4d8e1f37a5b263bdc4d0cf0083e Mon Sep 17 00:00:00 2001 From: Joshua McKenzie Date: Thu, 2 Oct 2014 14:23:21 -0500 Subject: [PATCH 3/3] Make check for cygwin environment less greedy. Patch by Josh McKenzie, reviewed by Philip Thompson for CASSANDRA-8045 --- bin/cassandra.ps1 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/bin/cassandra.ps1 b/bin/cassandra.ps1 index ea06f63fc6..33ff97a4f9 100644 --- a/bin/cassandra.ps1 +++ b/bin/cassandra.ps1 @@ -243,7 +243,10 @@ $env:JAVA_BIN try { $uname = uname -o - $cygwin = $true + if ($uname.CompareTo("Cygwin") -eq 0) + { + $cygwin = $true + } } catch { @@ -257,6 +260,7 @@ $env:JAVA_BIN # stop-server usage if (!$p) { + echo "Detected cygwin runtime environment. Adding -Dcassandra-pidfile=$pidfile to JVM params as control+c trapping on mintty is inconsistent" $arg2 = $arg2 + " -Dcassandra-pidfile=$pidfile" } }