You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by al...@apache.org on 2017/01/27 22:18:43 UTC

[37/37] cassandra git commit: Make TableMetadata immutable, optimize Schema

Make TableMetadata immutable, optimize Schema

patch by Aleksey Yeschenko; reviewed by Sylvain Lebresne for
CASSANDRA-9425


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

Branch: refs/heads/trunk
Commit: af3fe39dcabd9ef77a00309ce6741268423206df
Parents: 3580f6c
Author: Aleksey Yeschenko <al...@apache.org>
Authored: Thu Nov 10 01:16:59 2016 +0000
Committer: Aleksey Yeschenko <al...@apache.org>
Committed: Fri Jan 27 22:17:46 2017 +0000

----------------------------------------------------------------------
 CHANGES.txt                                     |    2 +
 .../apache/cassandra/triggers/AuditTrigger.java |   12 +-
 src/antlr/Cql.g                                 |    8 +-
 src/antlr/Parser.g                              |   60 +-
 .../org/apache/cassandra/auth/AuthKeyspace.java |   87 +-
 .../cassandra/auth/AuthMigrationListener.java   |   53 -
 .../auth/AuthSchemaChangeListener.java          |   53 +
 .../cassandra/auth/CassandraAuthorizer.java     |   12 +-
 .../cassandra/auth/CassandraRoleManager.java    |   12 +-
 .../org/apache/cassandra/auth/DataResource.java |    4 +-
 .../apache/cassandra/auth/FunctionResource.java |    2 +-
 .../cassandra/auth/PasswordAuthenticator.java   |    8 +-
 .../cassandra/batchlog/BatchlogManager.java     |    9 +-
 .../apache/cassandra/cache/AutoSavingCache.java |   29 +-
 .../org/apache/cassandra/cache/CacheKey.java    |   24 +-
 .../apache/cassandra/cache/CounterCacheKey.java |   50 +-
 .../org/apache/cassandra/cache/KeyCacheKey.java |   23 +-
 .../org/apache/cassandra/cache/OHCProvider.java |   27 +-
 .../org/apache/cassandra/cache/RowCacheKey.java |   35 +-
 .../org/apache/cassandra/config/CFMetaData.java | 1362 ------------------
 .../cassandra/config/ColumnDefinition.java      |  623 --------
 .../cassandra/config/ReadRepairDecision.java    |   23 -
 .../org/apache/cassandra/config/Schema.java     |  776 ----------
 .../cassandra/config/SchemaConstants.java       |   74 -
 .../apache/cassandra/config/ViewDefinition.java |  166 ---
 .../org/apache/cassandra/cql3/CQL3Type.java     |    4 +-
 .../apache/cassandra/cql3/ColumnIdentifier.java |    1 -
 .../org/apache/cassandra/cql3/Constants.java    |   10 +-
 src/java/org/apache/cassandra/cql3/Json.java    |   34 +-
 src/java/org/apache/cassandra/cql3/Lists.java   |   18 +-
 src/java/org/apache/cassandra/cql3/Maps.java    |   12 +-
 .../cassandra/cql3/MultiColumnRelation.java     |   62 +-
 .../org/apache/cassandra/cql3/Operation.java    |   77 +-
 .../org/apache/cassandra/cql3/QueryOptions.java |    4 +-
 .../apache/cassandra/cql3/QueryProcessor.java   |   19 +-
 .../org/apache/cassandra/cql3/Relation.java     |   65 +-
 src/java/org/apache/cassandra/cql3/Sets.java    |   12 +-
 .../cassandra/cql3/SingleColumnRelation.java    |   64 +-
 .../apache/cassandra/cql3/TokenRelation.java    |   66 +-
 .../apache/cassandra/cql3/UntypedResultSet.java |   21 +-
 .../apache/cassandra/cql3/UpdateParameters.java |   28 +-
 .../org/apache/cassandra/cql3/UserTypes.java    |    8 +-
 .../org/apache/cassandra/cql3/Validation.java   |   58 +-
 .../cassandra/cql3/VariableSpecifications.java  |   24 +-
 .../cql3/conditions/AbstractConditions.java     |    4 +-
 .../cql3/conditions/ColumnCondition.java        |   48 +-
 .../cql3/conditions/ColumnConditions.java       |    6 +-
 .../cassandra/cql3/conditions/Conditions.java   |    4 +-
 .../cql3/functions/AbstractFunction.java        |   11 +
 .../cassandra/cql3/functions/FunctionName.java  |    2 +-
 .../cql3/functions/FunctionResolver.java        |    4 +-
 .../cassandra/cql3/functions/OperationFcts.java |    2 +-
 .../cassandra/cql3/functions/TokenFct.java      |   22 +-
 .../cassandra/cql3/functions/UDFunction.java    |   38 +-
 .../ClusteringColumnRestrictions.java           |   16 +-
 .../restrictions/CustomIndexExpression.java     |   20 +-
 .../cql3/restrictions/IndexRestrictions.java    |   14 +-
 .../restrictions/MultiColumnRestriction.java    |   50 +-
 .../restrictions/PartitionKeyRestrictions.java  |   10 +-
 .../PartitionKeySingleRestrictionSet.java       |   12 +-
 .../cql3/restrictions/Restriction.java          |    8 +-
 .../cql3/restrictions/RestrictionSet.java       |   42 +-
 .../restrictions/RestrictionSetWrapper.java     |   10 +-
 .../cql3/restrictions/Restrictions.java         |    4 +-
 .../restrictions/SingleColumnRestriction.java   |   34 +-
 .../restrictions/StatementRestrictions.java     |  118 +-
 .../cassandra/cql3/restrictions/TermSlice.java  |    4 +-
 .../cql3/restrictions/TokenFilter.java          |   20 +-
 .../cql3/restrictions/TokenRestriction.java     |   42 +-
 .../selection/AbstractFunctionSelector.java     |    4 +-
 .../cql3/selection/CollectionFactory.java       |    4 +-
 .../cassandra/cql3/selection/ListSelector.java  |    2 -
 .../cassandra/cql3/selection/MapSelector.java   |    4 +-
 .../cassandra/cql3/selection/RawSelector.java   |   16 +-
 .../cassandra/cql3/selection/Selectable.java    |  146 +-
 .../cassandra/cql3/selection/Selection.java     |   82 +-
 .../cql3/selection/SelectionColumnMapping.java  |   14 +-
 .../cql3/selection/SelectionColumns.java        |    4 +-
 .../cassandra/cql3/selection/Selector.java      |   10 +-
 .../cql3/selection/SelectorFactories.java       |   20 +-
 .../cassandra/cql3/selection/SetSelector.java   |    2 -
 .../cql3/selection/SimpleSelector.java          |    4 +-
 .../cassandra/cql3/selection/TermSelector.java  |    4 +-
 .../cql3/selection/UserTypeSelector.java        |    4 +-
 .../cql3/selection/WritetimeOrTTLSelector.java  |    4 +-
 .../cql3/statements/AlterKeyspaceStatement.java |   10 +-
 .../cql3/statements/AlterTableStatement.java    |  171 +--
 .../statements/AlterTableStatementColumn.java   |   12 +-
 .../cql3/statements/AlterTypeStatement.java     |  132 +-
 .../cql3/statements/AlterViewStatement.java     |   24 +-
 .../cql3/statements/BatchStatement.java         |   65 +-
 .../apache/cassandra/cql3/statements/Bound.java |    8 +-
 .../cql3/statements/CQL3CasRequest.java         |   36 +-
 .../statements/CreateAggregateStatement.java    |    8 +-
 .../statements/CreateFunctionStatement.java     |    9 +-
 .../cql3/statements/CreateIndexStatement.java   |   49 +-
 .../statements/CreateKeyspaceStatement.java     |    7 +-
 .../cql3/statements/CreateTableStatement.java   |   60 +-
 .../cql3/statements/CreateTriggerStatement.java |   24 +-
 .../cql3/statements/CreateTypeStatement.java    |    8 +-
 .../cql3/statements/CreateViewStatement.java    |   94 +-
 .../cql3/statements/DeleteStatement.java        |   26 +-
 .../cql3/statements/DropAggregateStatement.java |    9 +-
 .../cql3/statements/DropFunctionStatement.java  |   11 +-
 .../cql3/statements/DropIndexStatement.java     |   35 +-
 .../cql3/statements/DropKeyspaceStatement.java  |    6 +-
 .../cql3/statements/DropTableStatement.java     |   24 +-
 .../cql3/statements/DropTriggerStatement.java   |   23 +-
 .../cql3/statements/DropTypeStatement.java      |   16 +-
 .../cql3/statements/DropViewStatement.java      |   26 +-
 .../cassandra/cql3/statements/IndexTarget.java  |   56 +-
 .../cql3/statements/KeyspaceAttributes.java     |   10 +
 .../statements/ListPermissionsStatement.java    |    2 +-
 .../cql3/statements/ListRolesStatement.java     |    2 +-
 .../cql3/statements/ListUsersStatement.java     |    2 +-
 .../cql3/statements/ModificationStatement.java  |  167 ++-
 .../PermissionsManagementStatement.java         |    2 +-
 .../cql3/statements/SelectStatement.java        |  152 +-
 .../cql3/statements/TableAttributes.java        |    7 +-
 .../cql3/statements/TruncateStatement.java      |   10 +-
 .../cql3/statements/UpdateStatement.java        |   70 +-
 .../cql3/statements/UpdatesCollector.java       |   27 +-
 .../db/AbstractReadCommandBuilder.java          |   44 +-
 .../org/apache/cassandra/db/Clustering.java     |   16 +-
 .../cassandra/db/ClusteringBoundOrBoundary.java |    4 +-
 .../cassandra/db/ClusteringComparator.java      |    4 +-
 .../apache/cassandra/db/ClusteringPrefix.java   |   20 +-
 .../apache/cassandra/db/ColumnFamilyStore.java  |  212 +--
 .../db/ColumnFamilyStoreCQLHelper.java          |  146 +-
 .../cassandra/db/ColumnFamilyStoreMBean.java    |    5 +-
 src/java/org/apache/cassandra/db/Columns.java   |  124 +-
 .../org/apache/cassandra/db/CompactTables.java  |   16 +-
 .../apache/cassandra/db/ConsistencyLevel.java   |    8 +-
 .../apache/cassandra/db/CounterMutation.java    |   13 +-
 src/java/org/apache/cassandra/db/DataRange.java |   26 +-
 .../db/DefinitionsUpdateVerbHandler.java        |   55 -
 .../org/apache/cassandra/db/Directories.java    |   43 +-
 .../org/apache/cassandra/db/EmptyIterators.java |   38 +-
 src/java/org/apache/cassandra/db/IMutation.java |    4 +-
 src/java/org/apache/cassandra/db/Keyspace.java  |   91 +-
 src/java/org/apache/cassandra/db/Memtable.java  |   51 +-
 .../db/MigrationRequestVerbHandler.java         |   48 -
 .../org/apache/cassandra/db/MultiCBuilder.java  |   12 +-
 src/java/org/apache/cassandra/db/Mutation.java  |   67 +-
 .../apache/cassandra/db/PartitionColumns.java   |  199 ---
 .../cassandra/db/PartitionRangeReadCommand.java |   21 +-
 .../org/apache/cassandra/db/ReadCommand.java    |   57 +-
 .../cassandra/db/ReadExecutionController.java   |   16 +-
 src/java/org/apache/cassandra/db/ReadQuery.java |    2 +-
 .../org/apache/cassandra/db/ReadResponse.java   |    4 +-
 .../cassandra/db/RegularAndStaticColumns.java   |  194 +++
 .../cassandra/db/SchemaCheckVerbHandler.java    |   42 -
 .../cassandra/db/SerializationHeader.java       |   61 +-
 .../org/apache/cassandra/db/SimpleBuilders.java |   53 +-
 .../db/SinglePartitionReadCommand.java          |   68 +-
 .../cassandra/db/SizeEstimatesRecorder.java     |   16 +-
 src/java/org/apache/cassandra/db/Slice.java     |    6 -
 src/java/org/apache/cassandra/db/Slices.java    |   18 +-
 .../org/apache/cassandra/db/StorageHook.java    |   11 +-
 .../org/apache/cassandra/db/SystemKeyspace.java |  537 +++----
 .../cassandra/db/UnfilteredDeserializer.java    |   16 +-
 .../cassandra/db/UnknownColumnException.java    |   51 -
 .../db/UnknownColumnFamilyException.java        |   33 -
 .../columniterator/AbstractSSTableIterator.java |   16 +-
 .../db/columniterator/SSTableIterator.java      |    2 +-
 .../columniterator/SSTableReversedIterator.java |   14 +-
 .../AbstractCommitLogSegmentManager.java        |   29 +-
 .../cassandra/db/commitlog/CommitLog.java       |   15 +-
 .../cassandra/db/commitlog/CommitLogReader.java |   15 +-
 .../db/commitlog/CommitLogReplayer.java         |   54 +-
 .../db/commitlog/CommitLogSegment.java          |   57 +-
 .../cassandra/db/compaction/CompactionInfo.java |   26 +-
 .../db/compaction/CompactionIterator.java       |   18 +-
 .../db/compaction/CompactionManager.java        |   32 +-
 .../compaction/CompactionStrategyManager.java   |   29 +-
 .../compaction/LeveledCompactionStrategy.java   |   12 +-
 .../cassandra/db/compaction/Scrubber.java       |   16 +-
 .../cassandra/db/compaction/Upgrader.java       |    4 +-
 .../cassandra/db/compaction/Verifier.java       |    4 +-
 .../writers/DefaultCompactionWriter.java        |    4 +-
 .../writers/MajorLeveledCompactionWriter.java   |    4 +-
 .../writers/MaxSSTableSizeWriter.java           |    4 +-
 .../SplittingSizeTieredCompactionWriter.java    |    4 +-
 .../filter/AbstractClusteringIndexFilter.java   |   10 +-
 .../db/filter/ClusteringIndexFilter.java        |   18 +-
 .../db/filter/ClusteringIndexNamesFilter.java   |   30 +-
 .../db/filter/ClusteringIndexSliceFilter.java   |   10 +-
 .../cassandra/db/filter/ColumnFilter.java       |   82 +-
 .../cassandra/db/filter/ColumnSubselection.java |   32 +-
 .../apache/cassandra/db/filter/DataLimits.java  |    2 +-
 .../apache/cassandra/db/filter/RowFilter.java   |   69 +-
 .../filter/TombstoneOverwhelmingException.java  |    8 +-
 .../db/lifecycle/LifecycleTransaction.java      |    7 +-
 .../cassandra/db/lifecycle/LogTransaction.java  |    4 +-
 .../cassandra/db/marshal/CompositeType.java     |    6 +
 .../apache/cassandra/db/marshal/UserType.java   |    5 +
 .../db/partitions/AbstractBTreePartition.java   |   52 +-
 .../db/partitions/AtomicBTreePartition.java     |   19 +-
 .../db/partitions/CachedBTreePartition.java     |   22 +-
 .../db/partitions/FilteredPartition.java        |   10 +-
 .../db/partitions/ImmutableBTreePartition.java  |   32 +-
 .../cassandra/db/partitions/Partition.java      |    6 +-
 .../db/partitions/PartitionUpdate.java          |   89 +-
 .../SingletonUnfilteredPartitionIterator.java   |    4 +-
 .../partitions/UnfilteredPartitionIterator.java |    4 +-
 .../UnfilteredPartitionIterators.java           |   15 +-
 .../apache/cassandra/db/rows/AbstractCell.java  |    6 +-
 .../db/rows/AbstractRangeTombstoneMarker.java   |    8 +-
 .../apache/cassandra/db/rows/AbstractRow.java   |   10 +-
 .../db/rows/AbstractUnfilteredRowIterator.java  |   14 +-
 .../org/apache/cassandra/db/rows/BTreeRow.java  |   53 +-
 .../cassandra/db/rows/BaseRowIterator.java      |    8 +-
 .../apache/cassandra/db/rows/BufferCell.java    |   20 +-
 src/java/org/apache/cassandra/db/rows/Cell.java |   13 +-
 .../org/apache/cassandra/db/rows/Cells.java     |    6 +-
 .../apache/cassandra/db/rows/ColumnData.java    |    8 +-
 .../cassandra/db/rows/ComplexColumnData.java    |   14 +-
 .../LazilyInitializedUnfilteredRowIterator.java |    6 +-
 .../apache/cassandra/db/rows/NativeCell.java    |    6 +-
 .../db/rows/RangeTombstoneBoundMarker.java      |    4 +-
 .../db/rows/RangeTombstoneBoundaryMarker.java   |    4 +-
 src/java/org/apache/cassandra/db/rows/Row.java  |   26 +-
 .../db/rows/RowAndDeletionMergeIterator.java    |    5 +-
 .../cassandra/db/rows/RowDiffListener.java      |    4 +-
 .../apache/cassandra/db/rows/RowIterators.java  |   10 +-
 src/java/org/apache/cassandra/db/rows/Rows.java |   13 +-
 .../cassandra/db/rows/SerializationHelper.java  |   25 +-
 .../apache/cassandra/db/rows/Unfiltered.java    |   10 +-
 .../rows/UnfilteredRowIteratorSerializer.java   |   12 +-
 .../UnfilteredRowIteratorWithLowerBound.java    |   22 +-
 .../db/rows/UnfilteredRowIterators.java         |   33 +-
 .../cassandra/db/rows/UnfilteredSerializer.java |   22 +-
 .../cassandra/db/rows/WithOnlyQueriedData.java  |    4 +-
 .../db/rows/WrappingUnfilteredRowIterator.java  |    6 +-
 .../apache/cassandra/db/transform/BaseRows.java |    8 +-
 .../cassandra/db/transform/Transformation.java  |    4 +-
 .../db/transform/UnfilteredPartitions.java      |    4 +-
 .../cassandra/db/transform/UnfilteredRows.java  |   12 +-
 .../apache/cassandra/db/view/TableViews.java    |   35 +-
 src/java/org/apache/cassandra/db/view/View.java |   54 +-
 .../apache/cassandra/db/view/ViewBuilder.java   |   12 +-
 .../apache/cassandra/db/view/ViewManager.java   |   47 +-
 .../cassandra/db/view/ViewUpdateGenerator.java  |   37 +-
 .../org/apache/cassandra/dht/BootStrapper.java  |    2 +-
 .../cassandra/dht/ByteOrderedPartitioner.java   |    8 +-
 .../dht/OrderPreservingPartitioner.java         |    7 +-
 .../exceptions/UnknownIndexException.java       |   39 +
 .../exceptions/UnknownTableException.java       |   33 +
 .../hadoop/cql3/CqlBulkRecordWriter.java        |    7 +-
 .../cassandra/hadoop/cql3/CqlInputFormat.java   |    2 +-
 src/java/org/apache/cassandra/hints/Hint.java   |    7 +-
 .../org/apache/cassandra/hints/HintMessage.java |   11 +-
 .../org/apache/cassandra/hints/HintsReader.java |    7 +-
 src/java/org/apache/cassandra/index/Index.java  |   10 +-
 .../cassandra/index/SecondaryIndexManager.java  |   39 +-
 .../apache/cassandra/index/TargetParser.java    |   18 +-
 .../index/internal/CassandraIndex.java          |   79 +-
 .../index/internal/CassandraIndexFunctions.java |   45 +-
 .../index/internal/CassandraIndexSearcher.java  |    7 +-
 .../internal/CollatedViewIndexBuilder.java      |    2 +-
 .../composites/ClusteringColumnIndex.java       |    2 +-
 .../composites/CollectionEntryIndex.java        |    4 +-
 .../internal/composites/CollectionKeyIndex.java |    4 +-
 .../composites/CollectionKeyIndexBase.java      |    2 +-
 .../composites/CollectionValueIndex.java        |    8 +-
 .../internal/composites/CompositesSearcher.java |    8 +-
 .../internal/composites/PartitionKeyIndex.java  |    4 +-
 .../index/internal/keys/KeysIndex.java          |   15 +-
 .../index/internal/keys/KeysSearcher.java       |    6 +-
 .../apache/cassandra/index/sasi/SASIIndex.java  |   37 +-
 .../cassandra/index/sasi/SASIIndexBuilder.java  |   18 +-
 .../cassandra/index/sasi/conf/ColumnIndex.java  |   10 +-
 .../cassandra/index/sasi/conf/IndexMode.java    |    6 +-
 .../index/sasi/disk/PerSSTableIndexWriter.java  |   10 +-
 .../index/sasi/memory/TrieMemIndex.java         |   10 +-
 .../cassandra/index/sasi/plan/Expression.java   |    4 +-
 .../cassandra/index/sasi/plan/Operation.java    |   21 +-
 .../index/sasi/plan/QueryController.java        |   17 +-
 .../cassandra/index/sasi/plan/QueryPlan.java    |    4 +-
 .../io/sstable/AbstractSSTableSimpleWriter.java |   17 +-
 .../cassandra/io/sstable/CQLSSTableWriter.java  |   48 +-
 .../io/sstable/IndexSummaryManager.java         |    9 +-
 .../io/sstable/IndexSummaryRedistribution.java  |   20 +-
 .../cassandra/io/sstable/KeyIterator.java       |    7 +-
 .../io/sstable/ReducingKeyIterator.java         |    2 +-
 .../apache/cassandra/io/sstable/SSTable.java    |   17 +-
 .../io/sstable/SSTableIdentityIterator.java     |   20 +-
 .../cassandra/io/sstable/SSTableLoader.java     |    8 +-
 .../io/sstable/SSTableMultiWriter.java          |    4 +-
 .../io/sstable/SSTableSimpleIterator.java       |   21 +-
 .../io/sstable/SSTableSimpleUnsortedWriter.java |    8 +-
 .../io/sstable/SSTableSimpleWriter.java         |    6 +-
 .../cassandra/io/sstable/SSTableTxnWriter.java  |   13 +-
 .../io/sstable/SimpleSSTableMultiWriter.java    |   13 +-
 .../sstable/format/RangeAwareSSTableWriter.java |    6 +-
 .../io/sstable/format/SSTableFormat.java        |    5 +-
 .../io/sstable/format/SSTableReader.java        |  118 +-
 .../io/sstable/format/SSTableWriter.java        |   27 +-
 .../io/sstable/format/big/BigFormat.java        |    9 +-
 .../io/sstable/format/big/BigTableReader.java   |   25 +-
 .../io/sstable/format/big/BigTableScanner.java  |   19 +-
 .../io/sstable/format/big/BigTableWriter.java   |   20 +-
 .../cassandra/metrics/CompactionMetrics.java    |   20 +-
 .../apache/cassandra/metrics/TableMetrics.java  |    6 +-
 .../cassandra/net/IncomingTcpConnection.java    |    7 +-
 .../apache/cassandra/net/MessagingService.java  |    6 +-
 .../repair/RepairMessageVerbHandler.java        |   13 +-
 .../apache/cassandra/repair/RepairRunnable.java |    2 +-
 .../repair/SystemDistributedKeyspace.java       |  131 +-
 .../repair/messages/PrepareMessage.java         |   47 +-
 .../apache/cassandra/schema/ColumnMetadata.java |  617 ++++++++
 .../cassandra/schema/CompactionParams.java      |    2 +-
 .../apache/cassandra/schema/DroppedColumn.java  |   59 +
 .../org/apache/cassandra/schema/Functions.java  |   27 +-
 .../apache/cassandra/schema/IndexMetadata.java  |   53 +-
 .../org/apache/cassandra/schema/Indexes.java    |   55 +-
 .../cassandra/schema/KeyspaceMetadata.java      |   53 +-
 .../org/apache/cassandra/schema/Keyspaces.java  |   46 +
 .../cassandra/schema/MigrationManager.java      |  493 +++++++
 .../apache/cassandra/schema/MigrationTask.java  |  113 ++
 .../org/apache/cassandra/schema/Schema.java     |  804 +++++++++++
 .../cassandra/schema/SchemaChangeListener.java  |  102 ++
 .../cassandra/schema/SchemaConstants.java       |   82 ++
 .../apache/cassandra/schema/SchemaKeyspace.java |  808 +++++------
 .../cassandra/schema/SchemaPullVerbHandler.java |   50 +
 .../cassandra/schema/SchemaPushVerbHandler.java |   47 +
 .../schema/SchemaVersionVerbHandler.java        |   46 +
 .../org/apache/cassandra/schema/TableId.java    |  118 ++
 .../apache/cassandra/schema/TableMetadata.java  |  956 ++++++++++++
 .../cassandra/schema/TableMetadataRef.java      |   78 +
 .../apache/cassandra/schema/TableParams.java    |    5 +
 .../org/apache/cassandra/schema/Tables.java     |   89 +-
 .../org/apache/cassandra/schema/Triggers.java   |   17 +
 .../cassandra/schema/UnknownIndexException.java |   39 -
 .../apache/cassandra/schema/ViewMetadata.java   |  197 +++
 src/java/org/apache/cassandra/schema/Views.java |   66 +-
 .../cassandra/service/AbstractReadExecutor.java |   23 +-
 .../cassandra/service/ActiveRepairService.java  |   97 +-
 .../apache/cassandra/service/CacheService.java  |   60 +-
 .../cassandra/service/CassandraDaemon.java      |    9 +-
 .../apache/cassandra/service/ClientState.java   |   22 +-
 .../apache/cassandra/service/DataResolver.java  |   22 +-
 .../cassandra/service/MigrationListener.java    |  102 --
 .../cassandra/service/MigrationManager.java     |  626 --------
 .../apache/cassandra/service/MigrationTask.java |  115 --
 .../service/PendingRangeCalculatorService.java  |    2 +-
 .../apache/cassandra/service/ReadCallback.java  |    4 +-
 .../cassandra/service/ReadRepairDecision.java   |   23 +
 .../apache/cassandra/service/StartupChecks.java |    9 +-
 .../apache/cassandra/service/StorageProxy.java  |   38 +-
 .../cassandra/service/StorageService.java       |   53 +-
 .../service/pager/AbstractQueryPager.java       |    6 +-
 .../service/pager/AggregationQueryPager.java    |    6 +-
 .../cassandra/service/pager/PagingState.java    |   12 +-
 .../service/pager/PartitionRangeQueryPager.java |    2 +-
 .../apache/cassandra/service/paxos/Commit.java  |    6 +-
 .../cassandra/service/paxos/PaxosState.java     |   12 +-
 .../service/paxos/PrepareCallback.java          |    7 +-
 .../cassandra/streaming/StreamReader.java       |   45 +-
 .../cassandra/streaming/StreamReceiveTask.java  |   27 +-
 .../cassandra/streaming/StreamSession.java      |   37 +-
 .../cassandra/streaming/StreamSummary.java      |   22 +-
 .../apache/cassandra/streaming/StreamTask.java  |   10 +-
 .../cassandra/streaming/StreamTransferTask.java |    7 +-
 .../compress/CompressedStreamReader.java        |   13 +-
 .../management/StreamSummaryCompositeData.java  |    8 +-
 .../streaming/messages/FileMessageHeader.java   |   27 +-
 .../streaming/messages/OutgoingFileMessage.java |    4 +-
 .../streaming/messages/ReceivedMessage.java     |   16 +-
 .../apache/cassandra/tools/JsonTransformer.java |   27 +-
 .../cassandra/tools/SSTableExpiredBlockers.java |   13 +-
 .../apache/cassandra/tools/SSTableExport.java   |   27 +-
 .../cassandra/tools/SSTableLevelResetter.java   |    4 +-
 .../cassandra/tools/SSTableOfflineRelevel.java  |    4 +-
 .../cassandra/tools/StandaloneSSTableUtil.java  |    9 +-
 .../cassandra/tools/StandaloneScrubber.java     |    4 +-
 .../cassandra/tools/StandaloneSplitter.java     |    2 +-
 .../cassandra/tools/StandaloneUpgrader.java     |    6 +-
 .../cassandra/tools/StandaloneVerifier.java     |    4 +-
 .../cassandra/tools/nodetool/Cleanup.java       |    2 +-
 .../apache/cassandra/tools/nodetool/Repair.java |    2 +-
 .../apache/cassandra/tracing/TraceKeyspace.java |   74 +-
 .../org/apache/cassandra/transport/Server.java  |   24 +-
 .../cassandra/triggers/TriggerExecutor.java     |   21 +-
 .../utils/NativeSSTableLoaderClient.java        |   78 +-
 .../apache/cassandra/cql3/CorruptionTest.java   |    2 +-
 .../db/commitlog/CommitLogStressTest.java       |    5 +-
 .../db/compaction/LongCompactionsTest.java      |   10 +-
 .../LongLeveledCompactionStrategyTest.java      |    6 +-
 .../cassandra/hints/HintsWriteThenReadTest.java |    6 +-
 .../cassandra/streaming/LongStreamingTest.java  |   13 +-
 .../test/microbench/CompactionBench.java        |   35 -
 .../test/microbench/MutationBench.java          |   26 +-
 .../test/microbench/ReadWriteTest.java          |   31 -
 test/unit/org/apache/cassandra/MockSchema.java  |  187 ---
 .../unit/org/apache/cassandra/SchemaLoader.java |  788 +++++-----
 .../org/apache/cassandra/UpdateBuilder.java     |    7 +-
 test/unit/org/apache/cassandra/Util.java        |   75 +-
 .../apache/cassandra/batchlog/BatchTest.java    |    6 +-
 .../cassandra/batchlog/BatchlogManagerTest.java |   22 +-
 .../cassandra/cache/AutoSavingCacheTest.java    |   17 +-
 .../cassandra/cache/CacheProviderTest.java      |   80 +-
 .../apache/cassandra/config/CFMetaDataTest.java |  193 ---
 .../config/DatabaseDescriptorTest.java          |   49 +-
 .../org/apache/cassandra/cql3/CQLTester.java    |    9 +-
 .../apache/cassandra/cql3/KeyCacheCqlTest.java  |   14 +-
 .../apache/cassandra/cql3/OutOfSpaceTest.java   |    6 +-
 .../cassandra/cql3/PreparedStatementsTest.java  |    2 +-
 .../cassandra/cql3/PstmtPersistenceTest.java    |    2 +-
 .../cassandra/cql3/ViewFilteringTest.java       |    3 -
 .../apache/cassandra/cql3/ViewSchemaTest.java   |   18 +-
 .../org/apache/cassandra/cql3/ViewTest.java     |    8 +-
 .../cql3/conditions/ColumnConditionTest.java    |   20 +-
 .../ClusteringColumnRestrictionsTest.java       |  593 ++++----
 .../selection/SelectionColumnMappingTest.java   |   41 +-
 .../validation/entities/SecondaryIndexTest.java |   28 +-
 .../cql3/validation/entities/UFAuthTest.java    |    2 +-
 .../cql3/validation/entities/UFJavaTest.java    |    3 +-
 .../cql3/validation/entities/UFTest.java        |    6 +-
 .../miscellaneous/CrcCheckChanceTest.java       |    2 +-
 .../validation/operations/AggregationTest.java  |    8 +-
 .../cql3/validation/operations/AlterTest.java   |   10 +-
 .../cql3/validation/operations/CreateTest.java  |   15 +-
 .../operations/DropRecreateAndRestoreTest.java  |    8 +-
 .../operations/InsertUpdateIfConditionTest.java |    2 +-
 test/unit/org/apache/cassandra/db/CellTest.java |   55 +-
 .../org/apache/cassandra/db/CleanupTest.java    |    6 +-
 .../cassandra/db/ColumnFamilyMetricTest.java    |    6 +-
 .../db/ColumnFamilyStoreCQLHelperTest.java      |  371 +++--
 .../cassandra/db/ColumnFamilyStoreTest.java     |   50 +-
 .../org/apache/cassandra/db/ColumnsTest.java    |   85 +-
 .../apache/cassandra/db/CounterCacheTest.java   |   63 +-
 .../apache/cassandra/db/CounterCellTest.java    |   12 +-
 .../cassandra/db/CounterMutationTest.java       |   46 +-
 .../cassandra/db/DeletePartitionTest.java       |    8 +-
 .../apache/cassandra/db/DirectoriesTest.java    |   95 +-
 .../org/apache/cassandra/db/KeyCacheTest.java   |    4 +-
 .../org/apache/cassandra/db/KeyspaceTest.java   |   34 +-
 .../org/apache/cassandra/db/NameSortTest.java   |    6 +-
 .../org/apache/cassandra/db/NativeCellTest.java |   18 +-
 .../cassandra/db/PartitionRangeReadTest.java    |   16 +-
 .../org/apache/cassandra/db/PartitionTest.java  |   20 +-
 .../apache/cassandra/db/RangeTombstoneTest.java |  134 +-
 .../apache/cassandra/db/ReadCommandTest.java    |   70 +-
 .../apache/cassandra/db/ReadMessageTest.java    |   59 +-
 .../db/RecoveryManagerFlushedTest.java          |    4 +-
 .../db/RecoveryManagerMissingHeaderTest.java    |    4 +-
 .../cassandra/db/RecoveryManagerTest.java       |   49 +-
 .../db/RecoveryManagerTruncateTest.java         |    2 +-
 .../org/apache/cassandra/db/RowCacheTest.java   |   13 +-
 .../apache/cassandra/db/RowIndexEntryTest.java  |   22 +-
 test/unit/org/apache/cassandra/db/RowTest.java  |   68 +-
 .../apache/cassandra/db/RowUpdateBuilder.java   |   40 +-
 .../unit/org/apache/cassandra/db/ScrubTest.java |   50 +-
 .../apache/cassandra/db/SecondaryIndexTest.java |  115 +-
 .../db/SinglePartitionSliceCommandTest.java     |   53 +-
 .../apache/cassandra/db/SystemKeyspaceTest.java |    2 +-
 .../apache/cassandra/db/TransformerTest.java    |   28 +-
 .../org/apache/cassandra/db/VerifyTest.java     |   41 +-
 .../db/commitlog/CommitLogReaderTest.java       |   18 +-
 .../CommitLogSegmentManagerCDCTest.java         |    6 +-
 .../commitlog/CommitLogSegmentManagerTest.java  |    2 +-
 .../cassandra/db/commitlog/CommitLogTest.java   |   65 +-
 .../db/commitlog/CommitLogUpgradeTest.java      |   37 +-
 .../db/commitlog/CommitLogUpgradeTestMaker.java |   10 +-
 .../db/commitlog/SnapshotDeletingTest.java      |    4 +-
 .../db/compaction/AntiCompactionTest.java       |   19 +-
 .../compaction/BlacklistingCompactionsTest.java |    6 +-
 .../db/compaction/CompactionControllerTest.java |   52 +-
 .../db/compaction/CompactionIteratorTest.java   |    9 +-
 .../db/compaction/CompactionsPurgeTest.java     |   70 +-
 .../db/compaction/CompactionsTest.java          |   15 +-
 .../DateTieredCompactionStrategyTest.java       |   12 +-
 .../LeveledCompactionStrategyTest.java          |   14 +-
 .../db/compaction/OneCompactionTest.java        |    2 +-
 .../SizeTieredCompactionStrategyTest.java       |    2 +-
 .../cassandra/db/compaction/TTLExpiryTest.java  |   71 +-
 .../TimeWindowCompactionStrategyTest.java       |   10 +-
 .../cassandra/db/lifecycle/HelpersTest.java     |    2 +-
 .../db/lifecycle/LifecycleTransactionTest.java  |    4 +-
 .../db/lifecycle/LogTransactionTest.java        |   81 +-
 .../db/lifecycle/RealTransactionsTest.java      |    8 +-
 .../cassandra/db/lifecycle/TrackerTest.java     |    2 +-
 .../apache/cassandra/db/lifecycle/ViewTest.java |    2 +-
 .../cassandra/db/marshal/CompositeTypeTest.java |   15 +-
 .../db/marshal/DynamicCompositeTypeTest.java    |   26 +-
 .../partition/PartitionImplementationTest.java  |   82 +-
 .../db/partition/PartitionUpdateTest.java       |    6 +-
 .../rows/RowAndDeletionMergeIteratorTest.java   |   35 +-
 .../apache/cassandra/db/rows/RowBuilder.java    |    6 +-
 .../org/apache/cassandra/db/rows/RowsTest.java  |   66 +-
 .../rows/UnfilteredRowIteratorsMergeTest.java   |   16 +-
 .../db/rows/UnfilteredRowsGenerator.java        |   10 +-
 .../apache/cassandra/db/view/ViewUtilsTest.java |    8 +-
 .../apache/cassandra/dht/BootStrapperTest.java  |    2 +-
 .../apache/cassandra/dht/KeyCollisionTest.java  |    4 +-
 .../apache/cassandra/dht/LengthPartitioner.java |    8 +-
 .../apache/cassandra/hints/AlteredHints.java    |    7 +-
 .../apache/cassandra/hints/HintMessageTest.java |    6 +-
 .../org/apache/cassandra/hints/HintTest.java    |   49 +-
 .../apache/cassandra/hints/HintsBufferTest.java |    6 +-
 .../cassandra/hints/HintsServiceTest.java       |   12 +-
 .../apache/cassandra/hints/HintsTestUtil.java   |   16 +-
 .../apache/cassandra/index/CustomIndexTest.java |   84 +-
 .../org/apache/cassandra/index/StubIndex.java   |   10 +-
 .../index/internal/CassandraIndexTest.java      |   38 +-
 .../index/internal/CustomCassandraIndex.java    |   39 +-
 .../cassandra/index/sasi/SASIIndexTest.java     |  100 +-
 .../sasi/disk/PerSSTableIndexWriterTest.java    |   26 +-
 .../index/sasi/plan/OperationTest.java          |   67 +-
 .../io/compress/CQLCompressionTest.java         |   10 +-
 .../io/sstable/BigTableWriterTest.java          |    4 +-
 .../io/sstable/CQLSSTableWriterTest.java        |    6 +-
 .../io/sstable/IndexSummaryManagerTest.java     |  113 +-
 .../sstable/SSTableCorruptionDetectionTest.java |   26 +-
 .../cassandra/io/sstable/SSTableLoaderTest.java |   13 +-
 .../io/sstable/SSTableMetadataTest.java         |   32 +-
 .../cassandra/io/sstable/SSTableReaderTest.java |   30 +-
 .../io/sstable/SSTableRewriterTest.java         |    8 +-
 .../io/sstable/SSTableScannerTest.java          |   21 +-
 .../cassandra/io/sstable/SSTableUtils.java      |   14 +-
 .../cassandra/io/sstable/SSTableWriterTest.java |   16 +-
 .../io/sstable/SSTableWriterTestBase.java       |    2 +-
 .../format/SSTableFlushObserverTest.java        |   30 +-
 .../metadata/MetadataSerializerTest.java        |    5 +-
 .../ReplicationStrategyEndpointCacheTest.java   |    3 +-
 .../cassandra/locator/SimpleStrategyTest.java   |    4 +-
 .../cassandra/metrics/BatchMetricsTest.java     |    2 +-
 .../cassandra/metrics/CQLMetricsTest.java       |    2 +-
 .../cassandra/net/WriteCallbackInfoTest.java    |    6 +-
 .../apache/cassandra/repair/ValidatorTest.java  |    9 +-
 .../RepairMessageSerializationsTest.java        |    3 +-
 .../org/apache/cassandra/schema/DefsTest.java   |  545 -------
 .../cassandra/schema/MigrationManagerTest.java  |  539 +++++++
 .../org/apache/cassandra/schema/MockSchema.java |  187 +++
 .../cassandra/schema/SchemaKeyspaceTest.java    |   46 +-
 .../org/apache/cassandra/schema/SchemaTest.java |   79 +
 .../apache/cassandra/schema/ValidationTest.java |  126 ++
 .../service/ActiveRepairServiceTest.java        |   30 +-
 .../cassandra/service/DataResolverTest.java     |   62 +-
 .../cassandra/service/JoinTokenRingTest.java    |    2 +-
 .../service/LeaveAndBootstrapTest.java          |    4 +-
 .../org/apache/cassandra/service/MoveTest.java  |   20 +-
 .../cassandra/service/PaxosStateTest.java       |    6 +-
 .../cassandra/service/QueryPagerTest.java       |   23 +-
 .../cassandra/service/StartupChecksTest.java    |    2 +-
 .../service/StorageServiceServerTest.java       |   20 +-
 .../cassandra/streaming/SessionInfoTest.java    |    7 +-
 .../streaming/StreamTransferTaskTest.java       |    8 +-
 .../streaming/StreamingTransferTest.java        |   54 +-
 .../org/apache/cassandra/tools/ToolsTester.java |    4 +-
 .../cassandra/triggers/TriggerExecutorTest.java |  118 +-
 .../cassandra/triggers/TriggersSchemaTest.java  |   89 +-
 .../apache/cassandra/triggers/TriggersTest.java |    7 +-
 .../io/sstable/StressCQLSSTableWriter.java      |   44 +-
 .../apache/cassandra/stress/StressProfile.java  |   60 +-
 .../stress/settings/OptionCompaction.java       |    7 +-
 557 files changed, 12829 insertions(+), 13197 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index e695bb0..3c5bfc2 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 4.0
