You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by sn...@apache.org on 2016/08/18 01:45:33 UTC

[6/6] cassandra git commit: Let DatabaseDescriptor not implicitly startup services

Let DatabaseDescriptor not implicitly startup services

patch by Robert Stupp; reviewed by Blake Eggleston for CASSANDRA-9054


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

Branch: refs/heads/trunk
Commit: 9797511c56df4e9c7db964a6b83e67642df96c2d
Parents: 8580047
Author: Robert Stupp <sn...@snazy.de>
Authored: Thu Aug 18 11:44:03 2016 +1000
Committer: Robert Stupp <sn...@snazy.de>
Committed: Thu Aug 18 11:44:03 2016 +1000

----------------------------------------------------------------------
 CHANGES.txt                                     |   1 +
 NEWS.txt                                        |   6 +
 .../org/apache/cassandra/auth/AuthConfig.java   | 113 +++
 .../org/apache/cassandra/auth/AuthKeyspace.java |   7 +-
 .../cassandra/auth/CassandraAuthorizer.java     |  45 +-
 .../cassandra/auth/CassandraRoleManager.java    |  41 +-
 .../cassandra/auth/PasswordAuthenticator.java   |  11 +-
 .../cassandra/batchlog/BatchlogManager.java     |   7 +-
 .../batchlog/LegacyBatchlogMigrator.java        |   9 +-
 .../apache/cassandra/cache/AutoSavingCache.java |   4 +-
 .../org/apache/cassandra/config/CFMetaData.java |   6 +-
 .../org/apache/cassandra/config/Config.java     |  33 +-
 .../cassandra/config/DatabaseDescriptor.java    | 834 ++++++++++---------
 .../org/apache/cassandra/config/Schema.java     |  50 +-
 .../cassandra/config/SchemaConstants.java       |  74 ++
 .../config/YamlConfigurationLoader.java         |   4 +-
 .../apache/cassandra/cql3/QueryProcessor.java   |   4 +-
 .../cassandra/cql3/functions/FunctionName.java  |   8 +-
 .../cql3/statements/AlterKeyspaceStatement.java |   3 +-
 .../statements/CreateKeyspaceStatement.java     |   6 +-
 .../cql3/statements/CreateTableStatement.java   |   4 +-
 .../statements/ListPermissionsStatement.java    |   3 +-
 .../cql3/statements/ListRolesStatement.java     |   3 +-
 .../cql3/statements/ListUsersStatement.java     |   3 +-
 .../PermissionsManagementStatement.java         |   4 +-
 .../apache/cassandra/db/ColumnFamilyStore.java  |   4 +-
 src/java/org/apache/cassandra/db/Keyspace.java  |   4 +-
 .../org/apache/cassandra/db/LegacyLayout.java   |   5 +-
 src/java/org/apache/cassandra/db/Memtable.java  |  33 +-
 .../org/apache/cassandra/db/ReadCommand.java    |   2 +-
 .../org/apache/cassandra/db/SystemKeyspace.java |  43 +-
 .../db/commitlog/CommitLogReplayer.java         |  10 +-
 .../cassandra/hadoop/cql3/CqlInputFormat.java   |   3 +-
 .../apache/cassandra/hints/HintsDispatcher.java |   3 +-
 .../cassandra/hints/LegacyHintsMigrator.java    |  15 +-
 .../io/compress/DeflateCompressor.java          |  20 +-
 .../io/sstable/AbstractSSTableSimpleWriter.java |   6 +-
 .../apache/cassandra/io/sstable/Descriptor.java |   9 +
 .../io/sstable/format/SSTableFormat.java        |   5 +
 .../io/sstable/format/SSTableReader.java        |  15 +-
 .../locator/DynamicEndpointSnitch.java          |  25 +-
 .../apache/cassandra/metrics/TableMetrics.java  |   4 +-
 .../org/apache/cassandra/net/MessageIn.java     |   2 +-
 .../org/apache/cassandra/net/MessageOut.java    |   3 +-
 .../apache/cassandra/net/MessagingService.java  | 109 ++-
 .../apache/cassandra/repair/RepairRunnable.java |   3 +-
 .../repair/SystemDistributedKeyspace.java       |  37 +-
 .../cassandra/schema/KeyspaceMetadata.java      |   4 +-
 .../cassandra/schema/LegacySchemaMigrator.java  |  40 +-
 .../apache/cassandra/schema/SchemaKeyspace.java |  52 +-
 .../cassandra/service/CassandraDaemon.java      |  21 +-
 .../apache/cassandra/service/ClientState.java   |  23 +-
 .../service/EmbeddedCassandraService.java       |   5 +-
 .../cassandra/service/MigrationManager.java     |   3 +-
 .../apache/cassandra/service/StartupChecks.java |   3 +-
 .../apache/cassandra/service/StorageProxy.java  |  13 +-
 .../cassandra/service/StorageService.java       |  21 +-
 .../streaming/messages/FileMessageHeader.java   |   3 +-
 .../cassandra/thrift/TServerCustomFactory.java  |   6 +-
 .../apache/cassandra/thrift/ThriftServer.java   |  12 +-
 .../cassandra/thrift/ThriftValidation.java      |   3 +-
 .../org/apache/cassandra/tools/BulkLoader.java  |   3 +-
 .../org/apache/cassandra/tools/NodeProbe.java   |   4 +-
 .../apache/cassandra/tools/SSTableExport.java   |   4 +-
 .../tools/SSTableRepairedAtSetter.java          |   4 +-
 .../cassandra/tools/StandaloneSSTableUtil.java  |   2 +
 .../cassandra/tools/StandaloneScrubber.java     |   2 +-
 .../cassandra/tools/StandaloneSplitter.java     |   2 +-
 .../cassandra/tools/StandaloneUpgrader.java     |   3 +-
 .../cassandra/tools/StandaloneVerifier.java     |   2 +-
 src/java/org/apache/cassandra/tools/Util.java   |  13 +-
 .../cassandra/tools/nodetool/Cleanup.java       |   6 +-
 .../apache/cassandra/tools/nodetool/Repair.java |   6 +-
 .../apache/cassandra/tracing/TraceKeyspace.java |   7 +-
 .../org/apache/cassandra/transport/Client.java  |   4 +-
 .../org/apache/cassandra/utils/FBUtilities.java |  15 -
 .../utils/NativeSSTableLoaderClient.java        |   9 +-
 .../db/commitlog/CommitLogStressTest.java       |   5 +
 .../locator/DynamicEndpointSnitchLongTest.java  |   5 +
 .../cassandra/streaming/LongStreamingTest.java  |   3 +
 .../auth/jmx/AuthorizationProxyTest.java        |   8 +
 .../cassandra/batchlog/BatchlogManagerTest.java |  28 +-
 .../DebuggableThreadPoolExecutorTest.java       |   8 +
 .../apache/cassandra/config/CFMetaDataTest.java |   8 +-
 .../cassandra/config/ColumnDefinitionTest.java  |   7 +
 .../config/DatabaseDescriptorRefTest.java       | 251 ++++++
 .../config/DatabaseDescriptorTest.java          |   6 +
 .../org/apache/cassandra/cql3/CQLTester.java    |   7 +-
 .../cassandra/cql3/ColumnConditionTest.java     |   8 +
 .../cassandra/cql3/PstmtPersistenceTest.java    |   7 +-
 .../ClusteringColumnRestrictionsTest.java       |   8 +
 .../miscellaneous/TombstonesTest.java           |   1 +
 .../validation/operations/AggregationTest.java  |   4 +-
 .../cql3/validation/operations/AlterTest.java   |  11 +-
 .../cql3/validation/operations/CreateTest.java  |  13 +-
 .../operations/InsertUpdateIfConditionTest.java |  11 +-
 test/unit/org/apache/cassandra/db/CellTest.java |   6 +
 .../org/apache/cassandra/db/ColumnsTest.java    |   5 +
 .../apache/cassandra/db/DirectoriesTest.java    |   3 +
 .../apache/cassandra/db/LegacyCellNameTest.java |   8 +
 .../apache/cassandra/db/ReadCommandTest.java    |   3 +
 .../apache/cassandra/db/ReadMessageTest.java    |   7 +-
 .../db/RecoveryManagerFlushedTest.java          |   6 +-
 test/unit/org/apache/cassandra/db/RowTest.java  |   2 +
 .../db/SinglePartitionSliceCommandTest.java     |   3 +
 .../apache/cassandra/db/SystemKeyspaceTest.java |  15 +-
 .../apache/cassandra/db/TransformerTest.java    |   5 +
 .../db/aggregation/GroupMakerTest.java          |   7 +
 .../commitlog/CommitLogSegmentManagerTest.java  |   5 +-
 .../db/commitlog/CommitLogUpgradeTest.java      |   5 +
 .../db/commitlog/SegmentReaderTest.java         |   8 +
 .../db/commitlog/SnapshotDeletingTest.java      |   2 +
 .../db/compaction/CompactionIteratorTest.java   |   7 +-
 .../db/context/CounterContextTest.java          |   8 +
 .../cassandra/db/lifecycle/HelpersTest.java     |   2 +
 .../cassandra/db/lifecycle/TrackerTest.java     |   1 +
 .../apache/cassandra/db/lifecycle/ViewTest.java |   2 +
 .../cassandra/db/marshal/TypeParserTest.java    |   7 +
 .../rows/RowAndDeletionMergeIteratorTest.java   |   3 +
 .../org/apache/cassandra/db/rows/RowsTest.java  |   2 +
 .../rows/UnfilteredRowIteratorsMergeTest.java   |   5 +
 .../apache/cassandra/db/view/ViewUtilsTest.java |   1 +
 .../apache/cassandra/dht/BootStrapperTest.java  |   1 +
 .../apache/cassandra/dht/KeyCollisionTest.java  |   1 +
 .../cassandra/dht/PartitionerTestCase.java      |   8 +
 .../org/apache/cassandra/dht/RangeTest.java     |   9 +
 .../cassandra/dht/StreamStateStoreTest.java     |  10 +-
 .../apache/cassandra/gms/EndpointStateTest.java |   7 +
 .../cassandra/gms/FailureDetectorTest.java      |   2 +
 .../org/apache/cassandra/gms/GossiperTest.java  |   5 +
 .../cassandra/gms/SerializationsTest.java       |   8 +
 .../hints/ChecksummedDataInputTest.java         |   8 +
 .../hints/LegacyHintsMigratorTest.java          |   5 +-
 .../index/internal/CassandraIndexTest.java      |   5 +-
 .../index/sasi/disk/OnDiskIndexTest.java        |   9 +
 .../index/sasi/disk/TokenTreeTest.java          |  10 +
 .../CompressedRandomAccessReaderTest.java       |   9 +
 .../CompressedSequentialWriterTest.java         |   8 +
 .../io/sstable/CQLSSTableWriterClientTest.java  |   4 +-
 .../io/sstable/CQLSSTableWriterTest.java        |   7 +
 .../cassandra/io/sstable/IndexSummaryTest.java  |   8 +
 .../io/sstable/SSTableWriterTestBase.java       |   2 +
 .../sstable/format/ClientModeSSTableTest.java   |   4 +-
 .../format/SSTableFlushObserverTest.java        |  10 +-
 .../metadata/MetadataSerializerTest.java        |   9 +-
 .../io/util/BufferedRandomAccessFileTest.java   |  14 +-
 .../util/ChecksummedRandomAccessReaderTest.java |   9 +
 .../util/ChecksummedSequentialWriterTest.java   |   8 +
 .../cassandra/io/util/DataOutputTest.java       |   8 +
 .../apache/cassandra/io/util/FileUtilsTest.java |   7 +
 .../cassandra/io/util/MmappedRegionsTest.java   |   8 +
 .../io/util/RandomAccessReaderTest.java         |   8 +
 .../cassandra/io/util/SequentialWriterTest.java |   8 +
 .../cassandra/locator/CloudstackSnitchTest.java |   2 +
 .../locator/DynamicEndpointSnitchTest.java      |   8 +
 .../apache/cassandra/locator/EC2SnitchTest.java |   2 +
 .../locator/GoogleCloudSnitchTest.java          |   2 +
 .../GossipingPropertyFileSnitchTest.java        |   9 +
 .../locator/NetworkTopologyStrategyTest.java    |   7 +
 .../locator/OldNetworkTopologyStrategyTest.java |   8 +
 .../locator/PropertyFileSnitchTest.java         |   8 +
 .../cassandra/locator/TokenMetadataTest.java    |   1 +
 .../metrics/HintedHandOffMetricsTest.java       |   7 +
 .../cassandra/net/MessagingServiceTest.java     |   9 +
 .../cassandra/net/WriteCallbackInfoTest.java    |   7 +
 .../cassandra/repair/RepairSessionTest.java     |   8 +
 .../schema/LegacySchemaMigratorTest.java        |   7 +-
 .../cassandra/schema/SchemaKeyspaceTest.java    |   9 +-
 .../cassandra/security/EncryptionUtilsTest.java |   8 +
 .../cassandra/service/DataResolverTest.java     |   2 +
 .../service/LeaveAndBootstrapTest.java          |   2 +
 .../org/apache/cassandra/service/MoveTest.java  |   1 +
 .../service/NativeTransportServiceTest.java     |   6 +
 .../apache/cassandra/service/RemoveTest.java    |   5 +
 .../cassandra/service/SerializationsTest.java   |   2 +
 .../cassandra/service/StartupChecksTest.java    |   5 +-
 .../cassandra/service/StorageProxyTest.java     |   1 +
 .../service/StorageServiceServerTest.java       |   6 +-
 .../service/pager/PagingStateTest.java          |   8 +
 .../streaming/StreamingTransferTest.java        |   5 +
 .../compression/CompressedInputStreamTest.java  |   9 +
 .../apache/cassandra/tools/BulkLoaderTest.java  |  66 ++
 .../apache/cassandra/tools/GetVersionTest.java  |  40 +
 .../tools/SSTableExpiredBlockersTest.java       |  50 ++
 .../cassandra/tools/SSTableExportTest.java      |  51 ++
 .../tools/SSTableLevelResetterTest.java         |  49 ++
 .../tools/SSTableMetadataViewerTest.java        |  52 ++
 .../tools/SSTableOfflineRelevelTest.java        |  50 ++
 .../tools/SSTableRepairedAtSetterTest.java      |  52 ++
 .../tools/StandaloneSSTableUtilTest.java        |  49 ++
 .../cassandra/tools/StandaloneScrubberTest.java |  49 ++
 .../cassandra/tools/StandaloneSplitterTest.java |  52 ++
 .../cassandra/tools/StandaloneUpgraderTest.java |  49 ++
 .../cassandra/tools/StandaloneVerifierTest.java |  49 ++
 .../org/apache/cassandra/tools/ToolsTester.java | 296 +++++++
 .../apache/cassandra/tracing/TracingTest.java   |   7 +
 .../cassandra/transport/ProtocolErrorTest.java  |   8 +
 .../cassandra/triggers/TriggerExecutorTest.java |   8 +
 .../utils/JVMStabilityInspectorTest.java        |   7 +
 .../apache/cassandra/utils/MerkleTreesTest.java |   3 +
 .../cassandra/utils/SerializationsTest.java     |   8 +
 .../concurrent/AbstractTransactionalTest.java   |   7 +
 .../cassandra/utils/memory/BufferPoolTest.java  |   8 +
 .../src/org/apache/cassandra/stress/Stress.java |   3 +
 204 files changed, 2979 insertions(+), 872 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/9797511c/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index fa7ec69..07c18c5 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 3.10
