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 <[email protected]> Authored: Thu Nov 10 01:16:59 2016 +0000 Committer: Aleksey Yeschenko <[email protected]> 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;