+ * Make TableMetadata immutable, optimize Schema (CASSANDRA-9425)
  * Refactor ColumnCondition (CASSANDRA-12981)
  * Parallelize streaming of different keyspaces (CASSANDRA-4663)
  * Improved compactions metrics (CASSANDRA-13015)
@@ -30,6 +31,7 @@
  * Add support for arithmetic operators (CASSANDRA-11935)
  * Tables in system_distributed should not use gcgs of 0 (CASSANDRA-12954)
 
+
 3.10
  * Fix secondary index queries regression (CASSANDRA-13013)
  * Add duration type to the protocol V5 (CASSANDRA-12850)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/examples/triggers/src/org/apache/cassandra/triggers/AuditTrigger.java
----------------------------------------------------------------------
diff --git a/examples/triggers/src/org/apache/cassandra/triggers/AuditTrigger.java b/examples/triggers/src/org/apache/cassandra/triggers/AuditTrigger.java
index 1efbf13..2528ec7 100644
--- a/examples/triggers/src/org/apache/cassandra/triggers/AuditTrigger.java
+++ b/examples/triggers/src/org/apache/cassandra/triggers/AuditTrigger.java
@@ -22,8 +22,8 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Properties;
 
-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.Mutation;
 import org.apache.cassandra.db.partitions.Partition;
 import org.apache.cassandra.db.partitions.PartitionUpdate;