+ * Let DatabaseDescriptor not implicitly startup services (CASSANDRA-9054)
  * Fix clustering indexes in presence of static columns in SASI (CASSANDRA-12378)
  * Fix queries on columns with reversed type on SASI indexes (CASSANDRA-12223)
  * Added slow query log (CASSANDRA-12403)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/9797511c/NEWS.txt
----------------------------------------------------------------------
diff --git a/NEWS.txt b/NEWS.txt
index 53cb389..a22fdd8 100644
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -82,6 +82,12 @@ Upgrading
       that jar, but if you need that jar for backward compatiblity until you do so, you should use the version provided
       on previous Cassandra branch, like the 3.0 branch (by design, the functionality provided by that jar are stable
       accross versions so using the 3.0 jar for a client connecting to 3.x should work without issues).
+    - (Tools development) DatabaseDescriptor no longer implicitly startups components/services like
+      commit log replay. This may break existing 3rd party tools and clients. In order to startup
+      a standalone tool or client application, use the DatabaseDescriptor.toolInitialization() or
+      DatabaseDescriptor.clientInitialization() methods. Tool initialization sets up partitioner,
+      snitch, encryption context. Client initialization just applies the configuration but does not
+      setup anything.
 
 3.8
 ===

http://git-wip-us.apache.org/repos/asf/cassandra/blob/9797511c/src/java/org/apache/cassandra/auth/AuthConfig.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/auth/AuthConfig.java b/src/java/org/apache/cassandra/auth/AuthConfig.java
new file mode 100644
index 0000000..c3dd9a9
--- /dev/null
+++ b/src/java/org/apache/cassandra/auth/AuthConfig.java
@@ -0,0 +1,113 @@
+/*
+ * 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 org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.config.Config;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.cassandra.utils.FBUtilities;
+
+/**
+ * Only purpose is to Initialize authentication/authorization via {@link #applyAuthz()}.
+ * This is in this separate class as it implicitly initializes schema stuff (via classes referenced in here).
+ */
+public final class AuthConfig
+{
+    private static final Logger logger = LoggerFactory.getLogger(AuthConfig.class);
+
+    private static boolean initialized;
+
+    public static void applyAuthz()
+    {
+        // some tests need this
+        if (initialized)
+            return;
+
+        initialized = true;
+
+        Config conf = DatabaseDescriptor.getRawConfig();
+
+        IAuthenticator authenticator = new AllowAllAuthenticator();
+
+        /* Authentication, authorization and role management backend, implementing IAuthenticator, IAuthorizer & IRoleMapper*/
+        if (conf.authenticator != null)
+            authenticator = FBUtilities.newAuthenticator(conf.authenticator);
+
+        // the configuration options regarding credentials caching are only guaranteed to
+        // work with PasswordAuthenticator, so log a message if some other authenticator
+        // is in use and non-default values are detected
+        if (!(authenticator instanceof PasswordAuthenticator)
+            && (conf.credentials_update_interval_in_ms != -1
+                || conf.credentials_validity_in_ms != 2000
+                || conf.credentials_cache_max_entries != 1000))
+        {
+            logger.info("Configuration options credentials_update_interval_in_ms, credentials_validity_in_ms and " +
+                        "credentials_cache_max_entries may not be applicable for the configured authenticator ({})",
+                        authenticator.getClass().getName());
+        }
+
+        DatabaseDescriptor.setAuthenticator(authenticator);
+
+        // authorizer
+
+        IAuthorizer authorizer = new AllowAllAuthorizer();
+
+        if (conf.authorizer != null)
+            authorizer = FBUtilities.newAuthorizer(conf.authorizer);
+
+        if (!authenticator.requireAuthentication() && authorizer.requireAuthorization())
+            throw new ConfigurationException(conf.authenticator + " can't be used with " + conf.authorizer, false);
+
+        DatabaseDescriptor.setAuthorizer(authorizer);
+
+        // role manager
+
+        IRoleManager roleManager;
+        if (conf.role_manager != null)
+            roleManager = FBUtilities.newRoleManager(conf.role_manager);
+        else
+            roleManager = new CassandraRoleManager();
+
+        if (authenticator instanceof PasswordAuthenticator && !(roleManager instanceof CassandraRoleManager))
+            throw new ConfigurationException("CassandraRoleManager must be used with PasswordAuthenticator", false);
+
+        DatabaseDescriptor.setRoleManager(roleManager);
+
+        // authenticator
+
+        IInternodeAuthenticator internodeAuthenticator;
+        if (conf.internode_authenticator != null)
+            internodeAuthenticator = FBUtilities.construct(conf.internode_authenticator, "internode_authenticator");
+        else
+            internodeAuthenticator = new AllowAllInternodeAuthenticator();
+
+        DatabaseDescriptor.setInternodeAuthenticator(internodeAuthenticator);
+
+        // Validate at last to have authenticator, authorizer, role-manager and internode-auth setup
+        // in case these rely on each other.
+
+        authenticator.validateConfiguration();
+        authorizer.validateConfiguration();
+        roleManager.validateConfiguration();
+        internodeAuthenticator.validateConfiguration();
+    }
+}

