http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/test/unit/org/apache/cassandra/io/sstable/SSTableScannerTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableScannerTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableScannerTest.java index 930db50..353b1ad 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableScannerTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableScannerTest.java @@ -24,14 +24,13 @@ import java.util.Collection; import java.util.List; import com.google.common.collect.Iterables; -import com.google.common.util.concurrent.RateLimiter; import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; -import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.schema.TableMetadata; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.DataRange; import org.apache.cassandra.db.DecoratedKey; @@ -74,7 +73,7 @@ public class SSTableScannerTest } // we produce all DataRange variations that produce an inclusive start and exclusive end range - private static Iterable<DataRange> dataRanges(CFMetaData metadata, int start, int end) + private static Iterable<DataRange> dataRanges(TableMetadata metadata, int start, int end) { if (end < start) return dataRanges(metadata, start, end, false, true); @@ -85,7 +84,7 @@ public class SSTableScannerTest ); } - private static Iterable<DataRange> dataRanges(CFMetaData metadata, int start, int end, boolean inclusiveStart, boolean inclusiveEnd) + private static Iterable<DataRange> dataRanges(TableMetadata metadata, int start, int end, boolean inclusiveStart, boolean inclusiveEnd) { List<DataRange> ranges = new ArrayList<>(); if (start == end + 1) @@ -143,7 +142,7 @@ public class SSTableScannerTest return token(key).maxKeyBound(); } - private static DataRange dataRange(CFMetaData metadata, PartitionPosition start, boolean startInclusive, PartitionPosition end, boolean endInclusive) + private static DataRange dataRange(TableMetadata metadata, PartitionPosition start, boolean startInclusive, PartitionPosition end, boolean endInclusive) { Slices.Builder sb = new Slices.Builder(metadata.comparator); ClusteringIndexSliceFilter filter = new ClusteringIndexSliceFilter(sb.build(), false); @@ -165,7 +164,7 @@ public class SSTableScannerTest return ranges; } - private static void insertRowWithKey(CFMetaData metadata, int key) + private static void insertRowWithKey(TableMetadata metadata, int key) { long timestamp = System.currentTimeMillis(); @@ -180,9 +179,9 @@ public class SSTableScannerTest private static void assertScanMatches(SSTableReader sstable, int scanStart, int scanEnd, int ... boundaries) { assert boundaries.length % 2 == 0; - for (DataRange range : dataRanges(sstable.metadata, scanStart, scanEnd)) + for (DataRange range : dataRanges(sstable.metadata(), scanStart, scanEnd)) { - try(ISSTableScanner scanner = sstable.getScanner(ColumnFilter.all(sstable.metadata), range)) + try(ISSTableScanner scanner = sstable.getScanner(ColumnFilter.all(sstable.metadata()), range)) { for (int b = 0; b < boundaries.length; b += 2) for (int i = boundaries[b]; i <= boundaries[b + 1]; i++) @@ -212,7 +211,7 @@ public class SSTableScannerTest store.disableAutoCompaction(); for (int i = 2; i < 10; i++) - insertRowWithKey(store.metadata, i); + insertRowWithKey(store.metadata(), i); store.forceBlockingFlush(); assertEquals(1, store.getLiveSSTables().size()); @@ -318,7 +317,7 @@ public class SSTableScannerTest for (int i = 0; i < 3; i++) for (int j = 2; j < 10; j++) - insertRowWithKey(store.metadata, i * 100 + j); + insertRowWithKey(store.metadata(), i * 100 + j); store.forceBlockingFlush(); assertEquals(1, store.getLiveSSTables().size()); @@ -438,7 +437,7 @@ public class SSTableScannerTest // disable compaction while flushing store.disableAutoCompaction(); - insertRowWithKey(store.metadata, 205); + insertRowWithKey(store.metadata(), 205); store.forceBlockingFlush(); assertEquals(1, store.getLiveSSTables().size());
http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java b/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java index 90b1857..189782c 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java @@ -23,8 +23,8 @@ import java.io.File; import java.io.IOException; import java.util.*; -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.config.Schema; +import org.apache.cassandra.schema.TableMetadata; +import org.apache.cassandra.schema.Schema; import org.apache.cassandra.db.*; import org.apache.cassandra.db.rows.*; import org.apache.cassandra.db.partitions.*; @@ -171,7 +171,7 @@ public class SSTableUtils Map<String, PartitionUpdate> map = new HashMap<>(); for (String key : keys) { - RowUpdateBuilder builder = new RowUpdateBuilder(Schema.instance.getCFMetaData(ksname, cfname), 0, key); + RowUpdateBuilder builder = new RowUpdateBuilder(Schema.instance.getTableMetadata(ksname, cfname), 0, key); builder.clustering(key).add("val", key); map.put(key, builder.buildUpdate()); } @@ -180,7 +180,7 @@ public class SSTableUtils public Collection<SSTableReader> write(SortedMap<DecoratedKey, PartitionUpdate> sorted) throws IOException { - PartitionColumns.Builder builder = PartitionColumns.builder(); + RegularAndStaticColumns.Builder builder = RegularAndStaticColumns.builder(); for (PartitionUpdate update : sorted.values()) builder.addAll(update.columns()); final Iterator<Map.Entry<DecoratedKey, PartitionUpdate>> iter = sorted.entrySet().iterator(); @@ -188,7 +188,7 @@ public class SSTableUtils { public SerializationHeader header() { - return new SerializationHeader(true, Schema.instance.getCFMetaData(ksname, cfname), builder.build(), EncodingStats.NO_STATS); + return new SerializationHeader(true, Schema.instance.getTableMetadata(ksname, cfname), builder.build(), EncodingStats.NO_STATS); } @Override @@ -214,8 +214,8 @@ public class SSTableUtils public Collection<SSTableReader> write(int expectedSize, Appender appender) throws IOException { File datafile = (dest == null) ? tempSSTableFile(ksname, cfname, generation) : new File(dest.filenameFor(Component.DATA)); - CFMetaData cfm = Schema.instance.getCFMetaData(ksname, cfname); - ColumnFamilyStore cfs = Schema.instance.getColumnFamilyStoreInstance(cfm.cfId); + TableMetadata metadata = Schema.instance.getTableMetadata(ksname, cfname); + ColumnFamilyStore cfs = Schema.instance.getColumnFamilyStoreInstance(metadata.id); SerializationHeader header = appender.header(); SSTableTxnWriter writer = SSTableTxnWriter.create(cfs, Descriptor.fromFilename(datafile.getAbsolutePath()), expectedSize, ActiveRepairService.UNREPAIRED_SSTABLE, 0, header); while (appender.append(writer)) { /* pass */ } http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/test/unit/org/apache/cassandra/io/sstable/SSTableWriterTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableWriterTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableWriterTest.java index 1a50d70..fd93ca1 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableWriterTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableWriterTest.java @@ -52,7 +52,7 @@ public class SSTableWriterTest extends SSTableWriterTestBase { for (int i = 0; i < 10000; i++) { - UpdateBuilder builder = UpdateBuilder.create(cfs.metadata, random(i, 10)).withTimestamp(1); + UpdateBuilder builder = UpdateBuilder.create(cfs.metadata(), random(i, 10)).withTimestamp(1); for (int j = 0; j < 100; j++) builder.newRow("" + j).add("val", ByteBuffer.allocate(1000)); writer.append(builder.build().unfilteredIterator()); @@ -63,7 +63,7 @@ public class SSTableWriterTest extends SSTableWriterTestBase assertFileCounts(dir.list()); for (int i = 10000; i < 20000; i++) { - UpdateBuilder builder = UpdateBuilder.create(cfs.metadata, random(i, 10)).withTimestamp(1); + UpdateBuilder builder = UpdateBuilder.create(cfs.metadata(), random(i, 10)).withTimestamp(1); for (int j = 0; j < 100; j++) builder.newRow("" + j).add("val", ByteBuffer.allocate(1000)); writer.append(builder.build().unfilteredIterator()); @@ -107,7 +107,7 @@ public class SSTableWriterTest extends SSTableWriterTestBase { for (int i = 0; i < 10000; i++) { - UpdateBuilder builder = UpdateBuilder.create(cfs.metadata, random(i, 10)).withTimestamp(1); + UpdateBuilder builder = UpdateBuilder.create(cfs.metadata(), random(i, 10)).withTimestamp(1); for (int j = 0; j < 100; j++) builder.newRow("" + j).add("val", ByteBuffer.allocate(1000)); writer.append(builder.build().unfilteredIterator()); @@ -116,7 +116,7 @@ public class SSTableWriterTest extends SSTableWriterTestBase assertFileCounts(dir.list()); for (int i = 10000; i < 20000; i++) { - UpdateBuilder builder = UpdateBuilder.create(cfs.metadata, random(i, 10)).withTimestamp(1); + UpdateBuilder builder = UpdateBuilder.create(cfs.metadata(), random(i, 10)).withTimestamp(1); for (int j = 0; j < 100; j++) builder.newRow("" + j).add("val", ByteBuffer.allocate(1000)); writer.append(builder.build().unfilteredIterator()); @@ -158,7 +158,7 @@ public class SSTableWriterTest extends SSTableWriterTestBase { for (int i = 0; i < 10000; i++) { - UpdateBuilder builder = UpdateBuilder.create(cfs.metadata, random(i, 10)).withTimestamp(1); + UpdateBuilder builder = UpdateBuilder.create(cfs.metadata(), random(i, 10)).withTimestamp(1); for (int j = 0; j < 100; j++) builder.newRow("" + j).add("val", ByteBuffer.allocate(1000)); writer1.append(builder.build().unfilteredIterator()); @@ -167,7 +167,7 @@ public class SSTableWriterTest extends SSTableWriterTestBase assertFileCounts(dir.list()); for (int i = 10000; i < 20000; i++) { - UpdateBuilder builder = UpdateBuilder.create(cfs.metadata, random(i, 10)).withTimestamp(1); + UpdateBuilder builder = UpdateBuilder.create(cfs.metadata(), random(i, 10)).withTimestamp(1); for (int j = 0; j < 100; j++) builder.newRow("" + j).add("val", ByteBuffer.allocate(1000)); writer2.append(builder.build().unfilteredIterator()); @@ -212,7 +212,7 @@ public class SSTableWriterTest extends SSTableWriterTestBase try (SSTableWriter writer1 = getWriter(cfs, dir, txn)) { - UpdateBuilder largeValue = UpdateBuilder.create(cfs.metadata, "large_value").withTimestamp(1); + UpdateBuilder largeValue = UpdateBuilder.create(cfs.metadata(), "large_value").withTimestamp(1); largeValue.newRow("clustering").add("val", ByteBuffer.allocate(2 * 1024 * 1024)); writer1.append(largeValue.build().unfilteredIterator()); @@ -223,7 +223,7 @@ public class SSTableWriterTest extends SSTableWriterTestBase try { DecoratedKey dk = Util.dk("large_value"); - UnfilteredRowIterator rowIter = sstable.iterator(dk, Slices.ALL, ColumnFilter.all(cfs.metadata), false); + UnfilteredRowIterator rowIter = sstable.iterator(dk, Slices.ALL, ColumnFilter.all(cfs.metadata()), false); while (rowIter.hasNext()) { rowIter.next(); http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/test/unit/org/apache/cassandra/io/sstable/SSTableWriterTestBase.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableWriterTestBase.java b/test/unit/org/apache/cassandra/io/sstable/SSTableWriterTestBase.java index c1f11b6..cc92b2c 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableWriterTestBase.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableWriterTestBase.java @@ -164,7 +164,7 @@ public class SSTableWriterTestBase extends SchemaLoader public static SSTableWriter getWriter(ColumnFamilyStore cfs, File directory, LifecycleTransaction txn) { Descriptor desc = cfs.newSSTableDescriptor(directory); - return SSTableWriter.create(desc, 0, 0, new SerializationHeader(true, cfs.metadata, cfs.metadata.partitionColumns(), EncodingStats.NO_STATS), cfs.indexManager.listIndexes(), txn); + return SSTableWriter.create(desc, 0, 0, new SerializationHeader(true, cfs.metadata(), cfs.metadata().regularAndStaticColumns(), EncodingStats.NO_STATS), cfs.indexManager.listIndexes(), txn); } public static ByteBuffer random(int i, int size) http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/test/unit/org/apache/cassandra/io/sstable/format/SSTableFlushObserverTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/io/sstable/format/SSTableFlushObserverTest.java b/test/unit/org/apache/cassandra/io/sstable/format/SSTableFlushObserverTest.java index 505d45d..18defdf 100644 --- a/test/unit/org/apache/cassandra/io/sstable/format/SSTableFlushObserverTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/format/SSTableFlushObserverTest.java @@ -25,8 +25,8 @@ import java.util.Collection; import java.util.Collections; import java.util.Iterator; -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.config.ColumnDefinition; +import org.apache.cassandra.schema.TableMetadata; +import org.apache.cassandra.schema.ColumnMetadata; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.Clustering; import org.apache.cassandra.db.DecoratedKey; @@ -45,6 +45,7 @@ import org.apache.cassandra.io.sstable.format.big.BigTableWriter; import org.apache.cassandra.io.sstable.metadata.MetadataCollector; import org.apache.cassandra.io.util.FileDataInput; import org.apache.cassandra.io.util.FileUtils; +import org.apache.cassandra.schema.TableMetadataRef; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.Pair; @@ -70,12 +71,13 @@ public class SSTableFlushObserverTest @Test public void testFlushObserver() { - CFMetaData cfm = CFMetaData.Builder.create(KS_NAME, CF_NAME) - .addPartitionKey("id", UTF8Type.instance) - .addRegularColumn("first_name", UTF8Type.instance) - .addRegularColumn("age", Int32Type.instance) - .addRegularColumn("height", LongType.instance) - .build(); + TableMetadata cfm = + TableMetadata.builder(KS_NAME, CF_NAME) + .addPartitionKeyColumn("id", UTF8Type.instance) + .addRegularColumn("first_name", UTF8Type.instance) + .addRegularColumn("age", Int32Type.instance) + .addRegularColumn("height", LongType.instance) + .build(); LifecycleTransaction transaction = LifecycleTransaction.offline(OperationType.COMPACTION); FlushObserver observer = new FlushObserver(); @@ -94,9 +96,9 @@ public class SSTableFlushObserverTest KS_NAME, CF_NAME, 0, sstableFormat), - 10L, 0L, cfm, + 10L, 0L, TableMetadataRef.forOfflineTools(cfm), new MetadataCollector(cfm.comparator).sstableLevel(0), - new SerializationHeader(true, cfm, cfm.partitionColumns(), EncodingStats.NO_STATS), + new SerializationHeader(true, cfm, cfm.regularAndStaticColumns(), EncodingStats.NO_STATS), Collections.singletonList(observer), transaction); @@ -161,12 +163,12 @@ public class SSTableFlushObserverTest { private final Iterator<Unfiltered> rows; - public RowIterator(CFMetaData cfm, ByteBuffer key, Collection<Unfiltered> content) + public RowIterator(TableMetadata cfm, ByteBuffer key, Collection<Unfiltered> content) { super(cfm, DatabaseDescriptor.getPartitioner().decorateKey(key), DeletionTime.LIVE, - cfm.partitionColumns(), + cfm.regularAndStaticColumns(), BTreeRow.emptyRow(Clustering.STATIC_CLUSTERING), false, EncodingStats.NO_STATS); @@ -219,8 +221,8 @@ public class SSTableFlushObserverTest return rowBuilder.build(); } - private static ColumnDefinition getColumn(CFMetaData cfm, String name) + private static ColumnMetadata getColumn(TableMetadata cfm, String name) { - return cfm.getColumnDefinition(UTF8Type.instance.fromString(name)); + return cfm.getColumn(UTF8Type.instance.fromString(name)); } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/test/unit/org/apache/cassandra/io/sstable/metadata/MetadataSerializerTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/io/sstable/metadata/MetadataSerializerTest.java b/test/unit/org/apache/cassandra/io/sstable/metadata/MetadataSerializerTest.java index 79249b6..b03f275 100644 --- a/test/unit/org/apache/cassandra/io/sstable/metadata/MetadataSerializerTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/metadata/MetadataSerializerTest.java @@ -15,7 +15,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.apache.cassandra.io.sstable.metadata; import java.io.File; @@ -29,7 +28,7 @@ import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; -import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.schema.TableMetadata; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.SerializationHeader; import org.apache.cassandra.db.commitlog.CommitLogPosition; @@ -91,7 +90,7 @@ public class MetadataSerializerTest CommitLogPosition club = new CommitLogPosition(11L, 12); CommitLogPosition cllb = new CommitLogPosition(9L, 12); - CFMetaData cfm = SchemaLoader.standardCFMD("ks1", "cf1"); + TableMetadata cfm = SchemaLoader.standardCFMD("ks1", "cf1").build(); MetadataCollector collector = new MetadataCollector(cfm.comparator) .commitLogIntervals(new IntervalSet<>(cllb, club)); http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/test/unit/org/apache/cassandra/locator/ReplicationStrategyEndpointCacheTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/locator/ReplicationStrategyEndpointCacheTest.java b/test/unit/org/apache/cassandra/locator/ReplicationStrategyEndpointCacheTest.java index c811811..b83194b 100644 --- a/test/unit/org/apache/cassandra/locator/ReplicationStrategyEndpointCacheTest.java +++ b/test/unit/org/apache/cassandra/locator/ReplicationStrategyEndpointCacheTest.java @@ -45,8 +45,7 @@ public class ReplicationStrategyEndpointCacheTest public static void defineSchema() throws Exception { SchemaLoader.prepareServer(); - SchemaLoader.createKeyspace(KEYSPACE, - KeyspaceParams.simple(5)); + SchemaLoader.createKeyspace(KEYSPACE, KeyspaceParams.simple(5)); } public void setup(Class stratClass, Map<String, String> strategyOptions) throws Exception http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/test/unit/org/apache/cassandra/locator/SimpleStrategyTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/locator/SimpleStrategyTest.java b/test/unit/org/apache/cassandra/locator/SimpleStrategyTest.java index 0955985..f97a6e5 100644 --- a/test/unit/org/apache/cassandra/locator/SimpleStrategyTest.java +++ b/test/unit/org/apache/cassandra/locator/SimpleStrategyTest.java @@ -28,7 +28,7 @@ import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; -import org.apache.cassandra.config.Schema; +import org.apache.cassandra.schema.Schema; import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.dht.OrderPreservingPartitioner; @@ -181,7 +181,7 @@ public class SimpleStrategyTest private AbstractReplicationStrategy getStrategy(String keyspaceName, TokenMetadata tmd) { - KeyspaceMetadata ksmd = Schema.instance.getKSMetaData(keyspaceName); + KeyspaceMetadata ksmd = Schema.instance.getKeyspaceMetadata(keyspaceName); return AbstractReplicationStrategy.createReplicationStrategy( keyspaceName, ksmd.params.replication.klass, http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/test/unit/org/apache/cassandra/metrics/BatchMetricsTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/metrics/BatchMetricsTest.java b/test/unit/org/apache/cassandra/metrics/BatchMetricsTest.java index 60ee725..968480b 100644 --- a/test/unit/org/apache/cassandra/metrics/BatchMetricsTest.java +++ b/test/unit/org/apache/cassandra/metrics/BatchMetricsTest.java @@ -31,8 +31,8 @@ import com.datastax.driver.core.Session; import org.apache.cassandra.OrderedJUnit4ClassRunner; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.config.DatabaseDescriptor; -import org.apache.cassandra.config.Schema; import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.schema.Schema; import org.apache.cassandra.service.EmbeddedCassandraService; import static junit.framework.Assert.assertEquals; http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/test/unit/org/apache/cassandra/metrics/CQLMetricsTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/metrics/CQLMetricsTest.java b/test/unit/org/apache/cassandra/metrics/CQLMetricsTest.java index 099a530..e186998 100644 --- a/test/unit/org/apache/cassandra/metrics/CQLMetricsTest.java +++ b/test/unit/org/apache/cassandra/metrics/CQLMetricsTest.java @@ -30,7 +30,7 @@ import com.datastax.driver.core.Session; import org.apache.cassandra.OrderedJUnit4ClassRunner; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.config.DatabaseDescriptor; -import org.apache.cassandra.config.Schema; +import org.apache.cassandra.schema.Schema; import org.apache.cassandra.cql3.QueryProcessor; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.service.EmbeddedCassandraService; http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/test/unit/org/apache/cassandra/net/WriteCallbackInfoTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/net/WriteCallbackInfoTest.java b/test/unit/org/apache/cassandra/net/WriteCallbackInfoTest.java index 70e5add..d3257d7 100644 --- a/test/unit/org/apache/cassandra/net/WriteCallbackInfoTest.java +++ b/test/unit/org/apache/cassandra/net/WriteCallbackInfoTest.java @@ -25,15 +25,15 @@ import org.junit.BeforeClass; import org.junit.Test; import junit.framework.Assert; -import org.apache.cassandra.MockSchema; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.BufferDecoratedKey; import org.apache.cassandra.db.ConsistencyLevel; import org.apache.cassandra.db.Mutation; -import org.apache.cassandra.db.PartitionColumns; +import org.apache.cassandra.db.RegularAndStaticColumns; import org.apache.cassandra.db.partitions.PartitionUpdate; import org.apache.cassandra.dht.Murmur3Partitioner; import org.apache.cassandra.net.MessagingService.Verb; +import org.apache.cassandra.schema.MockSchema; import org.apache.cassandra.service.paxos.Commit; import org.apache.cassandra.utils.ByteBufferUtil; @@ -60,7 +60,7 @@ public class WriteCallbackInfoTest private void testShouldHint(Verb verb, ConsistencyLevel cl, boolean allowHints, boolean expectHint) throws Exception { Object payload = verb == Verb.PAXOS_COMMIT - ? new Commit(UUID.randomUUID(), new PartitionUpdate(MockSchema.newCFMetaData("", ""), ByteBufferUtil.EMPTY_BYTE_BUFFER, PartitionColumns.NONE, 1)) + ? new Commit(UUID.randomUUID(), new PartitionUpdate(MockSchema.newTableMetadata("", ""), ByteBufferUtil.EMPTY_BYTE_BUFFER, RegularAndStaticColumns.NONE, 1)) : new Mutation("", new BufferDecoratedKey(new Murmur3Partitioner.LongToken(0), ByteBufferUtil.EMPTY_BYTE_BUFFER)); WriteCallbackInfo wcbi = new WriteCallbackInfo(InetAddress.getByName("192.168.1.1"), null, new MessageOut(verb, payload, null), null, cl, allowHints); http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/test/unit/org/apache/cassandra/repair/ValidatorTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/repair/ValidatorTest.java b/test/unit/org/apache/cassandra/repair/ValidatorTest.java index 9c32cef..c514d7c 100644 --- a/test/unit/org/apache/cassandra/repair/ValidatorTest.java +++ b/test/unit/org/apache/cassandra/repair/ValidatorTest.java @@ -26,9 +26,6 @@ import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; -import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.SettableFuture; - import org.apache.cassandra.db.compaction.CompactionManager; import org.apache.cassandra.db.compaction.CompactionsTest; import org.apache.cassandra.io.sstable.format.SSTableReader; @@ -37,7 +34,7 @@ import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; -import org.apache.cassandra.config.Schema; +import org.apache.cassandra.schema.Schema; import org.apache.cassandra.db.BufferDecoratedKey; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.EmptyIterators; @@ -80,7 +77,7 @@ public class ValidatorTest SchemaLoader.createKeyspace(keyspace, KeyspaceParams.simple(1), SchemaLoader.standardCFMD(keyspace, columnFamily)); - partitioner = Schema.instance.getCFMetaData(keyspace, columnFamily).partitioner; + partitioner = Schema.instance.getTableMetadata(keyspace, columnFamily).partitioner; } @After @@ -111,7 +108,7 @@ public class ValidatorTest // add a row Token mid = partitioner.midpoint(range.left, range.right); - validator.add(EmptyIterators.unfilteredRow(cfs.metadata, new BufferDecoratedKey(mid, ByteBufferUtil.bytes("inconceivable!")), false)); + validator.add(EmptyIterators.unfilteredRow(cfs.metadata(), new BufferDecoratedKey(mid, ByteBufferUtil.bytes("inconceivable!")), false)); validator.complete(); // confirm that the tree was validated http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/test/unit/org/apache/cassandra/repair/messages/RepairMessageSerializationsTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/repair/messages/RepairMessageSerializationsTest.java b/test/unit/org/apache/cassandra/repair/messages/RepairMessageSerializationsTest.java index 028d899..3924045 100644 --- a/test/unit/org/apache/cassandra/repair/messages/RepairMessageSerializationsTest.java +++ b/test/unit/org/apache/cassandra/repair/messages/RepairMessageSerializationsTest.java @@ -44,6 +44,7 @@ import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.repair.NodePair; import org.apache.cassandra.repair.RepairJobDesc; +import org.apache.cassandra.schema.TableId; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.MerkleTrees; @@ -167,7 +168,7 @@ public class RepairMessageSerializationsTest @Test public void prepareMessage() throws IOException { - PrepareMessage msg = new PrepareMessage(UUID.randomUUID(), new ArrayList<UUID>() {{add(UUID.randomUUID());}}, + PrepareMessage msg = new PrepareMessage(UUID.randomUUID(), new ArrayList<TableId>() {{add(TableId.generate());}}, buildTokenRanges(), true, 100000L, false); serializeRoundTrip(msg, PrepareMessage.serializer); } http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/test/unit/org/apache/cassandra/schema/DefsTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/schema/DefsTest.java b/test/unit/org/apache/cassandra/schema/DefsTest.java deleted file mode 100644 index d4ac1dc..0000000 --- a/test/unit/org/apache/cassandra/schema/DefsTest.java +++ /dev/null @@ -1,545 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.cassandra.schema; - -import java.io.File; -import java.nio.ByteBuffer; -import java.util.HashMap; -import java.util.Map; -import java.util.function.Supplier; - -import com.google.common.collect.ImmutableMap; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; - -import org.apache.cassandra.OrderedJUnit4ClassRunner; -import org.apache.cassandra.SchemaLoader; -import org.apache.cassandra.Util; -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.config.ColumnDefinition; -import org.apache.cassandra.config.Schema; -import org.apache.cassandra.cql3.QueryProcessor; -import org.apache.cassandra.cql3.UntypedResultSet; -import org.apache.cassandra.db.ColumnFamilyStore; -import org.apache.cassandra.db.Directories; -import org.apache.cassandra.db.Keyspace; -import org.apache.cassandra.db.lifecycle.LifecycleTransaction; -import org.apache.cassandra.db.marshal.BytesType; -import org.apache.cassandra.db.marshal.UTF8Type; -import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.io.sstable.Component; -import org.apache.cassandra.io.sstable.Descriptor; -import org.apache.cassandra.locator.OldNetworkTopologyStrategy; -import org.apache.cassandra.service.MigrationManager; -import org.apache.cassandra.utils.FBUtilities; - -import static org.apache.cassandra.Util.throwAssert; -import static org.apache.cassandra.cql3.CQLTester.assertRows; -import static org.apache.cassandra.cql3.CQLTester.row; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - - -@RunWith(OrderedJUnit4ClassRunner.class) -public class DefsTest -{ - private static final String KEYSPACE1 = "keyspace1"; - private static final String KEYSPACE3 = "keyspace3"; - private static final String KEYSPACE6 = "keyspace6"; - private static final String EMPTY_KEYSPACE = "test_empty_keyspace"; - private static final String TABLE1 = "standard1"; - private static final String TABLE2 = "standard2"; - private static final String TABLE1i = "indexed1"; - - @BeforeClass - public static void defineSchema() throws ConfigurationException - { - SchemaLoader.prepareServer(); - SchemaLoader.startGossiper(); - SchemaLoader.createKeyspace(KEYSPACE1, - KeyspaceParams.simple(1), - SchemaLoader.standardCFMD(KEYSPACE1, TABLE1), - SchemaLoader.standardCFMD(KEYSPACE1, TABLE2)); - SchemaLoader.createKeyspace(KEYSPACE3, - KeyspaceParams.simple(5), - SchemaLoader.standardCFMD(KEYSPACE1, TABLE1), - SchemaLoader.compositeIndexCFMD(KEYSPACE3, TABLE1i, true)); - SchemaLoader.createKeyspace(KEYSPACE6, - KeyspaceParams.simple(1), - SchemaLoader.compositeIndexCFMD(KEYSPACE6, TABLE1i, true)); - } - - @Test - public void testCFMetaDataApply() throws ConfigurationException - { - CFMetaData cfm = CFMetaData.Builder.create(KEYSPACE1, "TestApplyCFM_CF") - .addPartitionKey("keys", BytesType.instance) - .addClusteringColumn("col", BytesType.instance).build(); - - - for (int i = 0; i < 5; i++) - { - ByteBuffer name = ByteBuffer.wrap(new byte[] { (byte)i }); - cfm.addColumnDefinition(ColumnDefinition.regularDef(cfm, name, BytesType.instance)); - } - - cfm.comment("No comment") - .readRepairChance(0.5) - .gcGraceSeconds(100000) - .compaction(CompactionParams.scts(ImmutableMap.of("min_threshold", "500", - "max_threshold", "500"))); - - // we'll be adding this one later. make sure it's not already there. - assertNull(cfm.getColumnDefinition(ByteBuffer.wrap(new byte[]{ 5 }))); - - CFMetaData cfNew = cfm.copy(); - - // add one. - ColumnDefinition addIndexDef = ColumnDefinition.regularDef(cfm, ByteBuffer.wrap(new byte[] { 5 }), BytesType.instance); - cfNew.addColumnDefinition(addIndexDef); - - // remove one. - ColumnDefinition removeIndexDef = ColumnDefinition.regularDef(cfm, ByteBuffer.wrap(new byte[] { 0 }), BytesType.instance); - assertTrue(cfNew.removeColumnDefinition(removeIndexDef)); - - cfm.apply(cfNew); - - for (int i = 1; i < cfm.allColumns().size(); i++) - assertNotNull(cfm.getColumnDefinition(ByteBuffer.wrap(new byte[]{ 1 }))); - assertNull(cfm.getColumnDefinition(ByteBuffer.wrap(new byte[]{ 0 }))); - assertNotNull(cfm.getColumnDefinition(ByteBuffer.wrap(new byte[]{ 5 }))); - } - - @Test - public void testInvalidNames() - { - String[] valid = {"1", "a", "_1", "b_", "__", "1_a"}; - for (String s : valid) - assertTrue(CFMetaData.isNameValid(s)); - - String[] invalid = {"b@t", "dash-y", "", " ", "dot.s", ".hidden"}; - for (String s : invalid) - assertFalse(CFMetaData.isNameValid(s)); - } - - @Test - public void addNewCfToBogusKeyspace() - { - CFMetaData newCf = addTestTable("MadeUpKeyspace", "NewCF", "new cf"); - try - { - MigrationManager.announceNewColumnFamily(newCf); - throw new AssertionError("You shouldn't be able to do anything to a keyspace that doesn't exist."); - } - catch (ConfigurationException expected) - { - } - } - - @Test - public void addNewTable() throws ConfigurationException - { - final String ksName = KEYSPACE1; - final String tableName = "anewtable"; - KeyspaceMetadata original = Schema.instance.getKSMetaData(ksName); - - CFMetaData cfm = addTestTable(original.name, tableName, "A New Table"); - - assertFalse(Schema.instance.getKSMetaData(ksName).tables.get(cfm.cfName).isPresent()); - MigrationManager.announceNewColumnFamily(cfm); - - assertTrue(Schema.instance.getKSMetaData(ksName).tables.get(cfm.cfName).isPresent()); - assertEquals(cfm, Schema.instance.getKSMetaData(ksName).tables.get(cfm.cfName).get()); - - // now read and write to it. - QueryProcessor.executeInternal(String.format("INSERT INTO %s.%s (key, col, val) VALUES (?, ?, ?)", - ksName, tableName), - "key0", "col0", "val0"); - - // flush to exercise more than just hitting the memtable - ColumnFamilyStore cfs = Keyspace.open(ksName).getColumnFamilyStore(tableName); - assertNotNull(cfs); - cfs.forceBlockingFlush(); - - // and make sure we get out what we put in - UntypedResultSet rows = QueryProcessor.executeInternal(String.format("SELECT * FROM %s.%s", ksName, tableName)); - assertRows(rows, row("key0", "col0", "val0")); - } - - @Test - public void dropCf() throws ConfigurationException - { - // sanity - final KeyspaceMetadata ks = Schema.instance.getKSMetaData(KEYSPACE1); - assertNotNull(ks); - final CFMetaData cfm = ks.tables.getNullable(TABLE1); - assertNotNull(cfm); - - // write some data, force a flush, then verify that files exist on disk. - for (int i = 0; i < 100; i++) - QueryProcessor.executeInternal(String.format("INSERT INTO %s.%s (key, name, val) VALUES (?, ?, ?)", - KEYSPACE1, TABLE1), - "dropCf", "col" + i, "anyvalue"); - ColumnFamilyStore store = Keyspace.open(cfm.ksName).getColumnFamilyStore(cfm.cfName); - assertNotNull(store); - store.forceBlockingFlush(); - assertTrue(store.getDirectories().sstableLister(Directories.OnTxnErr.THROW).list().size() > 0); - - MigrationManager.announceColumnFamilyDrop(ks.name, cfm.cfName); - - assertFalse(Schema.instance.getKSMetaData(ks.name).tables.get(cfm.cfName).isPresent()); - - // any write should fail. - boolean success = true; - try - { - QueryProcessor.executeInternal(String.format("INSERT INTO %s.%s (key, name, val) VALUES (?, ?, ?)", - KEYSPACE1, TABLE1), - "dropCf", "col0", "anyvalue"); - } - catch (Throwable th) - { - success = false; - } - assertFalse("This mutation should have failed since the CF no longer exists.", success); - - // verify that the files are gone. - Supplier<Object> lambda = () -> { - for (File file : store.getDirectories().sstableLister(Directories.OnTxnErr.THROW).listFiles()) - { - if (file.getPath().endsWith("Data.db") && !new File(file.getPath().replace("Data.db", "Compacted")).exists()) - return false; - } - return true; - }; - Util.spinAssertEquals(true, lambda, 30); - - } - - @Test - public void addNewKS() throws ConfigurationException - { - CFMetaData cfm = addTestTable("newkeyspace1", "newstandard1", "A new cf for a new ks"); - KeyspaceMetadata newKs = KeyspaceMetadata.create(cfm.ksName, KeyspaceParams.simple(5), Tables.of(cfm)); - MigrationManager.announceNewKeyspace(newKs); - - assertNotNull(Schema.instance.getKSMetaData(cfm.ksName)); - assertEquals(Schema.instance.getKSMetaData(cfm.ksName), newKs); - - // test reads and writes. - QueryProcessor.executeInternal("INSERT INTO newkeyspace1.newstandard1 (key, col, val) VALUES (?, ?, ?)", - "key0", "col0", "val0"); - ColumnFamilyStore store = Keyspace.open(cfm.ksName).getColumnFamilyStore(cfm.cfName); - assertNotNull(store); - store.forceBlockingFlush(); - - UntypedResultSet rows = QueryProcessor.executeInternal("SELECT * FROM newkeyspace1.newstandard1"); - assertRows(rows, row("key0", "col0", "val0")); - } - - @Test - public void dropKS() throws ConfigurationException - { - // sanity - final KeyspaceMetadata ks = Schema.instance.getKSMetaData(KEYSPACE1); - assertNotNull(ks); - final CFMetaData cfm = ks.tables.getNullable(TABLE2); - assertNotNull(cfm); - - // write some data, force a flush, then verify that files exist on disk. - for (int i = 0; i < 100; i++) - QueryProcessor.executeInternal(String.format("INSERT INTO %s.%s (key, name, val) VALUES (?, ?, ?)", - KEYSPACE1, TABLE2), - "dropKs", "col" + i, "anyvalue"); - ColumnFamilyStore cfs = Keyspace.open(cfm.ksName).getColumnFamilyStore(cfm.cfName); - assertNotNull(cfs); - cfs.forceBlockingFlush(); - assertTrue(!cfs.getDirectories().sstableLister(Directories.OnTxnErr.THROW).list().isEmpty()); - - MigrationManager.announceKeyspaceDrop(ks.name); - - assertNull(Schema.instance.getKSMetaData(ks.name)); - - // write should fail. - boolean success = true; - try - { - QueryProcessor.executeInternal(String.format("INSERT INTO %s.%s (key, name, val) VALUES (?, ?, ?)", - KEYSPACE1, TABLE2), - "dropKs", "col0", "anyvalue"); - } - catch (Throwable th) - { - success = false; - } - assertFalse("This mutation should have failed since the KS no longer exists.", success); - - // reads should fail too. - boolean threw = false; - try - { - Keyspace.open(ks.name); - } - catch (Throwable th) - { - threw = true; - } - assertTrue(threw); - } - - @Test - public void dropKSUnflushed() throws ConfigurationException - { - // sanity - final KeyspaceMetadata ks = Schema.instance.getKSMetaData(KEYSPACE3); - assertNotNull(ks); - final CFMetaData cfm = ks.tables.getNullable(TABLE1); - assertNotNull(cfm); - - // write some data - for (int i = 0; i < 100; i++) - QueryProcessor.executeInternal(String.format("INSERT INTO %s.%s (key, name, val) VALUES (?, ?, ?)", - KEYSPACE3, TABLE1), - "dropKs", "col" + i, "anyvalue"); - - MigrationManager.announceKeyspaceDrop(ks.name); - - assertNull(Schema.instance.getKSMetaData(ks.name)); - } - - @Test - public void createEmptyKsAddNewCf() throws ConfigurationException - { - assertNull(Schema.instance.getKSMetaData(EMPTY_KEYSPACE)); - KeyspaceMetadata newKs = KeyspaceMetadata.create(EMPTY_KEYSPACE, KeyspaceParams.simple(5)); - MigrationManager.announceNewKeyspace(newKs); - assertNotNull(Schema.instance.getKSMetaData(EMPTY_KEYSPACE)); - - String tableName = "added_later"; - CFMetaData newCf = addTestTable(EMPTY_KEYSPACE, tableName, "A new CF to add to an empty KS"); - - //should not exist until apply - assertFalse(Schema.instance.getKSMetaData(newKs.name).tables.get(newCf.cfName).isPresent()); - - //add the new CF to the empty space - MigrationManager.announceNewColumnFamily(newCf); - - assertTrue(Schema.instance.getKSMetaData(newKs.name).tables.get(newCf.cfName).isPresent()); - assertEquals(Schema.instance.getKSMetaData(newKs.name).tables.get(newCf.cfName).get(), newCf); - - // now read and write to it. - QueryProcessor.executeInternal(String.format("INSERT INTO %s.%s (key, col, val) VALUES (?, ?, ?)", - EMPTY_KEYSPACE, tableName), - "key0", "col0", "val0"); - - ColumnFamilyStore cfs = Keyspace.open(newKs.name).getColumnFamilyStore(newCf.cfName); - assertNotNull(cfs); - cfs.forceBlockingFlush(); - - UntypedResultSet rows = QueryProcessor.executeInternal(String.format("SELECT * FROM %s.%s", EMPTY_KEYSPACE, tableName)); - assertRows(rows, row("key0", "col0", "val0")); - } - - @Test - public void testUpdateKeyspace() throws ConfigurationException - { - // create a keyspace to serve as existing. - CFMetaData cf = addTestTable("UpdatedKeyspace", "AddedStandard1", "A new cf for a new ks"); - KeyspaceMetadata oldKs = KeyspaceMetadata.create(cf.ksName, KeyspaceParams.simple(5), Tables.of(cf)); - - MigrationManager.announceNewKeyspace(oldKs); - - assertNotNull(Schema.instance.getKSMetaData(cf.ksName)); - assertEquals(Schema.instance.getKSMetaData(cf.ksName), oldKs); - - // names should match. - KeyspaceMetadata newBadKs2 = KeyspaceMetadata.create(cf.ksName + "trash", KeyspaceParams.simple(4)); - try - { - MigrationManager.announceKeyspaceUpdate(newBadKs2); - throw new AssertionError("Should not have been able to update a KS with an invalid KS name."); - } - catch (ConfigurationException ex) - { - // expected. - } - - Map<String, String> replicationMap = new HashMap<>(); - replicationMap.put(ReplicationParams.CLASS, OldNetworkTopologyStrategy.class.getName()); - replicationMap.put("replication_factor", "1"); - - KeyspaceMetadata newKs = KeyspaceMetadata.create(cf.ksName, KeyspaceParams.create(true, replicationMap)); - MigrationManager.announceKeyspaceUpdate(newKs); - - KeyspaceMetadata newFetchedKs = Schema.instance.getKSMetaData(newKs.name); - assertEquals(newFetchedKs.params.replication.klass, newKs.params.replication.klass); - assertFalse(newFetchedKs.params.replication.klass.equals(oldKs.params.replication.klass)); - } - - /* - @Test - public void testUpdateColumnFamilyNoIndexes() throws ConfigurationException - { - // create a keyspace with a cf to update. - CFMetaData cf = addTestTable("UpdatedCfKs", "Standard1added", "A new cf that will be updated"); - KSMetaData ksm = KSMetaData.testMetadata(cf.ksName, SimpleStrategy.class, KSMetaData.optsWithRF(1), cf); - MigrationManager.announceNewKeyspace(ksm); - - assertNotNull(Schema.instance.getKSMetaData(cf.ksName)); - assertEquals(Schema.instance.getKSMetaData(cf.ksName), ksm); - assertNotNull(Schema.instance.getCFMetaData(cf.ksName, cf.cfName)); - - // updating certain fields should fail. - CFMetaData newCfm = cf.copy(); - newCfm.defaultValidator(BytesType.instance); - newCfm.minCompactionThreshold(5); - newCfm.maxCompactionThreshold(31); - - // test valid operations. - newCfm.comment("Modified comment"); - MigrationManager.announceColumnFamilyUpdate(newCfm); // doesn't get set back here. - - newCfm.readRepairChance(0.23); - MigrationManager.announceColumnFamilyUpdate(newCfm); - - newCfm.gcGraceSeconds(12); - MigrationManager.announceColumnFamilyUpdate(newCfm); - - newCfm.defaultValidator(UTF8Type.instance); - MigrationManager.announceColumnFamilyUpdate(newCfm); - - newCfm.minCompactionThreshold(3); - MigrationManager.announceColumnFamilyUpdate(newCfm); - - newCfm.maxCompactionThreshold(33); - MigrationManager.announceColumnFamilyUpdate(newCfm); - - // can't test changing the reconciler because there is only one impl. - - // check the cumulative affect. - assertEquals(Schema.instance.getCFMetaData(cf.ksName, cf.cfName).getComment(), newCfm.getComment()); - assertEquals(Schema.instance.getCFMetaData(cf.ksName, cf.cfName).getReadRepairChance(), newCfm.getReadRepairChance(), 0.0001); - assertEquals(Schema.instance.getCFMetaData(cf.ksName, cf.cfName).getGcGraceSeconds(), newCfm.getGcGraceSeconds()); - assertEquals(UTF8Type.instance, Schema.instance.getCFMetaData(cf.ksName, cf.cfName).getDefaultValidator()); - - // Change cfId - newCfm = new CFMetaData(cf.ksName, cf.cfName, cf.cfType, cf.comparator); - CFMetaData.copyOpts(newCfm, cf); - try - { - cf.apply(newCfm); - throw new AssertionError("Should have blown up when you used a different id."); - } - catch (ConfigurationException expected) {} - - // Change cfName - newCfm = new CFMetaData(cf.ksName, cf.cfName + "_renamed", cf.cfType, cf.comparator); - CFMetaData.copyOpts(newCfm, cf); - try - { - cf.apply(newCfm); - throw new AssertionError("Should have blown up when you used a different name."); - } - catch (ConfigurationException expected) {} - - // Change ksName - newCfm = new CFMetaData(cf.ksName + "_renamed", cf.cfName, cf.cfType, cf.comparator); - CFMetaData.copyOpts(newCfm, cf); - try - { - cf.apply(newCfm); - throw new AssertionError("Should have blown up when you used a different keyspace."); - } - catch (ConfigurationException expected) {} - - // Change cf type - newCfm = new CFMetaData(cf.ksName, cf.cfName, ColumnFamilyType.Super, cf.comparator); - CFMetaData.copyOpts(newCfm, cf); - try - { - cf.apply(newCfm); - throw new AssertionError("Should have blwon up when you used a different cf type."); - } - catch (ConfigurationException expected) {} - - // Change comparator - newCfm = new CFMetaData(cf.ksName, cf.cfName, cf.cfType, new SimpleDenseCellNameType(TimeUUIDType.instance)); - CFMetaData.copyOpts(newCfm, cf); - try - { - cf.apply(newCfm); - throw new AssertionError("Should have blown up when you used a different comparator."); - } - catch (ConfigurationException expected) {} - } - */ - - @Test - public void testDropIndex() throws ConfigurationException - { - // persist keyspace definition in the system keyspace - SchemaKeyspace.makeCreateKeyspaceMutation(Schema.instance.getKSMetaData(KEYSPACE6), FBUtilities.timestampMicros()).build().applyUnsafe(); - ColumnFamilyStore cfs = Keyspace.open(KEYSPACE6).getColumnFamilyStore(TABLE1i); - String indexName = "birthdate_key_index"; - - // insert some data. save the sstable descriptor so we can make sure it's marked for delete after the drop - QueryProcessor.executeInternal(String.format( - "INSERT INTO %s.%s (key, c1, birthdate, notbirthdate) VALUES (?, ?, ?, ?)", - KEYSPACE6, - TABLE1i), - "key0", "col0", 1L, 1L); - - cfs.forceBlockingFlush(); - ColumnFamilyStore indexCfs = cfs.indexManager.getIndexByName(indexName) - .getBackingTable() - .orElseThrow(throwAssert("Cannot access index cfs")); - Descriptor desc = indexCfs.getLiveSSTables().iterator().next().descriptor; - - // drop the index - CFMetaData meta = cfs.metadata.copy(); - IndexMetadata existing = cfs.metadata.getIndexes() - .get(indexName) - .orElseThrow(throwAssert("Index not found")); - - meta.indexes(meta.getIndexes().without(existing.name)); - MigrationManager.announceColumnFamilyUpdate(meta); - - // check - assertTrue(cfs.indexManager.listIndexes().isEmpty()); - LifecycleTransaction.waitForDeletions(); - assertFalse(new File(desc.filenameFor(Component.DATA)).exists()); - } - - private CFMetaData addTestTable(String ks, String cf, String comment) - { - CFMetaData newCFMD = CFMetaData.Builder.create(ks, cf) - .addPartitionKey("key", UTF8Type.instance) - .addClusteringColumn("col", UTF8Type.instance) - .addRegularColumn("val", UTF8Type.instance).build(); - - newCFMD.comment(comment) - .readRepairChance(0.0); - - return newCFMD; - } -} http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/test/unit/org/apache/cassandra/schema/MigrationManagerTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/schema/MigrationManagerTest.java b/test/unit/org/apache/cassandra/schema/MigrationManagerTest.java new file mode 100644 index 0000000..07640c3 --- /dev/null +++ b/test/unit/org/apache/cassandra/schema/MigrationManagerTest.java @@ -0,0 +1,539 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.cassandra.schema; + +import java.io.File; +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Supplier; + +import com.google.common.collect.ImmutableMap; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.apache.cassandra.OrderedJUnit4ClassRunner; +import org.apache.cassandra.SchemaLoader; +import org.apache.cassandra.Util; +import org.apache.cassandra.cql3.ColumnIdentifier; +import org.apache.cassandra.cql3.QueryProcessor; +import org.apache.cassandra.cql3.UntypedResultSet; +import org.apache.cassandra.db.ColumnFamilyStore; +import org.apache.cassandra.db.Directories; +import org.apache.cassandra.db.Keyspace; +import org.apache.cassandra.db.lifecycle.LifecycleTransaction; +import org.apache.cassandra.db.marshal.ByteType; +import org.apache.cassandra.db.marshal.BytesType; +import org.apache.cassandra.db.marshal.UTF8Type; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.io.sstable.Component; +import org.apache.cassandra.io.sstable.Descriptor; +import org.apache.cassandra.locator.OldNetworkTopologyStrategy; +import org.apache.cassandra.utils.FBUtilities; + +import static org.apache.cassandra.Util.throwAssert; +import static org.apache.cassandra.cql3.CQLTester.assertRows; +import static org.apache.cassandra.cql3.CQLTester.row; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + + +@RunWith(OrderedJUnit4ClassRunner.class) +public class MigrationManagerTest +{ + private static final String KEYSPACE1 = "keyspace1"; + private static final String KEYSPACE3 = "keyspace3"; + private static final String KEYSPACE6 = "keyspace6"; + private static final String EMPTY_KEYSPACE = "test_empty_keyspace"; + private static final String TABLE1 = "standard1"; + private static final String TABLE2 = "standard2"; + private static final String TABLE1i = "indexed1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.startGossiper(); + SchemaLoader.createKeyspace(KEYSPACE1, + KeyspaceParams.simple(1), + SchemaLoader.standardCFMD(KEYSPACE1, TABLE1), + SchemaLoader.standardCFMD(KEYSPACE1, TABLE2)); + SchemaLoader.createKeyspace(KEYSPACE3, + KeyspaceParams.simple(5), + SchemaLoader.standardCFMD(KEYSPACE1, TABLE1), + SchemaLoader.compositeIndexCFMD(KEYSPACE3, TABLE1i, true)); + SchemaLoader.createKeyspace(KEYSPACE6, + KeyspaceParams.simple(1), + SchemaLoader.compositeIndexCFMD(KEYSPACE6, TABLE1i, true)); + } + + @Test + public void testTableMetadataBuilder() throws ConfigurationException + { + TableMetadata.Builder builder = + TableMetadata.builder(KEYSPACE1, "TestApplyCFM_CF") + .addPartitionKeyColumn("keys", BytesType.instance) + .addClusteringColumn("col", BytesType.instance) + .comment("No comment") + .readRepairChance(0.5) + .gcGraceSeconds(100000) + .compaction(CompactionParams.scts(ImmutableMap.of("min_threshold", "500", "max_threshold", "500"))); + + for (int i = 0; i < 5; i++) + { + ByteBuffer name = ByteBuffer.wrap(new byte[] { (byte)i }); + builder.addRegularColumn(ColumnIdentifier.getInterned(name, BytesType.instance), ByteType.instance); + } + + + TableMetadata table = builder.build(); + // we'll be adding this one later. make sure it's not already there. + assertNull(table.getColumn(ByteBuffer.wrap(new byte[]{ 5 }))); + + // add one. + ColumnMetadata addIndexDef = ColumnMetadata.regularColumn(table, ByteBuffer.wrap(new byte[] { 5 }), BytesType.instance); + builder.addColumn(addIndexDef); + + // remove one. + ColumnMetadata removeIndexDef = ColumnMetadata.regularColumn(table, ByteBuffer.wrap(new byte[] { 0 }), BytesType.instance); + builder.removeRegularOrStaticColumn(removeIndexDef.name); + + TableMetadata table2 = builder.build(); + + for (int i = 1; i < table2.columns().size(); i++) + assertNotNull(table2.getColumn(ByteBuffer.wrap(new byte[]{ 1 }))); + assertNull(table2.getColumn(ByteBuffer.wrap(new byte[]{ 0 }))); + assertNotNull(table2.getColumn(ByteBuffer.wrap(new byte[]{ 5 }))); + } + + @Test + public void testInvalidNames() + { + String[] valid = {"1", "a", "_1", "b_", "__", "1_a"}; + for (String s : valid) + assertTrue(SchemaConstants.isValidName(s)); + + String[] invalid = {"b@t", "dash-y", "", " ", "dot.s", ".hidden"}; + for (String s : invalid) + assertFalse(SchemaConstants.isValidName(s)); + } + + @Test + public void addNewCfToBogusKeyspace() + { + TableMetadata newCf = addTestTable("MadeUpKeyspace", "NewCF", "new cf"); + try + { + MigrationManager.announceNewTable(newCf); + throw new AssertionError("You shouldn't be able to do anything to a keyspace that doesn't exist."); + } + catch (ConfigurationException expected) + { + } + } + + @Test + public void addNewTable() throws ConfigurationException + { + final String ksName = KEYSPACE1; + final String tableName = "anewtable"; + KeyspaceMetadata original = Schema.instance.getKeyspaceMetadata(ksName); + + TableMetadata cfm = addTestTable(original.name, tableName, "A New Table"); + + assertFalse(Schema.instance.getKeyspaceMetadata(ksName).tables.get(cfm.name).isPresent()); + MigrationManager.announceNewTable(cfm); + + assertTrue(Schema.instance.getKeyspaceMetadata(ksName).tables.get(cfm.name).isPresent()); + assertEquals(cfm, Schema.instance.getKeyspaceMetadata(ksName).tables.get(cfm.name).get()); + + // now read and write to it. + QueryProcessor.executeInternal(String.format("INSERT INTO %s.%s (key, col, val) VALUES (?, ?, ?)", + ksName, tableName), + "key0", "col0", "val0"); + + // flush to exercise more than just hitting the memtable + ColumnFamilyStore cfs = Keyspace.open(ksName).getColumnFamilyStore(tableName); + assertNotNull(cfs); + cfs.forceBlockingFlush(); + + // and make sure we get out what we put in + UntypedResultSet rows = QueryProcessor.executeInternal(String.format("SELECT * FROM %s.%s", ksName, tableName)); + assertRows(rows, row("key0", "col0", "val0")); + } + + @Test + public void dropCf() throws ConfigurationException + { + // sanity + final KeyspaceMetadata ks = Schema.instance.getKeyspaceMetadata(KEYSPACE1); + assertNotNull(ks); + final TableMetadata cfm = ks.tables.getNullable(TABLE1); + assertNotNull(cfm); + + // write some data, force a flush, then verify that files exist on disk. + for (int i = 0; i < 100; i++) + QueryProcessor.executeInternal(String.format("INSERT INTO %s.%s (key, name, val) VALUES (?, ?, ?)", + KEYSPACE1, TABLE1), + "dropCf", "col" + i, "anyvalue"); + ColumnFamilyStore store = Keyspace.open(cfm.keyspace).getColumnFamilyStore(cfm.name); + assertNotNull(store); + store.forceBlockingFlush(); + assertTrue(store.getDirectories().sstableLister(Directories.OnTxnErr.THROW).list().size() > 0); + + MigrationManager.announceTableDrop(ks.name, cfm.name); + + assertFalse(Schema.instance.getKeyspaceMetadata(ks.name).tables.get(cfm.name).isPresent()); + + // any write should fail. + boolean success = true; + try + { + QueryProcessor.executeInternal(String.format("INSERT INTO %s.%s (key, name, val) VALUES (?, ?, ?)", + KEYSPACE1, TABLE1), + "dropCf", "col0", "anyvalue"); + } + catch (Throwable th) + { + success = false; + } + assertFalse("This mutation should have failed since the CF no longer exists.", success); + + // verify that the files are gone. + Supplier<Object> lambda = () -> { + for (File file : store.getDirectories().sstableLister(Directories.OnTxnErr.THROW).listFiles()) + { + if (file.getPath().endsWith("Data.db") && !new File(file.getPath().replace("Data.db", "Compacted")).exists()) + return false; + } + return true; + }; + Util.spinAssertEquals(true, lambda, 30); + + } + + @Test + public void addNewKS() throws ConfigurationException + { + TableMetadata cfm = addTestTable("newkeyspace1", "newstandard1", "A new cf for a new ks"); + KeyspaceMetadata newKs = KeyspaceMetadata.create(cfm.keyspace, KeyspaceParams.simple(5), Tables.of(cfm)); + MigrationManager.announceNewKeyspace(newKs); + + assertNotNull(Schema.instance.getKeyspaceMetadata(cfm.keyspace)); + assertEquals(Schema.instance.getKeyspaceMetadata(cfm.keyspace), newKs); + + // test reads and writes. + QueryProcessor.executeInternal("INSERT INTO newkeyspace1.newstandard1 (key, col, val) VALUES (?, ?, ?)", + "key0", "col0", "val0"); + ColumnFamilyStore store = Keyspace.open(cfm.keyspace).getColumnFamilyStore(cfm.name); + assertNotNull(store); + store.forceBlockingFlush(); + + UntypedResultSet rows = QueryProcessor.executeInternal("SELECT * FROM newkeyspace1.newstandard1"); + assertRows(rows, row("key0", "col0", "val0")); + } + + @Test + public void dropKS() throws ConfigurationException + { + // sanity + final KeyspaceMetadata ks = Schema.instance.getKeyspaceMetadata(KEYSPACE1); + assertNotNull(ks); + final TableMetadata cfm = ks.tables.getNullable(TABLE2); + assertNotNull(cfm); + + // write some data, force a flush, then verify that files exist on disk. + for (int i = 0; i < 100; i++) + QueryProcessor.executeInternal(String.format("INSERT INTO %s.%s (key, name, val) VALUES (?, ?, ?)", + KEYSPACE1, TABLE2), + "dropKs", "col" + i, "anyvalue"); + ColumnFamilyStore cfs = Keyspace.open(cfm.keyspace).getColumnFamilyStore(cfm.name); + assertNotNull(cfs); + cfs.forceBlockingFlush(); + assertTrue(!cfs.getDirectories().sstableLister(Directories.OnTxnErr.THROW).list().isEmpty()); + + MigrationManager.announceKeyspaceDrop(ks.name); + + assertNull(Schema.instance.getKeyspaceMetadata(ks.name)); + + // write should fail. + boolean success = true; + try + { + QueryProcessor.executeInternal(String.format("INSERT INTO %s.%s (key, name, val) VALUES (?, ?, ?)", + KEYSPACE1, TABLE2), + "dropKs", "col0", "anyvalue"); + } + catch (Throwable th) + { + success = false; + } + assertFalse("This mutation should have failed since the KS no longer exists.", success); + + // reads should fail too. + boolean threw = false; + try + { + Keyspace.open(ks.name); + } + catch (Throwable th) + { + threw = true; + } + assertTrue(threw); + } + + @Test + public void dropKSUnflushed() throws ConfigurationException + { + // sanity + final KeyspaceMetadata ks = Schema.instance.getKeyspaceMetadata(KEYSPACE3); + assertNotNull(ks); + final TableMetadata cfm = ks.tables.getNullable(TABLE1); + assertNotNull(cfm); + + // write some data + for (int i = 0; i < 100; i++) + QueryProcessor.executeInternal(String.format("INSERT INTO %s.%s (key, name, val) VALUES (?, ?, ?)", + KEYSPACE3, TABLE1), + "dropKs", "col" + i, "anyvalue"); + + MigrationManager.announceKeyspaceDrop(ks.name); + + assertNull(Schema.instance.getKeyspaceMetadata(ks.name)); + } + + @Test + public void createEmptyKsAddNewCf() throws ConfigurationException + { + assertNull(Schema.instance.getKeyspaceMetadata(EMPTY_KEYSPACE)); + KeyspaceMetadata newKs = KeyspaceMetadata.create(EMPTY_KEYSPACE, KeyspaceParams.simple(5)); + MigrationManager.announceNewKeyspace(newKs); + assertNotNull(Schema.instance.getKeyspaceMetadata(EMPTY_KEYSPACE)); + + String tableName = "added_later"; + TableMetadata newCf = addTestTable(EMPTY_KEYSPACE, tableName, "A new CF to add to an empty KS"); + + //should not exist until apply + assertFalse(Schema.instance.getKeyspaceMetadata(newKs.name).tables.get(newCf.name).isPresent()); + + //add the new CF to the empty space + MigrationManager.announceNewTable(newCf); + + assertTrue(Schema.instance.getKeyspaceMetadata(newKs.name).tables.get(newCf.name).isPresent()); + assertEquals(Schema.instance.getKeyspaceMetadata(newKs.name).tables.get(newCf.name).get(), newCf); + + // now read and write to it. + QueryProcessor.executeInternal(String.format("INSERT INTO %s.%s (key, col, val) VALUES (?, ?, ?)", + EMPTY_KEYSPACE, tableName), + "key0", "col0", "val0"); + + ColumnFamilyStore cfs = Keyspace.open(newKs.name).getColumnFamilyStore(newCf.name); + assertNotNull(cfs); + cfs.forceBlockingFlush(); + + UntypedResultSet rows = QueryProcessor.executeInternal(String.format("SELECT * FROM %s.%s", EMPTY_KEYSPACE, tableName)); + assertRows(rows, row("key0", "col0", "val0")); + } + + @Test + public void testUpdateKeyspace() throws ConfigurationException + { + // create a keyspace to serve as existing. + TableMetadata cf = addTestTable("UpdatedKeyspace", "AddedStandard1", "A new cf for a new ks"); + KeyspaceMetadata oldKs = KeyspaceMetadata.create(cf.keyspace, KeyspaceParams.simple(5), Tables.of(cf)); + + MigrationManager.announceNewKeyspace(oldKs); + + assertNotNull(Schema.instance.getKeyspaceMetadata(cf.keyspace)); + assertEquals(Schema.instance.getKeyspaceMetadata(cf.keyspace), oldKs); + + // names should match. + KeyspaceMetadata newBadKs2 = KeyspaceMetadata.create(cf.keyspace + "trash", KeyspaceParams.simple(4)); + try + { + MigrationManager.announceKeyspaceUpdate(newBadKs2); + throw new AssertionError("Should not have been able to update a KS with an invalid KS name."); + } + catch (ConfigurationException ex) + { + // expected. + } + + Map<String, String> replicationMap = new HashMap<>(); + replicationMap.put(ReplicationParams.CLASS, OldNetworkTopologyStrategy.class.getName()); + replicationMap.put("replication_factor", "1"); + + KeyspaceMetadata newKs = KeyspaceMetadata.create(cf.keyspace, KeyspaceParams.create(true, replicationMap)); + MigrationManager.announceKeyspaceUpdate(newKs); + + KeyspaceMetadata newFetchedKs = Schema.instance.getKeyspaceMetadata(newKs.name); + assertEquals(newFetchedKs.params.replication.klass, newKs.params.replication.klass); + assertFalse(newFetchedKs.params.replication.klass.equals(oldKs.params.replication.klass)); + } + + /* + @Test + public void testUpdateColumnFamilyNoIndexes() throws ConfigurationException + { + // create a keyspace with a cf to update. + CFMetaData cf = addTestTable("UpdatedCfKs", "Standard1added", "A new cf that will be updated"); + KSMetaData ksm = KSMetaData.testMetadata(cf.ksName, SimpleStrategy.class, KSMetaData.optsWithRF(1), cf); + MigrationManager.announceNewKeyspace(ksm); + + assertNotNull(Schema.instance.getKSMetaData(cf.ksName)); + assertEquals(Schema.instance.getKSMetaData(cf.ksName), ksm); + assertNotNull(Schema.instance.getTableMetadataRef(cf.ksName, cf.cfName)); + + // updating certain fields should fail. + CFMetaData newCfm = cf.copy(); + newCfm.defaultValidator(BytesType.instance); + newCfm.minCompactionThreshold(5); + newCfm.maxCompactionThreshold(31); + + // test valid operations. + newCfm.comment("Modified comment"); + MigrationManager.announceTableUpdate(newCfm); // doesn't get set back here. + + newCfm.readRepairChance(0.23); + MigrationManager.announceTableUpdate(newCfm); + + newCfm.gcGraceSeconds(12); + MigrationManager.announceTableUpdate(newCfm); + + newCfm.defaultValidator(UTF8Type.instance); + MigrationManager.announceTableUpdate(newCfm); + + newCfm.minCompactionThreshold(3); + MigrationManager.announceTableUpdate(newCfm); + + newCfm.maxCompactionThreshold(33); + MigrationManager.announceTableUpdate(newCfm); + + // can't test changing the reconciler because there is only one impl. + + // check the cumulative affect. + assertEquals(Schema.instance.getTableMetadataRef(cf.ksName, cf.cfName).getComment(), newCfm.getComment()); + assertEquals(Schema.instance.getTableMetadataRef(cf.ksName, cf.cfName).getReadRepairChance(), newCfm.getReadRepairChance(), 0.0001); + assertEquals(Schema.instance.getTableMetadataRef(cf.ksName, cf.cfName).getGcGraceSeconds(), newCfm.getGcGraceSeconds()); + assertEquals(UTF8Type.instance, Schema.instance.getTableMetadataRef(cf.ksName, cf.cfName).getDefaultValidator()); + + // Change tableId + newCfm = new CFMetaData(cf.ksName, cf.cfName, cf.cfType, cf.comparator); + CFMetaData.copyOpts(newCfm, cf); + try + { + cf.apply(newCfm); + throw new AssertionError("Should have blown up when you used a different id."); + } + catch (ConfigurationException expected) {} + + // Change cfName + newCfm = new CFMetaData(cf.ksName, cf.cfName + "_renamed", cf.cfType, cf.comparator); + CFMetaData.copyOpts(newCfm, cf); + try + { + cf.apply(newCfm); + throw new AssertionError("Should have blown up when you used a different name."); + } + catch (ConfigurationException expected) {} + + // Change ksName + newCfm = new CFMetaData(cf.ksName + "_renamed", cf.cfName, cf.cfType, cf.comparator); + CFMetaData.copyOpts(newCfm, cf); + try + { + cf.apply(newCfm); + throw new AssertionError("Should have blown up when you used a different keyspace."); + } + catch (ConfigurationException expected) {} + + // Change cf type + newCfm = new CFMetaData(cf.ksName, cf.cfName, ColumnFamilyType.Super, cf.comparator); + CFMetaData.copyOpts(newCfm, cf); + try + { + cf.apply(newCfm); + throw new AssertionError("Should have blwon up when you used a different cf type."); + } + catch (ConfigurationException expected) {} + + // Change comparator + newCfm = new CFMetaData(cf.ksName, cf.cfName, cf.cfType, new SimpleDenseCellNameType(TimeUUIDType.instance)); + CFMetaData.copyOpts(newCfm, cf); + try + { + cf.apply(newCfm); + throw new AssertionError("Should have blown up when you used a different comparator."); + } + catch (ConfigurationException expected) {} + } + */ + + @Test + public void testDropIndex() throws ConfigurationException + { + // persist keyspace definition in the system keyspace + SchemaKeyspace.makeCreateKeyspaceMutation(Schema.instance.getKeyspaceMetadata(KEYSPACE6), FBUtilities.timestampMicros()).build().applyUnsafe(); + ColumnFamilyStore cfs = Keyspace.open(KEYSPACE6).getColumnFamilyStore(TABLE1i); + String indexName = TABLE1i + "_birthdate_key_index"; + + // insert some data. save the sstable descriptor so we can make sure it's marked for delete after the drop + QueryProcessor.executeInternal(String.format( + "INSERT INTO %s.%s (key, c1, birthdate, notbirthdate) VALUES (?, ?, ?, ?)", + KEYSPACE6, + TABLE1i), + "key0", "col0", 1L, 1L); + + cfs.forceBlockingFlush(); + ColumnFamilyStore indexCfs = cfs.indexManager.getIndexByName(indexName) + .getBackingTable() + .orElseThrow(throwAssert("Cannot access index cfs")); + Descriptor desc = indexCfs.getLiveSSTables().iterator().next().descriptor; + + // drop the index + TableMetadata meta = cfs.metadata(); + IndexMetadata existing = meta.indexes + .get(indexName) + .orElseThrow(throwAssert("Index not found")); + + MigrationManager.announceTableUpdate(meta.unbuild().indexes(meta.indexes.without(existing.name)).build()); + + // check + assertTrue(cfs.indexManager.listIndexes().isEmpty()); + LifecycleTransaction.waitForDeletions(); + assertFalse(new File(desc.filenameFor(Component.DATA)).exists()); + } + + private TableMetadata addTestTable(String ks, String cf, String comment) + { + return + TableMetadata.builder(ks, cf) + .addPartitionKeyColumn("key", UTF8Type.instance) + .addClusteringColumn("col", UTF8Type.instance) + .addRegularColumn("val", UTF8Type.instance) + .comment(comment) + .readRepairChance(0.0) + .build(); + } +} http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/test/unit/org/apache/cassandra/schema/MockSchema.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/schema/MockSchema.java b/test/unit/org/apache/cassandra/schema/MockSchema.java new file mode 100644 index 0000000..023015b --- /dev/null +++ b/test/unit/org/apache/cassandra/schema/MockSchema.java @@ -0,0 +1,187 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ +package org.apache.cassandra.schema; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; + +import com.google.common.collect.ImmutableSet; + +import org.apache.cassandra.config.DatabaseDescriptor; +import org.apache.cassandra.db.*; +import org.apache.cassandra.db.marshal.UTF8Type; +import org.apache.cassandra.dht.Murmur3Partitioner; +import org.apache.cassandra.io.sstable.Component; +import org.apache.cassandra.io.sstable.Descriptor; +import org.apache.cassandra.io.sstable.IndexSummary; +import org.apache.cassandra.io.sstable.format.SSTableFormat; +import org.apache.cassandra.io.sstable.format.SSTableReader; +import org.apache.cassandra.io.sstable.metadata.MetadataCollector; +import org.apache.cassandra.io.sstable.metadata.MetadataType; +import org.apache.cassandra.io.sstable.metadata.StatsMetadata; +import org.apache.cassandra.io.util.FileHandle; +import org.apache.cassandra.io.util.FileUtils; +import org.apache.cassandra.io.util.Memory; +import org.apache.cassandra.schema.CachingParams; +import org.apache.cassandra.schema.KeyspaceMetadata; +import org.apache.cassandra.schema.KeyspaceParams; +import org.apache.cassandra.schema.TableMetadata; +import org.apache.cassandra.schema.TableMetadataRef; +import org.apache.cassandra.utils.AlwaysPresentFilter; +import org.apache.cassandra.utils.ByteBufferUtil; + +public class MockSchema +{ + static + { + Memory offsets = Memory.allocate(4); + offsets.setInt(0, 0); + indexSummary = new IndexSummary(Murmur3Partitioner.instance, offsets, 0, Memory.allocate(4), 0, 0, 0, 1); + } + private static final AtomicInteger id = new AtomicInteger(); + public static final Keyspace ks = Keyspace.mockKS(KeyspaceMetadata.create("mockks", KeyspaceParams.simpleTransient(1))); + + public static final IndexSummary indexSummary; + private static final FileHandle RANDOM_ACCESS_READER_FACTORY = new FileHandle.Builder(temp("mocksegmentedfile").getAbsolutePath()).complete(); + + public static Memtable memtable(ColumnFamilyStore cfs) + { + return new Memtable(cfs.metadata()); + } + + public static SSTableReader sstable(int generation, ColumnFamilyStore cfs) + { + return sstable(generation, false, cfs); + } + + public static SSTableReader sstable(int generation, boolean keepRef, ColumnFamilyStore cfs) + { + return sstable(generation, 0, keepRef, cfs); + } + + public static SSTableReader sstable(int generation, int size, ColumnFamilyStore cfs) + { + return sstable(generation, size, false, cfs); + } + + public static SSTableReader sstable(int generation, int size, boolean keepRef, ColumnFamilyStore cfs) + { + Descriptor descriptor = new Descriptor(cfs.getDirectories().getDirectoryForNewSSTables(), + cfs.keyspace.getName(), + cfs.getColumnFamilyName(), + generation, SSTableFormat.Type.BIG); + Set<Component> components = ImmutableSet.of(Component.DATA, Component.PRIMARY_INDEX, Component.FILTER, Component.TOC); + for (Component component : components) + { + File file = new File(descriptor.filenameFor(component)); + try + { + file.createNewFile(); + } + catch (IOException e) + { + } + } + if (size > 0) + { + try + { + File file = new File(descriptor.filenameFor(Component.DATA)); + try (RandomAccessFile raf = new RandomAccessFile(file, "rw")) + { + raf.setLength(size); + } + } + catch (IOException e) + { + throw new RuntimeException(e); + } + } + SerializationHeader header = SerializationHeader.make(cfs.metadata(), Collections.emptyList()); + StatsMetadata metadata = (StatsMetadata) new MetadataCollector(cfs.metadata().comparator) + .finalizeMetadata(cfs.metadata().partitioner.getClass().getCanonicalName(), 0.01f, -1, header) + .get(MetadataType.STATS); + SSTableReader reader = SSTableReader.internalOpen(descriptor, components, cfs.metadata, + RANDOM_ACCESS_READER_FACTORY.sharedCopy(), RANDOM_ACCESS_READER_FACTORY.sharedCopy(), indexSummary.sharedCopy(), + new AlwaysPresentFilter(), 1L, metadata, SSTableReader.OpenReason.NORMAL, header); + reader.first = reader.last = readerBounds(generation); + if (!keepRef) + reader.selfRef().release(); + return reader; + } + + public static ColumnFamilyStore newCFS() + { + return newCFS(ks.getName()); + } + + public static ColumnFamilyStore newCFS(String ksname) + { + String cfname = "mockcf" + (id.incrementAndGet()); + TableMetadata metadata = newTableMetadata(ksname, cfname); + return new ColumnFamilyStore(ks, cfname, 0, new TableMetadataRef(metadata), new Directories(metadata), false, false, false); + } + + public static TableMetadata newTableMetadata(String ksname, String cfname) + { + return TableMetadata.builder(ksname, cfname) + .partitioner(Murmur3Partitioner.instance) + .addPartitionKeyColumn("key", UTF8Type.instance) + .addClusteringColumn("col", UTF8Type.instance) + .addRegularColumn("value", UTF8Type.instance) + .caching(CachingParams.CACHE_NOTHING) + .build(); + } + + public static BufferDecoratedKey readerBounds(int generation) + { + return new BufferDecoratedKey(new Murmur3Partitioner.LongToken(generation), ByteBufferUtil.EMPTY_BYTE_BUFFER); + } + + private static File temp(String id) + { + try + { + File file = File.createTempFile(id, "tmp"); + file.deleteOnExit(); + return file; + } + catch (IOException e) + { + throw new RuntimeException(e); + } + } + + public static void cleanup() + { + // clean up data directory which are stored as data directory/keyspace/data files + for (String dirName : DatabaseDescriptor.getAllDataFileLocations()) + { + File dir = new File(dirName); + if (!dir.exists()) + continue; + String[] children = dir.list(); + for (String child : children) + FileUtils.deleteRecursive(new File(dir, child)); + } + } +}