@@ -40,13 +40,13 @@ public class AuditTrigger implements ITrigger
         String auditKeyspace = properties.getProperty("keyspace");
         String auditTable = properties.getProperty("table");
 
-        CFMetaData metadata = Schema.instance.getCFMetaData(auditKeyspace, auditTable);
+        TableMetadata metadata = Schema.instance.getTableMetadata(auditKeyspace, auditTable);
         PartitionUpdate.SimpleBuilder audit = PartitionUpdate.simpleBuilder(metadata, UUIDGen.getTimeUUID());
 
         audit.row()
-             .add("keyspace_name", update.metadata().ksName)
-             .add("table_name", update.metadata().cfName)
-             .add("primary_key", update.metadata().getKeyValidator().getString(update.partitionKey().getKey()));
+             .add("keyspace_name", update.metadata().keyspace)
+             .add("table_name", update.metadata().table)
+             .add("primary_key", update.metadata().partitionKeyType.getString(update.partitionKey().getKey()));
 
         return Collections.singletonList(audit.buildAsMutation());
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/antlr/Cql.g
----------------------------------------------------------------------
diff --git a/src/antlr/Cql.g b/src/antlr/Cql.g
index 8b26426..17a11aa 100644
--- a/src/antlr/Cql.g
+++ b/src/antlr/Cql.g
@@ -40,17 +40,17 @@ import Parser,Lexer;
     import java.util.Set;
 
     import org.apache.cassandra.auth.*;