http://git-wip-us.apache.org/repos/asf/cassandra/blob/9797511c/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 7ba083c..a5add9a 100644
--- a/src/java/org/apache/cassandra/auth/AuthKeyspace.java
+++ b/src/java/org/apache/cassandra/auth/AuthKeyspace.java
@@ -20,6 +20,7 @@ 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.schema.KeyspaceMetadata;
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.schema.Tables;
@@ -30,8 +31,6 @@ public final class AuthKeyspace
     {
     }
 
-    public static final String NAME = "system_auth";
-
     public static final String ROLES = "roles";
     public static final String ROLE_MEMBERS = "role_members";
     public static final String ROLE_PERMISSIONS = "role_permissions";
@@ -78,13 +77,13 @@ public final class AuthKeyspace
 
     private static CFMetaData compile(String name, String description, String schema)
     {
-        return CFMetaData.compile(String.format(schema, name), NAME)
+        return CFMetaData.compile(String.format(schema, name), SchemaConstants.AUTH_KEYSPACE_NAME)
                          .comment(description)
                          .gcGraceSeconds((int) TimeUnit.DAYS.toSeconds(90));
     }
 
     public static KeyspaceMetadata metadata()
     {
-        return KeyspaceMetadata.create(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/9797511c/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 65ee7ec..8c3485d 100644
--- a/src/java/org/apache/cassandra/auth/CassandraAuthorizer.java
+++ b/src/java/org/apache/cassandra/auth/CassandraAuthorizer.java
@@ -31,6 +31,7 @@ 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.cql3.*;
 import org.apache.cassandra.cql3.statements.BatchStatement;
 import org.apache.cassandra.cql3.statements.ModificationStatement;
@@ -123,7 +124,7 @@ public class CassandraAuthorizer implements IAuthorizer
         try
         {
             UntypedResultSet rows = process(String.format("SELECT resource FROM %s.%s WHERE role = '%s'",
-                                                          AuthKeyspace.NAME,
+                                                          SchemaConstants.AUTH_KEYSPACE_NAME,
                                                           AuthKeyspace.ROLE_PERMISSIONS,
                                                           escape(revokee.getRoleName())));
 
@@ -132,7 +133,7 @@ public class CassandraAuthorizer implements IAuthorizer
             {
                 statements.add(
                     QueryProcessor.getStatement(String.format("DELETE FROM %s.%s WHERE resource = '%s' AND role = '%s'",
-                                                              AuthKeyspace.NAME,
+                                                              SchemaConstants.AUTH_KEYSPACE_NAME,
                                                               AuthKeyspace.RESOURCE_ROLE_INDEX,
                                                               escape(row.getString("resource")),
                                                               escape(revokee.getRoleName())),
@@ -141,7 +142,7 @@ public class CassandraAuthorizer implements IAuthorizer
             }
 
             statements.add(QueryProcessor.getStatement(String.format("DELETE FROM %s.%s WHERE role = '%s'",
-                                                                     AuthKeyspace.NAME,
+                                                                     SchemaConstants.AUTH_KEYSPACE_NAME,
                                                                      AuthKeyspace.ROLE_PERMISSIONS,
                                                                      escape(revokee.getRoleName())),
                                                        ClientState.forInternalCalls()).statement);
@@ -162,7 +163,7 @@ public class CassandraAuthorizer implements IAuthorizer
         try
         {
             UntypedResultSet rows = process(String.format("SELECT role FROM %s.%s WHERE resource = '%s'",
-                                                          AuthKeyspace.NAME,
+                                                          SchemaConstants.AUTH_KEYSPACE_NAME,
                                                           AuthKeyspace.RESOURCE_ROLE_INDEX,
                                                           escape(droppedResource.getName())));
 
@@ -170,7 +171,7 @@ public class CassandraAuthorizer implements IAuthorizer
             for (UntypedResultSet.Row row : rows)
             {
                 statements.add(QueryProcessor.getStatement(String.format("DELETE FROM %s.%s WHERE role = '%s' AND resource = '%s'",
-                                                                         AuthKeyspace.NAME,
+                                                                         SchemaConstants.AUTH_KEYSPACE_NAME,
                                                                          AuthKeyspace.ROLE_PERMISSIONS,
                                                                          escape(row.getString("role")),
                                                                          escape(droppedResource.getName())),
@@ -178,9 +179,9 @@ public class CassandraAuthorizer implements IAuthorizer
             }
 
             statements.add(QueryProcessor.getStatement(String.format("DELETE FROM %s.%s WHERE resource = '%s'",
-                                                                                            AuthKeyspace.NAME,
-                                                                                            AuthKeyspace.RESOURCE_ROLE_INDEX,
-                                                                                            escape(droppedResource.getName())),
+                                                                     SchemaConstants.AUTH_KEYSPACE_NAME,
+                                                                     AuthKeyspace.RESOURCE_ROLE_INDEX,
+                                                                     escape(droppedResource.getName())),
                                                                                ClientState.forInternalCalls()).statement);
 
             executeLoggedBatch(statements);
@@ -216,7 +217,7 @@ public class CassandraAuthorizer implements IAuthorizer
 
         // 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
-        SelectStatement statement = Schema.instance.getCFMetaData(AuthKeyspace.NAME, USER_PERMISSIONS) == null
+        SelectStatement statement = Schema.instance.getCFMetaData(SchemaConstants.AUTH_KEYSPACE_NAME, USER_PERMISSIONS) == null
                                     ? authorizeRoleStatement
                                     : legacyAuthorizeRoleStatement;
         ResultMessage.Rows rows = statement.execute(QueryState.forInternalCalls(), options, System.nanoTime());
@@ -236,7 +237,7 @@ public class CassandraAuthorizer implements IAuthorizer
             throws RequestExecutionException
     {
         process(String.format("UPDATE %s.%s SET permissions = permissions %s {%s} WHERE role = '%s' AND resource = '%s'",
-                              AuthKeyspace.NAME,
+                              SchemaConstants.AUTH_KEYSPACE_NAME,
                               AuthKeyspace.ROLE_PERMISSIONS,
                               op,
                               "'" + StringUtils.join(permissions, "','") + "'",
@@ -248,17 +249,17 @@ public class CassandraAuthorizer implements IAuthorizer
     private void removeLookupEntry(IResource resource, RoleResource role) throws RequestExecutionException
     {
         process(String.format("DELETE FROM %s.%s WHERE resource = '%s' and role = '%s'",
-                AuthKeyspace.NAME,
-                AuthKeyspace.RESOURCE_ROLE_INDEX,
-                escape(resource.getName()),
-                escape(role.getRoleName())));
+                              SchemaConstants.AUTH_KEYSPACE_NAME,
+                              AuthKeyspace.RESOURCE_ROLE_INDEX,
+                              escape(resource.getName()),
+                              escape(role.getRoleName())));
     }
 
     // Adds an entry to the inverted index table (from resource -> role with defined permissions)
     private void addLookupEntry(IResource resource, RoleResource role) throws RequestExecutionException
     {
         process(String.format("INSERT INTO %s.%s (resource, role) VALUES ('%s','%s')",
-                              AuthKeyspace.NAME,
+                              SchemaConstants.AUTH_KEYSPACE_NAME,
                               AuthKeyspace.RESOURCE_ROLE_INDEX,
                               escape(resource.getName()),
                               escape(role.getRoleName())));
@@ -297,7 +298,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(AuthKeyspace.NAME, USER_PERMISSIONS) != null;
+        boolean useLegacyTable = Schema.instance.getCFMetaData(SchemaConstants.AUTH_KEYSPACE_NAME, USER_PERMISSIONS) != null;
         String entityColumnName = useLegacyTable ? USERNAME : ROLE;
         for (UntypedResultSet.Row row : process(buildListQuery(resource, role, useLegacyTable)))
         {
@@ -320,7 +321,7 @@ public class CassandraAuthorizer implements IAuthorizer
     {
         String tableName = useLegacyTable ? USER_PERMISSIONS : AuthKeyspace.ROLE_PERMISSIONS;
         String entityName = useLegacyTable ? USERNAME : ROLE;
-        List<String> vars = Lists.newArrayList(AuthKeyspace.NAME, tableName);
+        List<String> vars = Lists.newArrayList(SchemaConstants.AUTH_KEYSPACE_NAME, tableName);
         List<String> conditions = new ArrayList<>();
 
         if (resource != null)
@@ -349,7 +350,7 @@ public class CassandraAuthorizer implements IAuthorizer
 
     public Set<DataResource> protectedResources()
     {
-        return ImmutableSet.of(DataResource.table(AuthKeyspace.NAME, AuthKeyspace.ROLE_PERMISSIONS));
+        return ImmutableSet.of(DataResource.table(SchemaConstants.AUTH_KEYSPACE_NAME, AuthKeyspace.ROLE_PERMISSIONS));
     }
 
     public void validateConfiguration() throws ConfigurationException
@@ -362,7 +363,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(AuthKeyspace.NAME, "permissions") != null)
+        if (Schema.instance.getCFMetaData(SchemaConstants.AUTH_KEYSPACE_NAME, "permissions") != null)
         {
             legacyAuthorizeRoleStatement = prepare(USERNAME, USER_PERMISSIONS);
 
@@ -379,7 +380,7 @@ public class CassandraAuthorizer implements IAuthorizer
     private SelectStatement prepare(String entityname, String permissionsTable)
     {
         String query = String.format("SELECT permissions FROM %s.%s WHERE %s = ? AND resource = ?",
-                                     AuthKeyspace.NAME,
+                                     SchemaConstants.AUTH_KEYSPACE_NAME,
                                      permissionsTable,
                                      entityname);
         return (SelectStatement) QueryProcessor.getStatement(query, ClientState.forInternalCalls()).statement;
@@ -402,12 +403,12 @@ public class CassandraAuthorizer implements IAuthorizer
                 CQLStatement insertStatement =
                     QueryProcessor.getStatement(String.format("INSERT INTO %s.%s (role, resource, permissions) " +
                                                               "VALUES (?, ?, ?)",
-                                                              AuthKeyspace.NAME,
+                                                              SchemaConstants.AUTH_KEYSPACE_NAME,
                                                               AuthKeyspace.ROLE_PERMISSIONS),
                                                 ClientState.forInternalCalls()).statement;
                 CQLStatement indexStatement =
                     QueryProcessor.getStatement(String.format("INSERT INTO %s.%s (resource, role) VALUES (?,?)",
-                                                              AuthKeyspace.NAME,
+                                                              SchemaConstants.AUTH_KEYSPACE_NAME,
                                                               AuthKeyspace.RESOURCE_ROLE_INDEX),
                                                 ClientState.forInternalCalls()).statement;
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/9797511c/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 f2a2cfb..14f0e58 100644
--- a/src/java/org/apache/cassandra/auth/CassandraRoleManager.java
+++ b/src/java/org/apache/cassandra/auth/CassandraRoleManager.java
@@ -33,6 +33,7 @@ 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.cql3.*;
 import org.apache.cassandra.cql3.statements.SelectStatement;
 import org.apache.cassandra.db.ConsistencyLevel;
@@ -142,17 +143,17 @@ public class CassandraRoleManager implements IRoleManager
     public void setup()
     {
         loadRoleStatement = (SelectStatement) prepare("SELECT * from %s.%s WHERE role = ?",
-                                                      AuthKeyspace.NAME,
+                                                      SchemaConstants.AUTH_KEYSPACE_NAME,
                                                       AuthKeyspace.ROLES);
         // If the old users table exists, we may need to migrate the legacy authn
         // data to the new table. We also need to prepare a statement to read from
         // 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(AuthKeyspace.NAME, "users") != null)
+        if (Schema.instance.getCFMetaData(SchemaConstants.AUTH_KEYSPACE_NAME, "users") != null)
         {
              legacySelectUserStatement = (SelectStatement) prepare("SELECT * FROM %s.%s WHERE name = ?",
-                                                                   AuthKeyspace.NAME,
+                                                                   SchemaConstants.AUTH_KEYSPACE_NAME,
                                                                    LEGACY_USERS_TABLE);
             scheduleSetupTask(() -> {
                 convertLegacyData();
@@ -183,14 +184,14 @@ public class CassandraRoleManager implements IRoleManager
     {
         String insertCql = options.getPassword().isPresent()
                          ? String.format("INSERT INTO %s.%s (role, is_superuser, can_login, salted_hash) VALUES ('%s', %s, %s, '%s')",
-                                         AuthKeyspace.NAME,
+                                         SchemaConstants.AUTH_KEYSPACE_NAME,
                                          AuthKeyspace.ROLES,
                                          escape(role.getRoleName()),
                                          options.getSuperuser().or(false),
                                          options.getLogin().or(false),
                                          escape(hashpw(options.getPassword().get())))
                          : String.format("INSERT INTO %s.%s (role, is_superuser, can_login) VALUES ('%s', %s, %s)",
-                                         AuthKeyspace.NAME,
+                                         SchemaConstants.AUTH_KEYSPACE_NAME,
                                          AuthKeyspace.ROLES,
                                          escape(role.getRoleName()),
                                          options.getSuperuser().or(false),
@@ -201,7 +202,7 @@ public class CassandraRoleManager implements IRoleManager
     public void dropRole(AuthenticatedUser performer, RoleResource role) throws RequestValidationException, RequestExecutionException
     {
         process(String.format("DELETE FROM %s.%s WHERE role = '%s'",
-                              AuthKeyspace.NAME,
+                              SchemaConstants.AUTH_KEYSPACE_NAME,
                               AuthKeyspace.ROLES,
                               escape(role.getRoleName())),
                 consistencyForRole(role.getRoleName()));
@@ -217,7 +218,7 @@ public class CassandraRoleManager implements IRoleManager
         if (!Strings.isNullOrEmpty(assignments))
         {
             process(String.format("UPDATE %s.%s SET %s WHERE role = '%s'",
-                                  AuthKeyspace.NAME,
+                                  SchemaConstants.AUTH_KEYSPACE_NAME,
                                   AuthKeyspace.ROLES,
                                   assignments,
                                   escape(role.getRoleName())),
@@ -239,7 +240,7 @@ public class CassandraRoleManager implements IRoleManager
 
         modifyRoleMembership(grantee.getRoleName(), role.getRoleName(), "+");
         process(String.format("INSERT INTO %s.%s (role, member) values ('%s', '%s')",
-                              AuthKeyspace.NAME,
+                              SchemaConstants.AUTH_KEYSPACE_NAME,
                               AuthKeyspace.ROLE_MEMBERS,
                               escape(role.getRoleName()),
                               escape(grantee.getRoleName())),
@@ -256,7 +257,7 @@ public class CassandraRoleManager implements IRoleManager
 
         modifyRoleMembership(revokee.getRoleName(), role.getRoleName(), "-");
         process(String.format("DELETE FROM %s.%s WHERE role = '%s' and member = '%s'",
-                              AuthKeyspace.NAME,
+                              SchemaConstants.AUTH_KEYSPACE_NAME,
                               AuthKeyspace.ROLE_MEMBERS,
                               escape(role.getRoleName()),
                               escape(revokee.getRoleName())),
@@ -277,7 +278,7 @@ public class CassandraRoleManager implements IRoleManager
 
     public Set<RoleResource> getAllRoles() throws RequestValidationException, RequestExecutionException
     {
-        UntypedResultSet rows = process(String.format("SELECT role from %s.%s", AuthKeyspace.NAME, AuthKeyspace.ROLES), ConsistencyLevel.QUORUM);
+        UntypedResultSet rows = process(String.format("SELECT role from %s.%s", SchemaConstants.AUTH_KEYSPACE_NAME, AuthKeyspace.ROLES), ConsistencyLevel.QUORUM);
         Iterable<RoleResource> roles = Iterables.transform(rows, new Function<UntypedResultSet.Row, RoleResource>()
         {
             public RoleResource apply(UntypedResultSet.Row row)
@@ -310,8 +311,8 @@ public class CassandraRoleManager implements IRoleManager
 
     public Set<? extends IResource> protectedResources()
     {
-        return ImmutableSet.of(DataResource.table(AuthKeyspace.NAME, AuthKeyspace.ROLES),
-                               DataResource.table(AuthKeyspace.NAME, AuthKeyspace.ROLE_MEMBERS));
+        return ImmutableSet.of(DataResource.table(SchemaConstants.AUTH_KEYSPACE_NAME, AuthKeyspace.ROLES),
+                               DataResource.table(SchemaConstants.AUTH_KEYSPACE_NAME, AuthKeyspace.ROLE_MEMBERS));
     }
 
     public void validateConfiguration() throws ConfigurationException
@@ -331,7 +332,7 @@ public class CassandraRoleManager implements IRoleManager
             {
                 QueryProcessor.process(String.format("INSERT INTO %s.%s (role, is_superuser, can_login, salted_hash) " +
                                                      "VALUES ('%s', true, true, '%s')",
-                                                     AuthKeyspace.NAME,
+                                                     SchemaConstants.AUTH_KEYSPACE_NAME,
                                                      AuthKeyspace.ROLES,
                                                      DEFAULT_SUPERUSER_NAME,
                                                      escape(hashpw(DEFAULT_SUPERUSER_PASSWORD))),
@@ -349,8 +350,8 @@ public class CassandraRoleManager implements IRoleManager
     private static boolean hasExistingRoles() throws RequestExecutionException
     {
         // Try looking up the 'cassandra' default role first, to avoid the range query if possible.
-        String defaultSUQuery = String.format("SELECT * FROM %s.%s WHERE role = '%s'", AuthKeyspace.NAME, AuthKeyspace.ROLES, DEFAULT_SUPERUSER_NAME);
-        String allUsersQuery = String.format("SELECT * FROM %s.%s LIMIT 1", AuthKeyspace.NAME, AuthKeyspace.ROLES);
+        String defaultSUQuery = String.format("SELECT * FROM %s.%s WHERE role = '%s'", SchemaConstants.AUTH_KEYSPACE_NAME, AuthKeyspace.ROLES, DEFAULT_SUPERUSER_NAME);
+        String allUsersQuery = String.format("SELECT * FROM %s.%s LIMIT 1", SchemaConstants.AUTH_KEYSPACE_NAME, AuthKeyspace.ROLES);
         return !QueryProcessor.process(defaultSUQuery, ConsistencyLevel.ONE).isEmpty()
                || !QueryProcessor.process(defaultSUQuery, ConsistencyLevel.QUORUM).isEmpty()
                || !QueryProcessor.process(allUsersQuery, ConsistencyLevel.QUORUM).isEmpty();
@@ -421,7 +422,7 @@ public class CassandraRoleManager implements IRoleManager
                 {
                     // Write the password directly into the table to avoid doubly encrypting it
                     QueryProcessor.process(String.format("UPDATE %s.%s SET salted_hash = '%s' WHERE role = '%s'",
-                                                         AuthKeyspace.NAME,
+                                                         SchemaConstants.AUTH_KEYSPACE_NAME,
                                                          AuthKeyspace.ROLES,
                                                          row.getString("salted_hash"),
                                                          row.getString("username")),
@@ -480,7 +481,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.
-            return (Schema.instance.getCFMetaData(AuthKeyspace.NAME, "users") != null)
+            return (Schema.instance.getCFMetaData(SchemaConstants.AUTH_KEYSPACE_NAME, "users") != null)
                     ? getRoleFromTable(name, legacySelectUserStatement, LEGACY_ROW_TO_ROLE)
                     : getRoleFromTable(name, loadRoleStatement, ROW_TO_ROLE);
         }
@@ -512,7 +513,7 @@ public class CassandraRoleManager implements IRoleManager
     throws RequestExecutionException
     {
         process(String.format("UPDATE %s.%s SET member_of = member_of %s {'%s'} WHERE role = '%s'",
-                              AuthKeyspace.NAME,
+                              SchemaConstants.AUTH_KEYSPACE_NAME,
                               AuthKeyspace.ROLES,
                               op,
                               escape(role),
@@ -527,7 +528,7 @@ public class CassandraRoleManager implements IRoleManager
     {
         // Get the membership list of the the given role
         UntypedResultSet rows = process(String.format("SELECT member FROM %s.%s WHERE role = '%s'",
-                                                      AuthKeyspace.NAME,
+                                                      SchemaConstants.AUTH_KEYSPACE_NAME,
                                                       AuthKeyspace.ROLE_MEMBERS,
                                                       escape(role)),
                                         consistencyForRole(role));
@@ -540,7 +541,7 @@ public class CassandraRoleManager implements IRoleManager
 
         // Finally, remove the membership list for the dropped role
         process(String.format("DELETE FROM %s.%s WHERE role = '%s'",
-                              AuthKeyspace.NAME,
+                              SchemaConstants.AUTH_KEYSPACE_NAME,
                               AuthKeyspace.ROLE_MEMBERS,
                               escape(role)),
                 consistencyForRole(role));

http://git-wip-us.apache.org/repos/asf/cassandra/blob/9797511c/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 0f79cd2..b0317f3 100644
--- a/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java
+++ b/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java
@@ -32,6 +32,7 @@ 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.cql3.QueryOptions;
 import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.cql3.UntypedResultSet;
@@ -114,7 +115,7 @@ public class PasswordAuthenticator implements IAuthenticator
         {
             // If the legacy users table exists try to verify credentials there. This is to handle the case
             // where the cluster is being upgraded and so is running with mixed versions of the authn tables
-            SelectStatement authenticationStatement = Schema.instance.getCFMetaData(AuthKeyspace.NAME, LEGACY_CREDENTIALS_TABLE) == null
+            SelectStatement authenticationStatement = Schema.instance.getCFMetaData(SchemaConstants.AUTH_KEYSPACE_NAME, LEGACY_CREDENTIALS_TABLE) == null
                                                     ? authenticateStatement
                                                     : legacyAuthenticateStatement;
 
@@ -146,7 +147,7 @@ public class PasswordAuthenticator implements IAuthenticator
     public Set<DataResource> protectedResources()
     {
         // Also protected by CassandraRoleManager, but the duplication doesn't hurt and is more explicit
-        return ImmutableSet.of(DataResource.table(AuthKeyspace.NAME, AuthKeyspace.ROLES));
+        return ImmutableSet.of(DataResource.table(SchemaConstants.AUTH_KEYSPACE_NAME, AuthKeyspace.ROLES));
     }
 
     public void validateConfiguration() throws ConfigurationException
@@ -157,15 +158,15 @@ public class PasswordAuthenticator implements IAuthenticator
     {
         String query = String.format("SELECT %s FROM %s.%s WHERE role = ?",
                                      SALTED_HASH,
-                                     AuthKeyspace.NAME,
+                                     SchemaConstants.AUTH_KEYSPACE_NAME,
                                      AuthKeyspace.ROLES);
         authenticateStatement = prepare(query);
 
-        if (Schema.instance.getCFMetaData(AuthKeyspace.NAME, LEGACY_CREDENTIALS_TABLE) != null)
+        if (Schema.instance.getCFMetaData(SchemaConstants.AUTH_KEYSPACE_NAME, LEGACY_CREDENTIALS_TABLE) != null)
         {
             query = String.format("SELECT %s from %s.%s WHERE username = ?",
                                   SALTED_HASH,
-                                  AuthKeyspace.NAME,
+                                  SchemaConstants.AUTH_KEYSPACE_NAME,
                                   LEGACY_CREDENTIALS_TABLE);
             legacyAuthenticateStatement = prepare(query);
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/9797511c/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 ffff235..9cb3b10 100644
--- a/src/java/org/apache/cassandra/batchlog/BatchlogManager.java
+++ b/src/java/org/apache/cassandra/batchlog/BatchlogManager.java
@@ -34,6 +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.cql3.UntypedResultSet;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.marshal.BytesType;
@@ -150,7 +151,7 @@ public class BatchlogManager implements BatchlogManagerMBean
     @VisibleForTesting
     public int countAllBatches()
     {
-        String query = String.format("SELECT count(*) FROM %s.%s", SystemKeyspace.NAME, SystemKeyspace.BATCHES);
+        String query = String.format("SELECT count(*) FROM %s.%s", SchemaConstants.SYSTEM_KEYSPACE_NAME, SystemKeyspace.BATCHES);
         UntypedResultSet results = executeInternal(query);
         if (results == null || results.isEmpty())
             return 0;
@@ -196,13 +197,13 @@ public class BatchlogManager implements BatchlogManagerMBean
         RateLimiter rateLimiter = RateLimiter.create(throttleInKB == 0 ? Double.MAX_VALUE : throttleInKB * 1024);
 
         UUID limitUuid = UUIDGen.maxTimeUUID(System.currentTimeMillis() - getBatchlogTimeout());
-        ColumnFamilyStore store = Keyspace.open(SystemKeyspace.NAME).getColumnFamilyStore(SystemKeyspace.BATCHES);
+        ColumnFamilyStore store = Keyspace.open(SchemaConstants.SYSTEM_KEYSPACE_NAME).getColumnFamilyStore(SystemKeyspace.BATCHES);
         int pageSize = calculatePageSize(store);
         // There cannot be any live content where token(id) <= token(lastReplayedUuid) as every processed batch is
         // deleted, but the tombstoned content may still be present in the tables. To avoid walking over it we specify
         // token(id) > token(lastReplayedUuid) as part of the query.
         String query = String.format("SELECT id, mutations, version FROM %s.%s WHERE token(id) > token(?) AND token(id) <= token(?)",
-                                     SystemKeyspace.NAME,
+                                     SchemaConstants.SYSTEM_KEYSPACE_NAME,
                                      SystemKeyspace.BATCHES);
         UntypedResultSet batches = executeInternalWithPaging(query, pageSize, lastReplayedUuid, limitUuid);
         processBatchlogEntries(batches, pageSize, rateLimiter);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/9797511c/src/java/org/apache/cassandra/batchlog/LegacyBatchlogMigrator.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/batchlog/LegacyBatchlogMigrator.java b/src/java/org/apache/cassandra/batchlog/LegacyBatchlogMigrator.java
index 1a70f9f..4592488 100644
--- a/src/java/org/apache/cassandra/batchlog/LegacyBatchlogMigrator.java
+++ b/src/java/org/apache/cassandra/batchlog/LegacyBatchlogMigrator.java
@@ -26,6 +26,7 @@ import java.util.concurrent.TimeUnit;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.cassandra.config.SchemaConstants;
 import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.cql3.UntypedResultSet;
 import org.apache.cassandra.db.*;
@@ -53,7 +54,7 @@ public final class LegacyBatchlogMigrator
     @SuppressWarnings("deprecation")
     public static void migrate()
     {
-        ColumnFamilyStore store = Keyspace.open(SystemKeyspace.NAME).getColumnFamilyStore(SystemKeyspace.LEGACY_BATCHLOG);
+        ColumnFamilyStore store = Keyspace.open(SchemaConstants.SYSTEM_KEYSPACE_NAME).getColumnFamilyStore(SystemKeyspace.LEGACY_BATCHLOG);
 
         // nothing to migrate
         if (store.isEmpty())
@@ -63,7 +64,7 @@ public final class LegacyBatchlogMigrator
 
         int convertedBatches = 0;
         String query = String.format("SELECT id, data, written_at, version FROM %s.%s",
-                                     SystemKeyspace.NAME,
+                                     SchemaConstants.SYSTEM_KEYSPACE_NAME,
                                      SystemKeyspace.LEGACY_BATCHLOG);
 
         int pageSize = BatchlogManager.calculatePageSize(store);
@@ -82,7 +83,7 @@ public final class LegacyBatchlogMigrator
     @SuppressWarnings("deprecation")
     public static boolean isLegacyBatchlogMutation(Mutation mutation)
     {
-        return mutation.getKeyspaceName().equals(SystemKeyspace.NAME)
+        return mutation.getKeyspaceName().equals(SchemaConstants.SYSTEM_KEYSPACE_NAME)
             && mutation.getPartitionUpdate(SystemKeyspace.LegacyBatchlog.cfId) != null;
     }
 
@@ -142,7 +143,7 @@ public final class LegacyBatchlogMigrator
         AbstractWriteResponseHandler<IMutation> handler = new WriteResponseHandler<>(endpoints,
                                                                                      Collections.<InetAddress>emptyList(),
                                                                                      ConsistencyLevel.ANY,
-                                                                                     Keyspace.open(SystemKeyspace.NAME),
+                                                                                     Keyspace.open(SchemaConstants.SYSTEM_KEYSPACE_NAME),
                                                                                      null,
                                                                                      WriteType.SIMPLE,
                                                                                      queryStartNanoTime);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/9797511c/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 b98ad53..d7b30fe 100644
--- a/src/java/org/apache/cassandra/cache/AutoSavingCache.java
+++ b/src/java/org/apache/cassandra/cache/AutoSavingCache.java
@@ -37,8 +37,8 @@ import org.apache.cassandra.concurrent.ScheduledExecutors;
 import org.apache.cassandra.config.CFMetaData;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.Schema;
+import org.apache.cassandra.config.SchemaConstants;
 import org.apache.cassandra.db.ColumnFamilyStore;
-import org.apache.cassandra.db.SystemKeyspace;
 import org.apache.cassandra.db.compaction.CompactionInfo;
 import org.apache.cassandra.db.compaction.CompactionManager;
 import org.apache.cassandra.db.compaction.OperationType;
@@ -307,7 +307,7 @@ public class AutoSavingCache<K extends CacheKey, V> extends InstrumentingCache<K
             else
                 type = OperationType.UNKNOWN;
 
-            info = new CompactionInfo(CFMetaData.createFake(SystemKeyspace.NAME, cacheType.toString()),
+            info = new CompactionInfo(CFMetaData.createFake(SchemaConstants.SYSTEM_KEYSPACE_NAME, cacheType.toString()),
                                       type,
                                       0,
                                       keysEstimate,

http://git-wip-us.apache.org/repos/asf/cassandra/blob/9797511c/src/java/org/apache/cassandra/config/CFMetaData.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/CFMetaData.java b/src/java/org/apache/cassandra/config/CFMetaData.java
index 0aaf064..90d8b58 100644
--- a/src/java/org/apache/cassandra/config/CFMetaData.java
+++ b/src/java/org/apache/cassandra/config/CFMetaData.java
@@ -858,7 +858,7 @@ public final class CFMetaData
 
     public static boolean isNameValid(String name) {
         return name != null && !name.isEmpty()
-                && name.length() <= Schema.NAME_LENGTH && PATTERN_WORD_CHARS.matcher(name).matches();
+               && name.length() <= SchemaConstants.NAME_LENGTH && PATTERN_WORD_CHARS.matcher(name).matches();
     }
 
     public CFMetaData validate() throws ConfigurationException
@@ -866,9 +866,9 @@ public final class CFMetaData
         rebuild();
 
         if (!isNameValid(ksName))
-            throw new ConfigurationException(String.format("Keyspace name must not be empty, more than %s characters long, or contain non-alphanumeric-underscore characters (got \"%s\")", Schema.NAME_LENGTH, ksName));
+            throw new ConfigurationException(String.format("Keyspace name must not be empty, more than %s characters long, or contain non-alphanumeric-underscore characters (got \"%s\")", SchemaConstants.NAME_LENGTH, ksName));
         if (!isNameValid(cfName))
-            throw new ConfigurationException(String.format("ColumnFamily name must not be empty, more than %s characters long, or contain non-alphanumeric-underscore characters (got \"%s\")", Schema.NAME_LENGTH, cfName));
+            throw new ConfigurationException(String.format("ColumnFamily name must not be empty, more than %s characters long, or contain non-alphanumeric-underscore characters (got \"%s\")", SchemaConstants.NAME_LENGTH, cfName));
 
         params.validate();
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/9797511c/src/java/org/apache/cassandra/config/Config.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/Config.java b/src/java/org/apache/cassandra/config/Config.java
index fdf27d9..7248031 100644
--- a/src/java/org/apache/cassandra/config/Config.java
+++ b/src/java/org/apache/cassandra/config/Config.java
@@ -32,9 +32,6 @@ import com.google.common.collect.Sets;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.config.EncryptionOptions.ClientEncryptionOptions;
-import org.apache.cassandra.config.EncryptionOptions.ServerEncryptionOptions;
-
 /**
  * A class that contains configuration properties for the cassandra node it runs within.
  *
@@ -224,10 +221,10 @@ public class Config
     public RequestSchedulerId request_scheduler_id;
     public RequestSchedulerOptions request_scheduler_options;
 
-    public ServerEncryptionOptions server_encryption_options = new ServerEncryptionOptions();
-    public ClientEncryptionOptions client_encryption_options = new ClientEncryptionOptions();
+    public EncryptionOptions.ServerEncryptionOptions server_encryption_options = new EncryptionOptions.ServerEncryptionOptions();
+    public EncryptionOptions.ClientEncryptionOptions client_encryption_options = new EncryptionOptions.ClientEncryptionOptions();
     // this encOptions is for backward compatibility (a warning is logged by DatabaseDescriptor)
-    public ServerEncryptionOptions encryption_options;
+    public EncryptionOptions.ServerEncryptionOptions encryption_options;
 
     public InternodeCompression internode_compression = InternodeCompression.none;
 
@@ -260,6 +257,7 @@ public class Config
     public volatile int counter_cache_keys_to_save = Integer.MAX_VALUE;
 
     private static boolean isClientMode = false;
+    private static boolean isToolsMode = false;
 
     public Integer file_cache_size_in_mb;
 
@@ -367,11 +365,34 @@ public class Config
         return isClientMode;
     }
 
+    /**
+     * Client mode means that the process is a pure client, that uses C* code base but does
+     * not read or write local C* database files.
+     */
     public static void setClientMode(boolean clientMode)
     {
         isClientMode = clientMode;
     }
 
+    public static boolean isToolsMode()
+    {
+        return isToolsMode;
+    }
+
+    /**
+     * Tools mode means that the process is a standalone (offline) C* tool that may (or may not)
+     * read or write local C* database files.
+     */
+    public static void setToolsMode(boolean toolsMode)
+    {
+        isToolsMode = toolsMode;
+    }
+
+    public static boolean isClientOrToolsMode()
+    {
+        return isClientMode() || isToolsMode();
+    }
+
     public enum CommitLogSync
     {
         periodic,