Create system_auth tables with fixed CFID
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/ea565aac Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/ea565aac Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/ea565aac Branch: refs/heads/trunk Commit: ea565aac9702698b2bfc2db7c3ca84da3f96121a Parents: 29d5dd0 Author: Yuki Morishita <yu...@apache.org> Authored: Tue Jan 14 21:12:38 2014 -0600 Committer: Yuki Morishita <yu...@apache.org> Committed: Tue Jan 14 21:12:38 2014 -0600 ---------------------------------------------------------------------- src/java/org/apache/cassandra/auth/Auth.java | 24 ++++++++++++++++---- .../cassandra/auth/CassandraAuthorizer.java | 14 +----------- .../cassandra/auth/PasswordAuthenticator.java | 19 +--------------- .../org/apache/cassandra/config/CFMetaData.java | 17 +++++++++----- .../apache/cassandra/config/CFMetaDataTest.java | 2 +- 5 files changed, 33 insertions(+), 43 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/ea565aac/src/java/org/apache/cassandra/auth/Auth.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/auth/Auth.java b/src/java/org/apache/cassandra/auth/Auth.java index 36e55bf..90b1215 100644 --- a/src/java/org/apache/cassandra/auth/Auth.java +++ b/src/java/org/apache/cassandra/auth/Auth.java @@ -25,12 +25,15 @@ import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.config.Schema; import org.apache.cassandra.cql3.UntypedResultSet; import org.apache.cassandra.cql3.QueryProcessor; import org.apache.cassandra.cql3.QueryOptions; +import org.apache.cassandra.cql3.statements.CFStatement; +import org.apache.cassandra.cql3.statements.CreateTableStatement; import org.apache.cassandra.cql3.statements.SelectStatement; import org.apache.cassandra.db.ConsistencyLevel; import org.apache.cassandra.exceptions.RequestExecutionException; @@ -127,7 +130,7 @@ public class Auth return; setupAuthKeyspace(); - setupUsersTable(); + setupTable(USERS_CF, USERS_CF_SCHEMA); DatabaseDescriptor.getAuthenticator().setup(); DatabaseDescriptor.getAuthorizer().setup(); @@ -187,15 +190,26 @@ public class Auth } } - private static void setupUsersTable() + /** + * Set up table from given CREATE TABLE statement under system_auth keyspace, if not already done so. + * + * @param name name of the table + * @param cql CREATE TABLE statement + */ + public static void setupTable(String name, String cql) { - if (Schema.instance.getCFMetaData(AUTH_KS, USERS_CF) == null) + if (Schema.instance.getCFMetaData(AUTH_KS, name) == null) { try { - QueryProcessor.process(USERS_CF_SCHEMA, ConsistencyLevel.ANY); + CFStatement parsed = (CFStatement)QueryProcessor.parseStatement(cql); + parsed.prepareKeyspace(AUTH_KS); + CreateTableStatement statement = (CreateTableStatement) parsed.prepare().statement; + CFMetaData cfm = statement.getCFMetaData().clone(CFMetaData.generateLegacyCfId(AUTH_KS, name)); + assert cfm.cfName.equals(name); + MigrationManager.announceNewColumnFamily(cfm); } - catch (RequestExecutionException e) + catch (Exception e) { throw new AssertionError(e); } http://git-wip-us.apache.org/repos/asf/cassandra/blob/ea565aac/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 8f257db..85d2b16 100644 --- a/src/java/org/apache/cassandra/auth/CassandraAuthorizer.java +++ b/src/java/org/apache/cassandra/auth/CassandraAuthorizer.java @@ -25,7 +25,6 @@ import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.cassandra.config.Schema; import org.apache.cassandra.cql3.UntypedResultSet; import org.apache.cassandra.cql3.QueryProcessor; import org.apache.cassandra.cql3.QueryOptions; @@ -33,7 +32,6 @@ import org.apache.cassandra.cql3.statements.SelectStatement; import org.apache.cassandra.db.ConsistencyLevel; import org.apache.cassandra.db.marshal.UTF8Type; import org.apache.cassandra.exceptions.*; -import org.apache.cassandra.service.ClientState; import org.apache.cassandra.service.QueryState; import org.apache.cassandra.transport.messages.ResultMessage; import org.apache.cassandra.utils.ByteBufferUtil; @@ -240,17 +238,7 @@ public class CassandraAuthorizer implements IAuthorizer public void setup() { - if (Schema.instance.getCFMetaData(Auth.AUTH_KS, PERMISSIONS_CF) == null) - { - try - { - process(PERMISSIONS_CF_SCHEMA); - } - catch (RequestExecutionException e) - { - throw new AssertionError(e); - } - } + Auth.setupTable(PERMISSIONS_CF, PERMISSIONS_CF_SCHEMA); try { http://git-wip-us.apache.org/repos/asf/cassandra/blob/ea565aac/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 cd5bdc3..1567bde 100644 --- a/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java +++ b/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java @@ -31,14 +31,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.cassandra.config.DatabaseDescriptor; -import org.apache.cassandra.config.Schema; import org.apache.cassandra.cql3.UntypedResultSet; import org.apache.cassandra.cql3.QueryProcessor; import org.apache.cassandra.cql3.QueryOptions; import org.apache.cassandra.cql3.statements.SelectStatement; import org.apache.cassandra.db.ConsistencyLevel; import org.apache.cassandra.exceptions.*; -import org.apache.cassandra.service.ClientState; import org.apache.cassandra.service.QueryState; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.transport.messages.ResultMessage; @@ -168,7 +166,7 @@ public class PasswordAuthenticator implements ISaslAwareAuthenticator public void setup() { - setupCredentialsTable(); + Auth.setupTable(CREDENTIALS_CF, CREDENTIALS_CF_SCHEMA); // the delay is here to give the node some time to see its peers - to reduce // "skipped default user setup: some nodes are were not ready" log spam. @@ -205,21 +203,6 @@ public class PasswordAuthenticator implements ISaslAwareAuthenticator return new PlainTextSaslAuthenticator(); } - private void setupCredentialsTable() - { - if (Schema.instance.getCFMetaData(Auth.AUTH_KS, CREDENTIALS_CF) == null) - { - try - { - process(CREDENTIALS_CF_SCHEMA, ConsistencyLevel.ANY); - } - catch (RequestExecutionException e) - { - throw new AssertionError(e); - } - } - } - // if there are no users yet - add default superuser. private void setupDefaultUser() { http://git-wip-us.apache.org/repos/asf/cassandra/blob/ea565aac/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 3dc7022..cdc4cdb 100644 --- a/src/java/org/apache/cassandra/config/CFMetaData.java +++ b/src/java/org/apache/cassandra/config/CFMetaData.java @@ -543,14 +543,14 @@ public final class CFMetaData * * Since 2.1, this is only used for system columnfamilies and tests. */ - static UUID getId(String ksName, String cfName) + public static UUID generateLegacyCfId(String ksName, String cfName) { return UUID.nameUUIDFromBytes(ArrayUtils.addAll(ksName.getBytes(), cfName.getBytes())); } private static CFMetaData newSystemMetadata(String keyspace, String cfName, String comment, CellNameType comparator) { - CFMetaData newCFMD = new CFMetaData(keyspace, cfName, ColumnFamilyType.Standard, comparator, getId(keyspace, cfName)); + CFMetaData newCFMD = new CFMetaData(keyspace, cfName, ColumnFamilyType.Standard, comparator, generateLegacyCfId(keyspace, cfName)); return newCFMD.comment(comment) .readRepairChance(0) .dcLocalReadRepairChance(0) @@ -603,10 +603,15 @@ public final class CFMetaData return copyOpts(new CFMetaData(ksName, cfName, cfType, comparator, cfId), this); } - // Create a new CFMD by changing just the cfName - public static CFMetaData rename(CFMetaData cfm, String newName) + /** + * Clones the CFMetaData, but sets a different cfId + * + * @param newCfId the cfId for the cloned CFMetaData + * @return the cloned CFMetaData instance with the new cfId + */ + public CFMetaData clone(UUID newCfId) { - return copyOpts(new CFMetaData(cfm.ksName, newName, cfm.cfType, cfm.comparator, cfm.cfId), cfm); + return copyOpts(new CFMetaData(ksName, cfName, cfType, comparator, newCfId), this); } static CFMetaData copyOpts(CFMetaData newCFMD, CFMetaData oldCFMD) @@ -1677,7 +1682,7 @@ public final class CFMetaData if (result.has("cf_id")) cfId = result.getUUID("cf_id"); else - cfId = getId(ksName, cfName); + cfId = generateLegacyCfId(ksName, cfName); CFMetaData cfm = new CFMetaData(ksName, cfName, http://git-wip-us.apache.org/repos/asf/cassandra/blob/ea565aac/test/unit/org/apache/cassandra/config/CFMetaDataTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/config/CFMetaDataTest.java b/test/unit/org/apache/cassandra/config/CFMetaDataTest.java index 9cd4adf..d0ff179 100644 --- a/test/unit/org/apache/cassandra/config/CFMetaDataTest.java +++ b/test/unit/org/apache/cassandra/config/CFMetaDataTest.java @@ -109,7 +109,7 @@ public class CFMetaDataTest extends SchemaLoader checkInverses(cfm); // Testing with compression to catch #3558 - CFMetaData withCompression = CFMetaData.rename(cfm, cfm.cfName); // basically a clone + CFMetaData withCompression = cfm.clone(); withCompression.compressionParameters(new CompressionParameters(SnappyCompressor.instance, 32768, new HashMap<String, String>())); checkInverses(withCompression); }