-    import org.apache.cassandra.config.ColumnDefinition;
     import org.apache.cassandra.cql3.*;
+    import org.apache.cassandra.cql3.conditions.*;
+    import org.apache.cassandra.cql3.functions.*;
     import org.apache.cassandra.cql3.restrictions.CustomIndexExpression;
-    import org.apache.cassandra.cql3.statements.*;
     import org.apache.cassandra.cql3.selection.*;
-    import org.apache.cassandra.cql3.functions.*;
-    import org.apache.cassandra.cql3.conditions.*;
+    import org.apache.cassandra.cql3.statements.*;
     import org.apache.cassandra.db.marshal.CollectionType;
     import org.apache.cassandra.exceptions.ConfigurationException;
     import org.apache.cassandra.exceptions.InvalidRequestException;
     import org.apache.cassandra.exceptions.SyntaxException;
+    import org.apache.cassandra.schema.ColumnMetadata;
     import org.apache.cassandra.utils.Pair;
 }
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/antlr/Parser.g
----------------------------------------------------------------------
diff --git a/src/antlr/Parser.g b/src/antlr/Parser.g
index 5fd6851..6cc5f1b 100644
--- a/src/antlr/Parser.g
+++ b/src/antlr/Parser.g
@@ -133,9 +133,9 @@ options {
         return res;
     }
 
