Author: slebresne Date: Thu Dec 8 12:07:13 2011 New Revision: 1211849 URL: http://svn.apache.org/viewvc?rev=1211849&view=rev Log: merge from 1.0
Added: cassandra/trunk/test/data/legacy-sstables/hb/ - copied from r1211848, cassandra/branches/cassandra-1.0/test/data/legacy-sstables/hb/ cassandra/trunk/test/data/legacy-sstables/hb/Keyspace1/ - copied from r1211848, cassandra/branches/cassandra-1.0/test/data/legacy-sstables/hb/Keyspace1/ cassandra/trunk/test/data/legacy-sstables/hb/Keyspace1/Indexed1-hb-1-Data.db - copied unchanged from r1211848, cassandra/branches/cassandra-1.0/test/data/legacy-sstables/hb/Keyspace1/Indexed1-hb-1-Data.db cassandra/trunk/test/data/legacy-sstables/hb/Keyspace1/Indexed1-hb-1-Digest.sha1 - copied unchanged from r1211848, cassandra/branches/cassandra-1.0/test/data/legacy-sstables/hb/Keyspace1/Indexed1-hb-1-Digest.sha1 cassandra/trunk/test/data/legacy-sstables/hb/Keyspace1/Indexed1-hb-1-Filter.db - copied unchanged from r1211848, cassandra/branches/cassandra-1.0/test/data/legacy-sstables/hb/Keyspace1/Indexed1-hb-1-Filter.db cassandra/trunk/test/data/legacy-sstables/hb/Keyspace1/Indexed1-hb-1-Index.db - copied unchanged from r1211848, cassandra/branches/cassandra-1.0/test/data/legacy-sstables/hb/Keyspace1/Indexed1-hb-1-Index.db cassandra/trunk/test/data/legacy-sstables/hb/Keyspace1/Indexed1-hb-1-Statistics.db - copied unchanged from r1211848, cassandra/branches/cassandra-1.0/test/data/legacy-sstables/hb/Keyspace1/Indexed1-hb-1-Statistics.db cassandra/trunk/test/data/legacy-sstables/hb/Keyspace1/Indexed1.626972746864617465-hb-1-Data.db - copied unchanged from r1211848, cassandra/branches/cassandra-1.0/test/data/legacy-sstables/hb/Keyspace1/Indexed1.626972746864617465-hb-1-Data.db cassandra/trunk/test/data/legacy-sstables/hb/Keyspace1/Indexed1.626972746864617465-hb-1-Digest.sha1 - copied unchanged from r1211848, cassandra/branches/cassandra-1.0/test/data/legacy-sstables/hb/Keyspace1/Indexed1.626972746864617465-hb-1-Digest.sha1 cassandra/trunk/test/data/legacy-sstables/hb/Keyspace1/Indexed1.626972746864617465-hb-1-Filter.db - copied unchanged from r1211848, cassandra/branches/cassandra-1.0/test/data/legacy-sstables/hb/Keyspace1/Indexed1.626972746864617465-hb-1-Filter.db cassandra/trunk/test/data/legacy-sstables/hb/Keyspace1/Indexed1.626972746864617465-hb-1-Index.db - copied unchanged from r1211848, cassandra/branches/cassandra-1.0/test/data/legacy-sstables/hb/Keyspace1/Indexed1.626972746864617465-hb-1-Index.db cassandra/trunk/test/data/legacy-sstables/hb/Keyspace1/Indexed1.626972746864617465-hb-1-Statistics.db - copied unchanged from r1211848, cassandra/branches/cassandra-1.0/test/data/legacy-sstables/hb/Keyspace1/Indexed1.626972746864617465-hb-1-Statistics.db cassandra/trunk/test/data/legacy-sstables/hb/Keyspace1/Standard1-hb-0-Data.db - copied unchanged from r1211848, cassandra/branches/cassandra-1.0/test/data/legacy-sstables/hb/Keyspace1/Standard1-hb-0-Data.db cassandra/trunk/test/data/legacy-sstables/hb/Keyspace1/Standard1-hb-0-Digest.sha1 - copied unchanged from r1211848, cassandra/branches/cassandra-1.0/test/data/legacy-sstables/hb/Keyspace1/Standard1-hb-0-Digest.sha1 cassandra/trunk/test/data/legacy-sstables/hb/Keyspace1/Standard1-hb-0-Filter.db - copied unchanged from r1211848, cassandra/branches/cassandra-1.0/test/data/legacy-sstables/hb/Keyspace1/Standard1-hb-0-Filter.db cassandra/trunk/test/data/legacy-sstables/hb/Keyspace1/Standard1-hb-0-Index.db - copied unchanged from r1211848, cassandra/branches/cassandra-1.0/test/data/legacy-sstables/hb/Keyspace1/Standard1-hb-0-Index.db cassandra/trunk/test/data/legacy-sstables/hb/Keyspace1/Standard1-hb-0-Statistics.db - copied unchanged from r1211848, cassandra/branches/cassandra-1.0/test/data/legacy-sstables/hb/Keyspace1/Standard1-hb-0-Statistics.db Modified: cassandra/trunk/ (props changed) cassandra/trunk/CHANGES.txt cassandra/trunk/contrib/ (props changed) cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java (props changed) cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java (props changed) cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java (props changed) cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java (props changed) cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java (props changed) cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableMetadata.java cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableReader.java cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java cassandra/trunk/test/unit/org/apache/cassandra/io/sstable/SSTableMetadataSerializerTest.java cassandra/trunk/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java Propchange: cassandra/trunk/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Thu Dec 8 12:07:13 2011 @@ -4,7 +4,7 @@ /cassandra/branches/cassandra-0.8:1090934-1125013,1125019-1198724,1198726-1206097,1206099-1209609,1210902,1211000,1211486 /cassandra/branches/cassandra-0.8.0:1125021-1130369 /cassandra/branches/cassandra-0.8.1:1101014-1125018 -/cassandra/branches/cassandra-1.0:1167085-1211632 +/cassandra/branches/cassandra-1.0:1167085-1211632,1211848 /cassandra/branches/cassandra-1.0.0:1167104-1167229,1167232-1181093,1181741,1181816,1181820,1182951,1183243 /cassandra/tags/cassandra-0.7.0-rc3:1051699-1053689 /cassandra/tags/cassandra-0.8.0-rc1:1102511-1125020 Modified: cassandra/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=1211849&r1=1211848&r2=1211849&view=diff ============================================================================== --- cassandra/trunk/CHANGES.txt (original) +++ cassandra/trunk/CHANGES.txt Thu Dec 8 12:07:13 2011 @@ -42,6 +42,7 @@ (CASSANDRA-3558) * fix missing response during range slice repair (CASSANDRA-3551) * 'describe ring' moved from CLI to nodetool and available through JMX (CASSANDRA-3220) + * add back partitioner to sstable metadata (CASSANDRA-3540) Merged from 0.8: * use cannonical host for local node in nodetool info (CASSANDRA-3556) * detect misuses of CounterColumnType (CASSANDRA-3422) Propchange: cassandra/trunk/contrib/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Thu Dec 8 12:07:13 2011 @@ -4,7 +4,7 @@ /cassandra/branches/cassandra-0.8/contrib:1090934-1125013,1125019-1198724,1198726-1206097,1206099-1209609,1210902,1211000,1211486 /cassandra/branches/cassandra-0.8.0/contrib:1125021-1130369 /cassandra/branches/cassandra-0.8.1/contrib:1101014-1125018 -/cassandra/branches/cassandra-1.0/contrib:1167085-1211632 +/cassandra/branches/cassandra-1.0/contrib:1167085-1211632,1211848 /cassandra/branches/cassandra-1.0.0/contrib:1167104-1167229,1167232-1181093,1181741,1181816,1181820,1182951,1183243 /cassandra/tags/cassandra-0.7.0-rc3/contrib:1051699-1053689 /cassandra/tags/cassandra-0.8.0-rc1/contrib:1102511-1125020 Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Thu Dec 8 12:07:13 2011 @@ -4,7 +4,7 @@ /cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1090934-1125013,1125019-1198724,1198726-1206097,1206099-1209609,1210902,1211000,1211486 /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1125021-1130369 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1101014-1125018 -/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1167085-1211632 +/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1167085-1211632,1211848 /cassandra/branches/cassandra-1.0.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1167104-1167229,1167232-1181093,1181741,1181816,1181820,1182951,1183243 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1051699-1053689 /cassandra/tags/cassandra-0.8.0-rc1/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1102511-1125020 Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Thu Dec 8 12:07:13 2011 @@ -4,7 +4,7 @@ /cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1090934-1125013,1125019-1198724,1198726-1206097,1206099-1209609,1210902,1211000,1211486 /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1125021-1130369 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1101014-1125018 -/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1167085-1211632 +/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1167085-1211632,1211848 /cassandra/branches/cassandra-1.0.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1167104-1167229,1167232-1181093,1181741,1181816,1181820,1182951,1183243 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1051699-1053689 /cassandra/tags/cassandra-0.8.0-rc1/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1102511-1125020 Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Thu Dec 8 12:07:13 2011 @@ -4,7 +4,7 @@ /cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1090934-1125013,1125019-1198724,1198726-1206097,1206099-1209609,1210902,1211000,1211486 /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1125021-1130369 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1101014-1125018 -/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1167085-1211632 +/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1167085-1211632,1211848 /cassandra/branches/cassandra-1.0.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1167104-1167229,1167232-1181093,1181741,1181816,1181820,1182951,1183243 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1051699-1053689 /cassandra/tags/cassandra-0.8.0-rc1/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1102511-1125020 Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Thu Dec 8 12:07:13 2011 @@ -4,7 +4,7 @@ /cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1090934-1125013,1125019-1198724,1198726-1206097,1206099-1209609,1210902,1211000,1211486 /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1125021-1130369 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1101014-1125018 -/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1167085-1211632 +/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1167085-1211632,1211848 /cassandra/branches/cassandra-1.0.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1167104-1167229,1167232-1181093,1181741,1181816,1181820,1182951,1183243 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1051699-1053689 /cassandra/tags/cassandra-0.8.0-rc1/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1102511-1125020 Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Thu Dec 8 12:07:13 2011 @@ -4,7 +4,7 @@ /cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1090934-1125013,1125019-1198724,1198726-1206097,1206099-1209609,1210902,1211000,1211486 /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1125021-1130369 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1101014-1125018 -/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1167085-1211632 +/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1167085-1211632,1211848 /cassandra/branches/cassandra-1.0.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1167104-1167229,1167232-1181093,1181741,1181816,1181820,1182951,1183243 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1051699-1053689 /cassandra/tags/cassandra-0.8.0-rc1/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1102511-1125020 Modified: cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableMetadata.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableMetadata.java?rev=1211849&r1=1211848&r2=1211849&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableMetadata.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableMetadata.java Thu Dec 8 12:07:13 2011 @@ -29,7 +29,6 @@ import java.io.IOException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.commitlog.ReplayPosition; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.utils.EstimatedHistogram; @@ -67,7 +66,7 @@ public class SSTableMetadata ReplayPosition.NONE, Long.MIN_VALUE, Double.MIN_VALUE, - DatabaseDescriptor.getPartitioner().getClass().getCanonicalName()); + null); } private SSTableMetadata(EstimatedHistogram rowSizes, EstimatedHistogram columnCounts, ReplayPosition replayPosition, long maxTimestamp, double cr, String partitioner) @@ -134,14 +133,14 @@ public class SSTableMetadata maxTimestamp = Math.max(maxTimestamp, potentialMax); } - public SSTableMetadata finalizeMetadata() + public SSTableMetadata finalizeMetadata(String partitioner) { return new SSTableMetadata(estimatedRowSize, estimatedColumnCount, replayPosition, maxTimestamp, compressionRatio, - DatabaseDescriptor.getPartitioner().getClass().getCanonicalName()); + partitioner); } public Collector estimatedRowSize(EstimatedHistogram estimatedRowSize) @@ -169,6 +168,8 @@ public class SSTableMetadata public void serialize(SSTableMetadata sstableStats, DataOutput dos) throws IOException { + assert sstableStats.partitioner != null; + EstimatedHistogram.serializer.serialize(sstableStats.estimatedRowSize, dos); EstimatedHistogram.serializer.serialize(sstableStats.estimatedColumnCount, dos); ReplayPosition.serializer.serialize(sstableStats.replayPosition, dos); @@ -209,9 +210,7 @@ public class SSTableMetadata double compressionRatio = desc.hasCompressionRatio ? dis.readDouble() : Double.MIN_VALUE; - String partitioner = desc.hasPartitioner - ? dis.readUTF() - : DatabaseDescriptor.getPartitioner().getClass().getCanonicalName(); + String partitioner = desc.hasPartitioner ? dis.readUTF() : null; return new SSTableMetadata(rowSizes, columnCounts, replayPosition, maxTimestamp, compressionRatio, partitioner); } } Modified: cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableReader.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableReader.java?rev=1211849&r1=1211848&r2=1211849&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableReader.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableReader.java Thu Dec 8 12:07:13 2011 @@ -138,9 +138,11 @@ public class SSTableReader extends SSTab ? SSTableMetadata.serializer.deserialize(descriptor) : SSTableMetadata.createDefaultInstance(); - // check if sstable is created using same partitioner as this node + // Check if sstable is created using same partitioner. + // Partitioner can be null, which indicates older version of sstable or no stats available. + // In that case, we skip the check. String partitionerName = partitioner.getClass().getCanonicalName(); - if (!partitionerName.equals(sstableMetadata.partitioner)) + if (sstableMetadata.partitioner != null && !partitionerName.equals(sstableMetadata.partitioner)) throw new RuntimeException(String.format("Cannot open %s because partitioner does not match %s", descriptor, partitionerName)); Modified: cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java?rev=1211849&r1=1211848&r2=1211849&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java Thu Dec 8 12:07:13 2011 @@ -311,7 +311,7 @@ public class SSTableWriter extends SSTab dataFile.close(); // write sstable statistics - SSTableMetadata sstableMetadata = sstableMetadataCollector.finalizeMetadata(); + SSTableMetadata sstableMetadata = sstableMetadataCollector.finalizeMetadata(partitioner.getClass().getCanonicalName()); writeMetadata(descriptor, sstableMetadata); maybeWriteDigest(); Modified: cassandra/trunk/test/unit/org/apache/cassandra/io/sstable/SSTableMetadataSerializerTest.java URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/io/sstable/SSTableMetadataSerializerTest.java?rev=1211849&r1=1211848&r2=1211849&view=diff ============================================================================== --- cassandra/trunk/test/unit/org/apache/cassandra/io/sstable/SSTableMetadataSerializerTest.java (original) +++ cassandra/trunk/test/unit/org/apache/cassandra/io/sstable/SSTableMetadataSerializerTest.java Thu Dec 8 12:07:13 2011 @@ -28,6 +28,7 @@ import java.io.IOException; import org.junit.Test; import org.apache.cassandra.db.commitlog.ReplayPosition; +import org.apache.cassandra.dht.RandomPartitioner; import org.apache.cassandra.utils.EstimatedHistogram; public class SSTableMetadataSerializerTest @@ -49,7 +50,7 @@ public class SSTableMetadataSerializerTe .estimatedColumnCount(columnCounts) .replayPosition(rp); collector.updateMaxTimestamp(maxTimestamp); - SSTableMetadata originalMetadata = collector.finalizeMetadata(); + SSTableMetadata originalMetadata = collector.finalizeMetadata(RandomPartitioner.class.getCanonicalName()); ByteArrayOutputStream byteOutput = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(byteOutput); @@ -69,5 +70,6 @@ public class SSTableMetadataSerializerTe assert stats.replayPosition.equals(rp); assert stats.maxTimestamp == maxTimestamp; assert stats.maxTimestamp == originalMetadata.maxTimestamp; + assert RandomPartitioner.class.getCanonicalName().equals(stats.partitioner); } } Modified: cassandra/trunk/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java?rev=1211849&r1=1211848&r2=1211849&view=diff ============================================================================== --- cassandra/trunk/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java (original) +++ cassandra/trunk/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java Thu Dec 8 12:07:13 2011 @@ -21,6 +21,7 @@ package org.apache.cassandra.io.sstable; */ +import java.io.File; import java.io.IOException; import java.nio.ByteBuffer; import java.util.concurrent.ExecutionException; @@ -33,14 +34,21 @@ import org.junit.Test; import org.apache.cassandra.CleanupHelper; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.*; +import org.apache.cassandra.db.columniterator.IdentityQueryFilter; import org.apache.cassandra.db.compaction.CompactionManager; import org.apache.cassandra.db.filter.QueryPath; +import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.apache.cassandra.io.util.FileDataInput; +import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.io.util.MmappedSegmentedFile; import org.apache.cassandra.service.StorageService; +import org.apache.cassandra.thrift.IndexClause; +import org.apache.cassandra.thrift.IndexExpression; +import org.apache.cassandra.thrift.IndexOperator; import org.apache.cassandra.utils.ByteBufferUtil; +import org.apache.cassandra.utils.CLibrary; import org.apache.cassandra.utils.Pair; import org.apache.cassandra.Util; @@ -188,6 +196,75 @@ public class SSTableReaderTest extends C assert p.right == p7; } + @Test + public void testPersistentStatisticsWithSecondaryIndex() throws IOException, ExecutionException, InterruptedException + { + // Create secondary index and flush to disk + Table table = Table.open("Keyspace1"); + ColumnFamilyStore store = table.getColumnFamilyStore("Indexed1"); + ByteBuffer key = ByteBufferUtil.bytes(String.valueOf("k1")); + RowMutation rm = new RowMutation("Keyspace1", key); + rm.add(new QueryPath("Indexed1", null, ByteBufferUtil.bytes("birthdate")), ByteBufferUtil.bytes(1L), System.currentTimeMillis()); + rm.apply(); + store.forceBlockingFlush(); + + // check if opening and querying works + assertIndexQueryWorks(store); + } + + @Test + public void testPersistentStatisticsFromOlderIndexedSSTable() throws IOException, ExecutionException, InterruptedException + { + // copy legacy indexed sstables + String root = System.getProperty("legacy-sstable-root"); + assert root != null; + File rootDir = new File(root + File.separator + "hb" + File.separator + "Keyspace1"); + assert rootDir.isDirectory(); + + String[] destDirs = DatabaseDescriptor.getAllDataFileLocationsForTable("Keyspace1"); + assert destDirs != null; + assert destDirs.length > 0; + + FileUtils.createDirectory(destDirs[0]); + for (File srcFile : rootDir.listFiles()) + { + if (!srcFile.getName().startsWith("Indexed1")) + continue; + File destFile = new File(destDirs[0] + File.separator + srcFile.getName()); + CLibrary.createHardLinkWithExec(srcFile, destFile); + + destFile = new File(destDirs[0] + File.separator + srcFile.getName()); + + assert destFile.exists() : destFile.getAbsoluteFile(); + } + ColumnFamilyStore store = Table.open("Keyspace1").getColumnFamilyStore("Indexed1"); + + // check if opening and querying works + assertIndexQueryWorks(store); + } + + private void assertIndexQueryWorks(ColumnFamilyStore indexedCFS) + { + assert "Indexed1".equals(indexedCFS.getColumnFamilyName()); + + // make sure all sstables including 2ary indexes load from disk + indexedCFS.clearUnsafe(); + for (ColumnFamilyStore indexCfs : indexedCFS.indexManager.getIndexesBackedByCfs()) + { + indexCfs.clearUnsafe(); + indexCfs.loadNewSSTables(); // v1.0.4 would fail here (see CASSANDRA-3540) + } + indexedCFS.loadNewSSTables(); + + // query using index to see if sstable for secondary index opens + IndexExpression expr = new IndexExpression(ByteBufferUtil.bytes("birthdate"), IndexOperator.EQ, ByteBufferUtil.bytes(1L)); + IndexClause clause = new IndexClause(Arrays.asList(expr), ByteBufferUtil.EMPTY_BYTE_BUFFER, 100); + IPartitioner p = StorageService.getPartitioner(); + Range range = new Range(p.getMinimumToken(), p.getMinimumToken()); + List<Row> rows = indexedCFS.search(clause, range, new IdentityQueryFilter()); + assert rows.size() == 1; + } + private List<Range<Token>> makeRanges(Token left, Token right) { return Arrays.<Range<Token>>asList(new Range[]{ new Range<Token>(left, right) });