-    public void addRawUpdate(List<Pair<ColumnDefinition.Raw, Operation.RawUpdate>> operations, ColumnDefinition.Raw key, Operation.RawUpdate update)
+    public void addRawUpdate(List<Pair<ColumnMetadata.Raw, Operation.RawUpdate>> operations, ColumnMetadata.Raw key, Operation.RawUpdate update)
     {
-        for (Pair<ColumnDefinition.Raw, Operation.RawUpdate> p : operations)
+        for (Pair<ColumnMetadata.Raw, Operation.RawUpdate> p : operations)
         {
             if (p.left.equals(key) && !p.right.isCompatibleWith(update))
                 addRecognitionError("Multiple incompatible setting of column " + key);
@@ -262,8 +262,8 @@ selectStatement returns [SelectStatement.RawStatement expr]
     @init {
         Term.Raw limit = null;
         Term.Raw perPartitionLimit = null;
-        Map<ColumnDefinition.Raw, Boolean> orderings = new LinkedHashMap<>();
-        List<ColumnDefinition.Raw> groups = new ArrayList<>();
+        Map<ColumnMetadata.Raw, Boolean> orderings = new LinkedHashMap<>();
+        List<ColumnMetadata.Raw> groups = new ArrayList<>();
         boolean allowFiltering = false;
         boolean isJson = false;
     }
@@ -414,8 +414,8 @@ selectionFunctionArgs returns [List<Selectable.Raw> a]
 
 sident returns [Selectable.Raw id]
     : t=IDENT              { $id = Selectable.RawIdentifier.forUnquoted($t.text); }
-    | t=QUOTED_NAME        { $id = ColumnDefinition.RawIdentifier.forQuoted($t.text); }
-    | k=unreserved_keyword { $id = ColumnDefinition.RawIdentifier.forUnquoted(k); }
+    | t=QUOTED_NAME        { $id = ColumnMetadata.RawIdentifier.forQuoted($t.text); }
+    | k=unreserved_keyword { $id = ColumnMetadata.RawIdentifier.forUnquoted(k); }
     ;
 
 whereClause returns [WhereClause.Builder clause]
@@ -433,14 +433,14 @@ customIndexExpression [WhereClause.Builder clause]
     : 'expr(' idxName[name] ',' t=term ')' { clause.add(new CustomIndexExpression(name, t));}
     ;
 
-orderByClause[Map<ColumnDefinition.Raw, Boolean> orderings]
+orderByClause[Map<ColumnMetadata.Raw, Boolean> orderings]
     @init{
         boolean reversed = false;
     }
     : c=cident (K_ASC | K_DESC { reversed = true; })? { orderings.put(c, reversed); }
     ;
 
-groupByClause[List<ColumnDefinition.Raw> groups]
+groupByClause[List<ColumnMetadata.Raw> groups]
     : c=cident { groups.add(c); }
     ;
 
@@ -459,7 +459,7 @@ insertStatement returns [ModificationStatement.Parsed expr]
 normalInsertStatement [CFName cf] returns [UpdateStatement.ParsedInsert expr]
     @init {
         Attributes.Raw attrs = new Attributes.Raw();
-        List<ColumnDefinition.Raw> columnNames  = new ArrayList<>();
+        List<ColumnMetadata.Raw> columnNames  = new ArrayList<>();
         List<Term.Raw> values = new ArrayList<>();
         boolean ifNotExists = false;
     }
@@ -513,7 +513,7 @@ usingClauseObjective[Attributes.Raw attrs]
 updateStatement returns [UpdateStatement.ParsedUpdate expr]
     @init {
         Attributes.Raw attrs = new Attributes.Raw();
-        List<Pair<ColumnDefinition.Raw, Operation.RawUpdate>> operations = new ArrayList<>();
+        List<Pair<ColumnMetadata.Raw, Operation.RawUpdate>> operations = new ArrayList<>();
         boolean ifExists = false;
     }
     : K_UPDATE cf=columnFamilyName
@@ -526,13 +526,13 @@ updateStatement returns [UpdateStatement.ParsedUpdate expr]
                                                    attrs,
                                                    operations,
                                                    wclause.build(),
-                                                   conditions == null ? Collections.<Pair<ColumnDefinition.Raw, ColumnCondition.Raw>>emptyList() : conditions,
+                                                   conditions == null ? Collections.<Pair<ColumnMetadata.Raw, ColumnCondition.Raw>>emptyList() : conditions,
                                                    ifExists);
      }
     ;
 
-updateConditions returns [List<Pair<ColumnDefinition.Raw, ColumnCondition.Raw>> conditions]
-    @init { conditions = new ArrayList<Pair<ColumnDefinition.Raw, ColumnCondition.Raw>>(); }
+updateConditions returns [List<Pair<ColumnMetadata.Raw, ColumnCondition.Raw>> conditions]
+    @init { conditions = new ArrayList<Pair<ColumnMetadata.Raw, ColumnCondition.Raw>>(); }
     : columnCondition[conditions] ( K_AND columnCondition[conditions] )*
     ;
 
@@ -560,7 +560,7 @@ deleteStatement returns [DeleteStatement.Parsed expr]
                                              attrs,
                                              columnDeletions,
                                              wclause.build(),
-                                             conditions == null ? Collections.<Pair<ColumnDefinition.Raw, ColumnCondition.Raw>>emptyList() : conditions,
+                                             conditions == null ? Collections.<Pair<ColumnMetadata.Raw, ColumnCondition.Raw>>emptyList() : conditions,
                                              ifExists);
       }
     ;
@@ -837,8 +837,8 @@ indexIdent [List<IndexTarget.Raw> targets]
 createMaterializedViewStatement returns [CreateViewStatement expr]
     @init {
         boolean ifNotExists = false;
-        List<ColumnDefinition.Raw> partitionKeys = new ArrayList<>();
-        List<ColumnDefinition.Raw> compositeKeys = new ArrayList<>();
+        List<ColumnMetadata.Raw> partitionKeys = new ArrayList<>();
+        List<ColumnMetadata.Raw> compositeKeys = new ArrayList<>();
     }
     : K_CREATE K_MATERIALIZED K_VIEW (K_IF K_NOT K_EXISTS { ifNotExists = true; })? cf=columnFamilyName K_AS
         K_SELECT sclause=selectors K_FROM basecf=columnFamilyName
@@ -895,7 +895,7 @@ alterTableStatement returns [AlterTableStatement expr]
     @init {
         AlterTableStatement.Type type = null;
         TableAttributes attrs = new TableAttributes();
-        Map<ColumnDefinition.Raw, ColumnDefinition.Raw> renames = new HashMap<ColumnDefinition.Raw, ColumnDefinition.Raw>();
+        Map<ColumnMetadata.Raw, ColumnMetadata.Raw> renames = new HashMap<ColumnMetadata.Raw, ColumnMetadata.Raw>();
         List<AlterTableStatementColumn> colNameList = new ArrayList<AlterTableStatementColumn>();
         Long deleteTimestamp = null;
     }
@@ -1268,10 +1268,10 @@ userPassword[RoleOptions opts]
 // Column Identifiers.  These need to be treated differently from other
 // identifiers because the underlying comparator is not necessarily text. See
 // CASSANDRA-8178 for details.
-cident returns [ColumnDefinition.Raw id]
-    : t=IDENT              { $id = ColumnDefinition.Raw.forUnquoted($t.text); }
-    | t=QUOTED_NAME        { $id = ColumnDefinition.Raw.forQuoted($t.text); }
-    | k=unreserved_keyword { $id = ColumnDefinition.Raw.forUnquoted(k); }
+cident returns [ColumnMetadata.Raw id]
+    : t=IDENT              { $id = ColumnMetadata.Raw.forUnquoted($t.text); }
+    | t=QUOTED_NAME        { $id = ColumnMetadata.Raw.forQuoted($t.text); }
+    | k=unreserved_keyword { $id = ColumnMetadata.Raw.forUnquoted(k); }
     ;
 
 // Column identifiers where the comparator is known to be text
@@ -1480,18 +1480,18 @@ simpleTerm returns [Term.Raw term]
     | '(' c=comparatorType ')' t=simpleTerm   { $term = new TypeCast(c, t); }
     ;
 
-columnOperation[List<Pair<ColumnDefinition.Raw, Operation.RawUpdate>> operations]
+columnOperation[List<Pair<ColumnMetadata.Raw, Operation.RawUpdate>> operations]
     : key=cident columnOperationDifferentiator[operations, key]
     ;
 
-columnOperationDifferentiator[List<Pair<ColumnDefinition.Raw, Operation.RawUpdate>> operations, ColumnDefinition.Raw key]
+columnOperationDifferentiator[List<Pair<ColumnMetadata.Raw, Operation.RawUpdate>> operations, ColumnMetadata.Raw key]
     : '=' normalColumnOperation[operations, key]
     | shorthandColumnOperation[operations, key]
     | '[' k=term ']' collectionColumnOperation[operations, key, k]
     | '.' field=fident udtColumnOperation[operations, key, field]
     ;
 
-normalColumnOperation[List<Pair<ColumnDefinition.Raw, Operation.RawUpdate>> operations, ColumnDefinition.Raw key]
+normalColumnOperation[List<Pair<ColumnMetadata.Raw, Operation.RawUpdate>> operations, ColumnMetadata.Raw key]
     : t=term ('+' c=cident )?
       {
           if (c == null)
@@ -1521,28 +1521,28 @@ normalColumnOperation[List<Pair<ColumnDefinition.Raw, Operation.RawUpdate>> oper
       }
     ;
 
-shorthandColumnOperation[List<Pair<ColumnDefinition.Raw, Operation.RawUpdate>> operations, ColumnDefinition.Raw key]
+shorthandColumnOperation[List<Pair<ColumnMetadata.Raw, Operation.RawUpdate>> operations, ColumnMetadata.Raw key]
     : sig=('+=' | '-=') t=term
       {
           addRawUpdate(operations, key, $sig.text.equals("+=") ? new Operation.Addition(t) : new Operation.Substraction(t));
       }
     ;
 
-collectionColumnOperation[List<Pair<ColumnDefinition.Raw, Operation.RawUpdate>> operations, ColumnDefinition.Raw key, Term.Raw k]
+collectionColumnOperation[List<Pair<ColumnMetadata.Raw, Operation.RawUpdate>> operations, ColumnMetadata.Raw key, Term.Raw k]
     : '=' t=term
       {
           addRawUpdate(operations, key, new Operation.SetElement(k, t));
       }
     ;
 
-udtColumnOperation[List<Pair<ColumnDefinition.Raw, Operation.RawUpdate>> operations, ColumnDefinition.Raw key, FieldIdentifier field]
+udtColumnOperation[List<Pair<ColumnMetadata.Raw, Operation.RawUpdate>> operations, ColumnMetadata.Raw key, FieldIdentifier field]
     : '=' t=term
       {
           addRawUpdate(operations, key, new Operation.SetField(field, t));
       }
     ;
 
-columnCondition[List<Pair<ColumnDefinition.Raw, ColumnCondition.Raw>> conditions]
+columnCondition[List<Pair<ColumnMetadata.Raw, ColumnCondition.Raw>> conditions]
     // Note: we'll reject duplicates later
     : key=cident
         ( op=relationType t=term { conditions.add(Pair.create(key, ColumnCondition.Raw.simpleCondition(t, op))); }
@@ -1634,8 +1634,8 @@ inMarker returns [AbstractMarker.INRaw marker]
     | ':' name=noncol_ident { $marker = newINBindVariables(name); }
     ;
 
-tupleOfIdentifiers returns [List<ColumnDefinition.Raw> ids]
-    @init { $ids = new ArrayList<ColumnDefinition.Raw>(); }
+tupleOfIdentifiers returns [List<ColumnMetadata.Raw> ids]
+    @init { $ids = new ArrayList<ColumnMetadata.Raw>(); }
     : '(' n1=cident { $ids.add(n1); } (',' ni=cident { $ids.add(ni); })* ')'
     ;
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/auth/AuthKeyspace.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/auth/AuthKeyspace.java b/src/java/org/apache/cassandra/auth/AuthKeyspace.java
index a5add9a..a7079dc 100644
--- a/src/java/org/apache/cassandra/auth/AuthKeyspace.java
+++ b/src/java/org/apache/cassandra/auth/AuthKeyspace.java
@@ -19,12 +19,16 @@ package org.apache.cassandra.auth;
 
 import java.util.concurrent.TimeUnit;
 
-import org.apache.cassandra.config.CFMetaData;
-import org.apache.cassandra.config.SchemaConstants;
+import org.apache.cassandra.cql3.statements.CreateTableStatement;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.schema.KeyspaceMetadata;
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.schema.Tables;
 
+import static java.lang.String.format;
+
 public final class AuthKeyspace
 {
     private AuthKeyspace()
@@ -38,52 +42,57 @@ public final class AuthKeyspace
 
     public static final long SUPERUSER_SETUP_DELAY = Long.getLong("cassandra.superuser_setup_delay_ms", 10000);
 
-    private static final CFMetaData Roles =
-        compile(ROLES,
-                "role definitions",
-                "CREATE TABLE %s ("
-                + "role text,"
-                + "is_superuser boolean,"
-                + "can_login boolean,"
-                + "salted_hash text,"
-                + "member_of set<text>,"
-                + "PRIMARY KEY(role))");
+    private static final TableMetadata Roles =
+        parse(ROLES,
+              "role definitions",
+              "CREATE TABLE %s ("
+              + "role text,"
+              + "is_superuser boolean,"
+              + "can_login boolean,"
+              + "salted_hash text,"
+              + "member_of set<text>,"
+              + "PRIMARY KEY(role))");
 
-    private static final CFMetaData RoleMembers =
-        compile(ROLE_MEMBERS,
-                "role memberships lookup table",
-                "CREATE TABLE %s ("
-                + "role text,"
-                + "member text,"
-                + "PRIMARY KEY(role, member))");
+    private static final TableMetadata RoleMembers =
+        parse(ROLE_MEMBERS,
+              "role memberships lookup table",
+              "CREATE TABLE %s ("
+              + "role text,"
+              + "member text,"
+              + "PRIMARY KEY(role, member))");
 
-    private static final CFMetaData RolePermissions =
-        compile(ROLE_PERMISSIONS,
-                "permissions granted to db roles",
-                "CREATE TABLE %s ("
-                + "role text,"
-                + "resource text,"
-                + "permissions set<text>,"
-                + "PRIMARY KEY(role, resource))");
+    private static final TableMetadata RolePermissions =
+        parse(ROLE_PERMISSIONS,
+              "permissions granted to db roles",
+              "CREATE TABLE %s ("
+              + "role text,"
+              + "resource text,"
+              + "permissions set<text>,"
+              + "PRIMARY KEY(role, resource))");
 
-    private static final CFMetaData ResourceRoleIndex =
-        compile(RESOURCE_ROLE_INDEX,
-                "index of db roles with permissions granted on a resource",
-                "CREATE TABLE %s ("
-                + "resource text,"
-                + "role text,"
-                + "PRIMARY KEY(resource, role))");
+    private static final TableMetadata ResourceRoleIndex =
+        parse(RESOURCE_ROLE_INDEX,
+              "index of db roles with permissions granted on a resource",
+              "CREATE TABLE %s ("
+              + "resource text,"
+              + "role text,"
+              + "PRIMARY KEY(resource, role))");
 
 
-    private static CFMetaData compile(String name, String description, String schema)
+    private static TableMetadata parse(String name, String description, String cql)
     {
-        return CFMetaData.compile(String.format(schema, name), SchemaConstants.AUTH_KEYSPACE_NAME)
-                         .comment(description)
-                         .gcGraceSeconds((int) TimeUnit.DAYS.toSeconds(90));
+        return CreateTableStatement.parse(format(cql, name), SchemaConstants.AUTH_KEYSPACE_NAME)
+                                   .id(TableId.forSystemTable(SchemaConstants.AUTH_KEYSPACE_NAME, name))
+                                   .comment(description)
+                                   .dcLocalReadRepairChance(0.0)
+                                   .gcGraceSeconds((int) TimeUnit.DAYS.toSeconds(90))
+                                   .build();
     }
 
     public static KeyspaceMetadata metadata()
     {
-        return KeyspaceMetadata.create(SchemaConstants.AUTH_KEYSPACE_NAME, KeyspaceParams.simple(1), Tables.of(Roles, RoleMembers, RolePermissions, ResourceRoleIndex));
+        return KeyspaceMetadata.create(SchemaConstants.AUTH_KEYSPACE_NAME,
+                                       KeyspaceParams.simple(1),
+                                       Tables.of(Roles, RoleMembers, RolePermissions, ResourceRoleIndex));
     }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/auth/AuthMigrationListener.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/auth/AuthMigrationListener.java b/src/java/org/apache/cassandra/auth/AuthMigrationListener.java
deleted file mode 100644
index 64fe7c6..0000000
--- a/src/java/org/apache/cassandra/auth/AuthMigrationListener.java
+++ /dev/null
@@ -1,53 +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.auth;
-
-import java.util.List;
-
-import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.db.marshal.AbstractType;
-import org.apache.cassandra.service.MigrationListener;
-
-/**
- * MigrationListener implementation that cleans up permissions on dropped resources.
- */
-public class AuthMigrationListener extends MigrationListener
-{
-    public void onDropKeyspace(String ksName)
-    {
-        DatabaseDescriptor.getAuthorizer().revokeAllOn(DataResource.keyspace(ksName));
-        DatabaseDescriptor.getAuthorizer().revokeAllOn(FunctionResource.keyspace(ksName));
-    }
-
-    public void onDropColumnFamily(String ksName, String cfName)
-    {
-        DatabaseDescriptor.getAuthorizer().revokeAllOn(DataResource.table(ksName, cfName));
-    }
-
-    public void onDropFunction(String ksName, String functionName, List<AbstractType<?>> argTypes)
-    {
-        DatabaseDescriptor.getAuthorizer()
-                          .revokeAllOn(FunctionResource.function(ksName, functionName, argTypes));
-    }
-
-    public void onDropAggregate(String ksName, String aggregateName, List<AbstractType<?>> argTypes)
-    {
-        DatabaseDescriptor.getAuthorizer()
-                          .revokeAllOn(FunctionResource.function(ksName, aggregateName, argTypes));
-    }
-}

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/auth/AuthSchemaChangeListener.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/auth/AuthSchemaChangeListener.java b/src/java/org/apache/cassandra/auth/AuthSchemaChangeListener.java
new file mode 100644
index 0000000..6c21d7b
--- /dev/null
+++ b/src/java/org/apache/cassandra/auth/AuthSchemaChangeListener.java
@@ -0,0 +1,53 @@
+/*
+ * 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.auth;
+
+import java.util.List;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.marshal.AbstractType;
+import org.apache.cassandra.schema.SchemaChangeListener;
+
+/**
+ * SchemaChangeListener implementation that cleans up permissions on dropped resources.
+ */
+public class AuthSchemaChangeListener extends SchemaChangeListener
+{
+    public void onDropKeyspace(String ksName)
+    {
+        DatabaseDescriptor.getAuthorizer().revokeAllOn(DataResource.keyspace(ksName));
+        DatabaseDescriptor.getAuthorizer().revokeAllOn(FunctionResource.keyspace(ksName));
+    }
+
+    public void onDropTable(String ksName, String cfName)
+    {
+        DatabaseDescriptor.getAuthorizer().revokeAllOn(DataResource.table(ksName, cfName));
+    }
+
+    public void onDropFunction(String ksName, String functionName, List<AbstractType<?>> argTypes)
+    {
+        DatabaseDescriptor.getAuthorizer()
+                          .revokeAllOn(FunctionResource.function(ksName, functionName, argTypes));
+    }
+
+    public void onDropAggregate(String ksName, String aggregateName, List<AbstractType<?>> argTypes)
+    {
+        DatabaseDescriptor.getAuthorizer()
+                          .revokeAllOn(FunctionResource.function(ksName, aggregateName, argTypes));
+    }
+}

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/auth/CassandraAuthorizer.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/auth/CassandraAuthorizer.java b/src/java/org/apache/cassandra/auth/CassandraAuthorizer.java
index 7f44eef..045a38a 100644
--- a/src/java/org/apache/cassandra/auth/CassandraAuthorizer.java
+++ b/src/java/org/apache/cassandra/auth/CassandraAuthorizer.java
@@ -30,8 +30,8 @@ import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.concurrent.ScheduledExecutors;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.config.Schema;
-import org.apache.cassandra.config.SchemaConstants;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.cql3.*;
 import org.apache.cassandra.cql3.statements.BatchStatement;
 import org.apache.cassandra.cql3.statements.ModificationStatement;
@@ -218,7 +218,7 @@ public class CassandraAuthorizer implements IAuthorizer
         SelectStatement statement;
         // If it exists, read from the legacy user permissions table to handle the case where the cluster
         // is being upgraded and so is running with mixed versions of the authz schema
-        if (Schema.instance.getCFMetaData(SchemaConstants.AUTH_KEYSPACE_NAME, USER_PERMISSIONS) == null)
+        if (Schema.instance.getTableMetadata(SchemaConstants.AUTH_KEYSPACE_NAME, USER_PERMISSIONS) == null)
             statement = authorizeRoleStatement;
         else
         {
@@ -305,7 +305,7 @@ public class CassandraAuthorizer implements IAuthorizer
         Set<PermissionDetails> details = new HashSet<>();
         // If it exists, try the legacy user permissions table first. This is to handle the case
         // where the cluster is being upgraded and so is running with mixed versions of the perms table
-        boolean useLegacyTable = Schema.instance.getCFMetaData(SchemaConstants.AUTH_KEYSPACE_NAME, USER_PERMISSIONS) != null;
+        boolean useLegacyTable = Schema.instance.getTableMetadata(SchemaConstants.AUTH_KEYSPACE_NAME, USER_PERMISSIONS) != null;
         String entityColumnName = useLegacyTable ? USERNAME : ROLE;
         for (UntypedResultSet.Row row : process(buildListQuery(resource, role, useLegacyTable)))
         {
@@ -370,7 +370,7 @@ public class CassandraAuthorizer implements IAuthorizer
 
         // If old user permissions table exists, migrate the legacy authz data to the new table
         // The delay is to give the node a chance to see its peers before attempting the conversion
-        if (Schema.instance.getCFMetaData(SchemaConstants.AUTH_KEYSPACE_NAME, "permissions") != null)
+        if (Schema.instance.getTableMetadata(SchemaConstants.AUTH_KEYSPACE_NAME, "permissions") != null)
         {
             legacyAuthorizeRoleStatement = prepare(USERNAME, USER_PERMISSIONS);
 
@@ -404,7 +404,7 @@ public class CassandraAuthorizer implements IAuthorizer
     {
         try
         {
-            if (Schema.instance.getCFMetaData("system_auth", "permissions") != null)
+            if (Schema.instance.getTableMetadata("system_auth", "permissions") != null)
             {
                 logger.info("Converting legacy permissions data");
                 CQLStatement insertStatement =

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/auth/CassandraRoleManager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/auth/CassandraRoleManager.java b/src/java/org/apache/cassandra/auth/CassandraRoleManager.java
index d371df3..bd1d176 100644
--- a/src/java/org/apache/cassandra/auth/CassandraRoleManager.java
+++ b/src/java/org/apache/cassandra/auth/CassandraRoleManager.java
@@ -32,8 +32,8 @@ import org.slf4j.LoggerFactory;
 import org.apache.cassandra.concurrent.ScheduledExecutors;
 import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.config.Schema;
-import org.apache.cassandra.config.SchemaConstants;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.cql3.*;
 import org.apache.cassandra.cql3.statements.SelectStatement;
 import org.apache.cassandra.db.ConsistencyLevel;
@@ -162,7 +162,7 @@ public class CassandraRoleManager implements IRoleManager
         // it, so we can continue to use the old tables while the cluster is upgraded.
         // Otherwise, we may need to create a default superuser role to enable others
         // to be added.
-        if (Schema.instance.getCFMetaData(SchemaConstants.AUTH_KEYSPACE_NAME, "users") != null)
+        if (Schema.instance.getTableMetadata(SchemaConstants.AUTH_KEYSPACE_NAME, "users") != null)
         {
             legacySelectUserStatement = prepareLegacySelectUserStatement();
 
@@ -399,7 +399,7 @@ public class CassandraRoleManager implements IRoleManager
         try
         {
             // read old data at QUORUM as it may contain the data for the default superuser
-            if (Schema.instance.getCFMetaData("system_auth", "users") != null)
+            if (Schema.instance.getTableMetadata("system_auth", "users") != null)
             {
                 logger.info("Converting legacy users");
                 UntypedResultSet users = QueryProcessor.process("SELECT * FROM system_auth.users",
@@ -414,7 +414,7 @@ public class CassandraRoleManager implements IRoleManager
                 logger.info("Completed conversion of legacy users");
             }
 
-            if (Schema.instance.getCFMetaData("system_auth", "credentials") != null)
+            if (Schema.instance.getTableMetadata("system_auth", "credentials") != null)
             {
                 logger.info("Migrating legacy credentials data to new system table");
                 UntypedResultSet credentials = QueryProcessor.process("SELECT * FROM system_auth.credentials",
@@ -489,7 +489,7 @@ public class CassandraRoleManager implements IRoleManager
             // If it exists, try the legacy users table in case the cluster
             // is in the process of being upgraded and so is running with mixed
             // versions of the authn schema.
-            if (Schema.instance.getCFMetaData(SchemaConstants.AUTH_KEYSPACE_NAME, "users") == null)
+            if (Schema.instance.getTableMetadata(SchemaConstants.AUTH_KEYSPACE_NAME, "users") == null)
                 return getRoleFromTable(name, loadRoleStatement, ROW_TO_ROLE);
             else
             {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/auth/DataResource.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/auth/DataResource.java b/src/java/org/apache/cassandra/auth/DataResource.java
index 0aa24db..c3f5b32 100644
--- a/src/java/org/apache/cassandra/auth/DataResource.java
+++ b/src/java/org/apache/cassandra/auth/DataResource.java
@@ -23,7 +23,7 @@ import com.google.common.base.Objects;
 import com.google.common.collect.Sets;
 import org.apache.commons.lang3.StringUtils;
 
-import org.apache.cassandra.config.Schema;
+import org.apache.cassandra.schema.Schema;
 
 /**
  * The primary type of resource in Cassandra.
@@ -211,7 +211,7 @@ public class DataResource implements IResource
             case KEYSPACE:
                 return Schema.instance.getKeyspaces().contains(keyspace);
             case TABLE:
-                return Schema.instance.getCFMetaData(keyspace, table) != null;
+                return Schema.instance.getTableMetadata(keyspace, table) != null;
         }
         throw new AssertionError();
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/auth/FunctionResource.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/auth/FunctionResource.java b/src/java/org/apache/cassandra/auth/FunctionResource.java
index 01a4de5..f9f51d5 100644
--- a/src/java/org/apache/cassandra/auth/FunctionResource.java
+++ b/src/java/org/apache/cassandra/auth/FunctionResource.java
@@ -28,7 +28,7 @@ import com.google.common.base.Splitter;
 import com.google.common.collect.Sets;
 import org.apache.commons.lang3.StringUtils;
 
-import org.apache.cassandra.config.Schema;
+import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.cql3.CQL3Type;
 import org.apache.cassandra.cql3.functions.Function;
 import org.apache.cassandra.cql3.functions.FunctionName;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java b/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java
index b1b0536..74ef851 100644
--- a/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java
+++ b/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java
@@ -30,8 +30,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.config.Schema;
-import org.apache.cassandra.config.SchemaConstants;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.cql3.QueryOptions;
 import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.cql3.UntypedResultSet;
@@ -133,7 +133,7 @@ public class PasswordAuthenticator implements IAuthenticator
      */
     private SelectStatement authenticationStatement()
     {
-        if (Schema.instance.getCFMetaData(SchemaConstants.AUTH_KEYSPACE_NAME, LEGACY_CREDENTIALS_TABLE) == null)
+        if (Schema.instance.getTableMetadata(SchemaConstants.AUTH_KEYSPACE_NAME, LEGACY_CREDENTIALS_TABLE) == null)
             return authenticateStatement;
         else
         {
@@ -164,7 +164,7 @@ public class PasswordAuthenticator implements IAuthenticator
                                      AuthKeyspace.ROLES);
         authenticateStatement = prepare(query);
 
-        if (Schema.instance.getCFMetaData(SchemaConstants.AUTH_KEYSPACE_NAME, LEGACY_CREDENTIALS_TABLE) != null)
+        if (Schema.instance.getTableMetadata(SchemaConstants.AUTH_KEYSPACE_NAME, LEGACY_CREDENTIALS_TABLE) != null)
             prepareLegacyAuthenticateStatement();
 
         cache = new CredentialsCache(this);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/batchlog/BatchlogManager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/batchlog/BatchlogManager.java b/src/java/org/apache/cassandra/batchlog/BatchlogManager.java
index d23103c..321fca6 100644
--- a/src/java/org/apache/cassandra/batchlog/BatchlogManager.java
+++ b/src/java/org/apache/cassandra/batchlog/BatchlogManager.java
@@ -34,7 +34,7 @@ import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.concurrent.DebuggableScheduledThreadPoolExecutor;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.config.SchemaConstants;
+import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.cql3.UntypedResultSet;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.marshal.BytesType;
@@ -51,6 +51,7 @@ import org.apache.cassandra.io.util.DataOutputBuffer;
 import org.apache.cassandra.net.MessageIn;
 import org.apache.cassandra.net.MessageOut;
 import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.service.WriteResponseHandler;
 import org.apache.cassandra.utils.FBUtilities;
@@ -364,9 +365,9 @@ public class BatchlogManager implements BatchlogManagerMBean
         // truncated.
         private void addMutation(Mutation mutation)
         {
-            for (UUID cfId : mutation.getColumnFamilyIds())
-                if (writtenAt <= SystemKeyspace.getTruncatedAt(cfId))
-                    mutation = mutation.without(cfId);
+            for (TableId tableId : mutation.getTableIds())
+                if (writtenAt <= SystemKeyspace.getTruncatedAt(tableId))
+                    mutation = mutation.without(tableId);
 
             if (!mutation.isEmpty())
                 mutations.add(mutation);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cache/AutoSavingCache.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cache/AutoSavingCache.java b/src/java/org/apache/cassandra/cache/AutoSavingCache.java
index b7616b9..1f06266 100644
--- a/src/java/org/apache/cassandra/cache/AutoSavingCache.java
+++ b/src/java/org/apache/cassandra/cache/AutoSavingCache.java
@@ -34,10 +34,11 @@ import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.common.util.concurrent.MoreExecutors;
 
 import org.apache.cassandra.concurrent.ScheduledExecutors;
-import org.apache.cassandra.config.CFMetaData;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.config.Schema;
-import org.apache.cassandra.config.SchemaConstants;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.compaction.CompactionInfo;
 import org.apache.cassandra.db.compaction.CompactionManager;
@@ -79,8 +80,10 @@ public class AutoSavingCache<K extends CacheKey, V> extends InstrumentingCache<K
      * Sticking with "d" is fine for 3.0 since it has never been released or used by another version
      *
      * "e" introduced with CASSANDRA-11206, omits IndexInfo from key-cache, stores offset into index-file
+     *
+     * "f" introduced with CASSANDRA-9425, changes "keyspace.table.index" in cache keys to TableMetadata.id+TableMetadata.indexName
      */
-    private static final String CURRENT_VERSION = "e";
+    private static final String CURRENT_VERSION = "f";
 
     private static volatile IStreamFactory streamFactory = new IStreamFactory()
     {
@@ -208,13 +211,17 @@ public class AutoSavingCache<K extends CacheKey, V> extends InstrumentingCache<K
                 ArrayDeque<Future<Pair<K, V>>> futures = new ArrayDeque<Future<Pair<K, V>>>();
                 while (in.available() > 0)
                 {
-                    //ksname and cfname are serialized by the serializers in CacheService
+                    //tableId and indexName are serialized by the serializers in CacheService
                     //That is delegated there because there are serializer specific conditions
                     //where a cache key is skipped and not written
-                    String ksname = in.readUTF();
-                    String cfname = in.readUTF();
+                    TableId tableId = TableId.deserialize(in);
+                    String indexName = in.readUTF();
+                    if (indexName.isEmpty())
+                        indexName = null;
 
-                    ColumnFamilyStore cfs = Schema.instance.getColumnFamilyStoreIncludingIndexes(Pair.create(ksname, cfname));
+                    ColumnFamilyStore cfs = Schema.instance.getColumnFamilyStoreInstance(tableId);
+                    if (indexName != null && cfs != null)
+                        cfs = cfs.indexManager.getIndexByName(indexName).getBackingTable().orElse(null);
 
                     Future<Pair<K, V>> entryFuture = cacheLoader.deserialize(in, cfs);
                     // Key cache entry can return null, if the SSTable doesn't exist.
@@ -308,7 +315,7 @@ public class AutoSavingCache<K extends CacheKey, V> extends InstrumentingCache<K
             else
                 type = OperationType.UNKNOWN;
 
-            info = new CompactionInfo(CFMetaData.createFake(SchemaConstants.SYSTEM_KEYSPACE_NAME, cacheType.toString()),
+            info = new CompactionInfo(TableMetadata.minimal(SchemaConstants.SYSTEM_KEYSPACE_NAME, cacheType.toString()),
                                       type,
                                       0,
                                       keysEstimate,
@@ -359,9 +366,11 @@ public class AutoSavingCache<K extends CacheKey, V> extends InstrumentingCache<K
                 {
                     K key = keyIterator.next();
 
-                    ColumnFamilyStore cfs = Schema.instance.getColumnFamilyStoreIncludingIndexes(key.ksAndCFName);
+                    ColumnFamilyStore cfs = Schema.instance.getColumnFamilyStoreInstance(key.tableId);
                     if (cfs == null)
                         continue; // the table or 2i has been dropped.
+                    if (key.indexName != null)
+                        cfs = cfs.indexManager.getIndexByName(key.indexName).getBackingTable().orElse(null);
 
                     cacheLoader.serialize(key, writer, cfs);
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cache/CacheKey.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cache/CacheKey.java b/src/java/org/apache/cassandra/cache/CacheKey.java
index 0e82990..ccab672 100644
--- a/src/java/org/apache/cassandra/cache/CacheKey.java
+++ b/src/java/org/apache/cassandra/cache/CacheKey.java
@@ -17,14 +17,30 @@
  */
 package org.apache.cassandra.cache;
 
-import org.apache.cassandra.utils.Pair;
+import java.util.Objects;
+
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.schema.TableMetadata;
 
 public abstract class CacheKey implements IMeasurableMemory
 {
-    public final Pair<String, String> ksAndCFName;
+    public final TableId tableId;
+    public final String indexName;
+
+    protected CacheKey(TableId tableId, String indexName)
+    {
+        this.tableId = tableId;
+        this.indexName = indexName;
+    }
+
+    public CacheKey(TableMetadata metadata)
+    {
+        this(metadata.id, metadata.indexName().orElse(null));
+    }
 
-    public CacheKey(Pair<String, String> ksAndCFName)
+    public boolean sameTable(TableMetadata tableMetadata)
     {
-        this.ksAndCFName = ksAndCFName;
+        return tableId.equals(tableMetadata.id)
+               && Objects.equals(indexName, tableMetadata.indexName().orElse(null));
     }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cache/CounterCacheKey.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cache/CounterCacheKey.java b/src/java/org/apache/cassandra/cache/CounterCacheKey.java
index 67dd15f..2d123d4 100644
--- a/src/java/org/apache/cassandra/cache/CounterCacheKey.java
+++ b/src/java/org/apache/cassandra/cache/CounterCacheKey.java
@@ -20,47 +20,55 @@ package org.apache.cassandra.cache;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
+import java.util.Objects;
+import java.util.UUID;
 
-import org.apache.cassandra.config.CFMetaData;
-import org.apache.cassandra.config.ColumnDefinition;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.filter.ClusteringIndexFilter;
 import org.apache.cassandra.db.filter.ClusteringIndexNamesFilter;
 import org.apache.cassandra.db.filter.ColumnFilter;
-import org.apache.cassandra.db.rows.CellPath;
 import org.apache.cassandra.db.marshal.CompositeType;
+import org.apache.cassandra.db.marshal.UTF8Type;
+import org.apache.cassandra.db.rows.CellPath;
 import org.apache.cassandra.db.rows.RowIterator;
 import org.apache.cassandra.db.rows.UnfilteredRowIterators;
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.schema.TableMetadataRef;
 import org.apache.cassandra.utils.*;
 
 public final class CounterCacheKey extends CacheKey
 {
-    private static final long EMPTY_SIZE = ObjectSizes.measure(new CounterCacheKey(null, ByteBufferUtil.EMPTY_BYTE_BUFFER, ByteBuffer.allocate(1)));
+    private static final long EMPTY_SIZE = ObjectSizes.measure(new CounterCacheKey(TableMetadata.builder("ks", "tab")
+                                                                                                .addPartitionKeyColumn("pk", UTF8Type.instance)
+                                                                                                .build(), ByteBufferUtil.EMPTY_BYTE_BUFFER, ByteBuffer.allocate(1)));
 
     private final byte[] partitionKey;
     private final byte[] cellName;
 
-    private CounterCacheKey(Pair<String, String> ksAndCFName, byte[] partitionKey, byte[] cellName)
+    private CounterCacheKey(TableMetadata tableMetadata, byte[] partitionKey, byte[] cellName)
     {
-        super(ksAndCFName);
+        super(tableMetadata);
         this.partitionKey = partitionKey;
         this.cellName = cellName;
     }
 
-    private CounterCacheKey(Pair<String, String> ksAndCFName, ByteBuffer partitionKey, ByteBuffer cellName)
+    private CounterCacheKey(TableMetadata tableMetadata, ByteBuffer partitionKey, ByteBuffer cellName)
     {
-        this(ksAndCFName, ByteBufferUtil.getArray(partitionKey), ByteBufferUtil.getArray(cellName));
+        this(tableMetadata, ByteBufferUtil.getArray(partitionKey), ByteBufferUtil.getArray(cellName));
     }
 
-    public static CounterCacheKey create(Pair<String, String> ksAndCFName, ByteBuffer partitionKey, Clustering clustering, ColumnDefinition c, CellPath path)
+    public static CounterCacheKey create(TableMetadata tableMetadata, ByteBuffer partitionKey, Clustering clustering, ColumnMetadata c, CellPath path)
     {
-        return new CounterCacheKey(ksAndCFName, partitionKey, makeCellName(clustering, c, path));
+        return new CounterCacheKey(tableMetadata, partitionKey, makeCellName(clustering, c, path));
     }
 
-    private static ByteBuffer makeCellName(Clustering clustering, ColumnDefinition c, CellPath path)
+    private static ByteBuffer makeCellName(Clustering clustering, ColumnMetadata c, CellPath path)
     {
         int cs = clustering.size();
         ByteBuffer[] values = new ByteBuffer[cs + 1 + (path == null ? 0 : path.size())];
@@ -87,8 +95,8 @@ public final class CounterCacheKey extends CacheKey
      */
     public ByteBuffer readCounterValue(ColumnFamilyStore cfs)
     {
-        CFMetaData metadata = cfs.metadata;
-        assert metadata.ksAndCFName.equals(ksAndCFName);
+        TableMetadata metadata = cfs.metadata();
+        assert metadata.id.equals(tableId) && Objects.equals(metadata.indexName().orElse(null), indexName);
 
         DecoratedKey key = cfs.decorateKey(partitionKey());
 
@@ -97,7 +105,7 @@ public final class CounterCacheKey extends CacheKey
         assert buffers.size() >= clusteringSize + 1; // See makeCellName above
 
         Clustering clustering = Clustering.make(buffers.subList(0, clusteringSize).toArray(new ByteBuffer[clusteringSize]));
-        ColumnDefinition column = metadata.getColumnDefinition(buffers.get(clusteringSize));
+        ColumnMetadata column = metadata.getColumn(buffers.get(clusteringSize));
         // This can theoretically happen if a column is dropped after the cache is saved and we
         // try to load it. Not point if failing in any case, just skip the value.
         if (column == null)
@@ -134,10 +142,10 @@ public final class CounterCacheKey extends CacheKey
         ByteBufferUtil.writeWithLength(cellName, out);
     }
 
-    public static CounterCacheKey read(Pair<String, String> ksAndCFName, DataInputPlus in)
+    public static CounterCacheKey read(TableMetadata tableMetadata, DataInputPlus in)
     throws IOException
     {
-        return new CounterCacheKey(ksAndCFName,
+        return new CounterCacheKey(tableMetadata,
                                    ByteBufferUtil.readBytesWithLength(in),
                                    ByteBufferUtil.readBytesWithLength(in));
     }
@@ -152,8 +160,9 @@ public final class CounterCacheKey extends CacheKey
     @Override
     public String toString()
     {
-        return String.format("CounterCacheKey(%s, %s, %s)",
-                             ksAndCFName,
+        TableMetadataRef tableRef = Schema.instance.getTableMetadataRef(tableId);
+        return String.format("CounterCacheKey(%s, %s, %s, %s)",
+                             tableRef, indexName,
                              ByteBufferUtil.bytesToHex(ByteBuffer.wrap(partitionKey)),
                              ByteBufferUtil.bytesToHex(ByteBuffer.wrap(cellName)));
     }
@@ -161,7 +170,7 @@ public final class CounterCacheKey extends CacheKey
     @Override
     public int hashCode()
     {
-        return Arrays.deepHashCode(new Object[]{ksAndCFName, partitionKey, cellName});
+        return Arrays.deepHashCode(new Object[]{tableId, indexName, partitionKey, cellName});
     }
 
     @Override
@@ -175,7 +184,8 @@ public final class CounterCacheKey extends CacheKey
 
         CounterCacheKey cck = (CounterCacheKey) o;
 
-        return ksAndCFName.equals(cck.ksAndCFName)
+        return tableId.equals(cck.tableId)
+            && Objects.equals(indexName, cck.indexName)
             && Arrays.equals(partitionKey, cck.partitionKey)
             && Arrays.equals(cellName, cck.cellName);
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cache/KeyCacheKey.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cache/KeyCacheKey.java b/src/java/org/apache/cassandra/cache/KeyCacheKey.java
index 222622c..3728cae 100644
--- a/src/java/org/apache/cassandra/cache/KeyCacheKey.java
+++ b/src/java/org/apache/cassandra/cache/KeyCacheKey.java
@@ -19,26 +19,31 @@ package org.apache.cassandra.cache;
 
 import java.nio.ByteBuffer;
 import java.util.Arrays;
+import java.util.Collections;
+import java.util.Objects;
+import java.util.UUID;
 
+import org.apache.cassandra.db.marshal.UTF8Type;
 import org.apache.cassandra.io.sstable.Descriptor;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.ObjectSizes;
-import org.apache.cassandra.utils.Pair;
 
 public class KeyCacheKey extends CacheKey
 {
     public final Descriptor desc;
 
-    private static final long EMPTY_SIZE = ObjectSizes.measure(new KeyCacheKey(null, null, ByteBufferUtil.EMPTY_BYTE_BUFFER));
+    private static final long EMPTY_SIZE = ObjectSizes.measure(new KeyCacheKey(TableMetadata.builder("ks", "tab")
+                                                                                            .addPartitionKeyColumn("pk", UTF8Type.instance)
+                                                                                            .build(), null, ByteBufferUtil.EMPTY_BYTE_BUFFER));
 
     // keeping an array instead of a ByteBuffer lowers the overhead of the key cache working set,
     // without extra copies on lookup since client-provided key ByteBuffers will be array-backed already
     public final byte[] key;
 
-    public KeyCacheKey(Pair<String, String> ksAndCFName, Descriptor desc, ByteBuffer key)
+    public KeyCacheKey(TableMetadata tableMetadata, Descriptor desc, ByteBuffer key)
     {
-
-        super(ksAndCFName);
+        super(tableMetadata);
         this.desc = desc;
         this.key = ByteBufferUtil.getArray(key);
         assert this.key != null;
@@ -62,13 +67,17 @@ public class KeyCacheKey extends CacheKey
 
         KeyCacheKey that = (KeyCacheKey) o;
 
-        return ksAndCFName.equals(that.ksAndCFName) && desc.equals(that.desc) && Arrays.equals(key, that.key);
+        return tableId.equals(that.tableId)
+               && Objects.equals(indexName, that.indexName)
+               && desc.equals(that.desc)
+               && Arrays.equals(key, that.key);
     }
 
     @Override
     public int hashCode()
     {
-        int result = ksAndCFName.hashCode();
+        int result = tableId.hashCode();
+        result = 31 * result + Objects.hashCode(indexName);
         result = 31 * result + desc.hashCode();
         result = 31 * result + Arrays.hashCode(key);
         return result;