You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by gd...@apache.org on 2010/07/28 23:01:50 UTC
svn commit: r980220 - in /cassandra/trunk:
src/java/org/apache/cassandra/avro/ src/java/org/apache/cassandra/config/
src/java/org/apache/cassandra/io/ src/java/org/apache/cassandra/thrift/
test/unit/org/apache/cassandra/config/ test/unit/org/apache/cas...
Author: gdusbabek
Date: Wed Jul 28 21:01:49 2010
New Revision: 980220
URL: http://svn.apache.org/viewvc?rev=980220&view=rev
Log:
push access structures into KSM. patch by stuhood, reviewed by gdusbabek. CASSANDRA-1237
Modified:
cassandra/trunk/src/java/org/apache/cassandra/avro/CassandraServer.java
cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
cassandra/trunk/src/java/org/apache/cassandra/config/KSMetaData.java
cassandra/trunk/src/java/org/apache/cassandra/io/SerDeUtils.java
cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java
cassandra/trunk/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java
cassandra/trunk/test/unit/org/apache/cassandra/db/DefsTest.java
Modified: cassandra/trunk/src/java/org/apache/cassandra/avro/CassandraServer.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/avro/CassandraServer.java?rev=980220&r1=980219&r2=980220&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/avro/CassandraServer.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/avro/CassandraServer.java Wed Jul 28 21:01:49 2010
@@ -521,6 +521,16 @@ public class CassandraServer implements
return new org.apache.cassandra.db.TimestampClock(clock.timestamp);
}
+ private static Map<String,AccessLevel> unavronateAccessMap(Map<Utf8,AccessLevel> map)
+ {
+ Map<String,AccessLevel> out = new HashMap<String,AccessLevel>();
+ if (map == null)
+ return out;
+ for (Map.Entry<Utf8, AccessLevel> entry : map.entrySet())
+ out.put(entry.getKey().toString(), entry.getValue());
+ return out;
+ }
+
// FIXME: This is copypasta from o.a.c.db.RowMutation, (RowMutation.getRowMutation uses Thrift types directly).
private static RowMutation getRowMutationFromMutations(String keyspace, byte[] key, Map<Utf8, GenericArray<Mutation>> cfMap)
{
@@ -666,6 +676,8 @@ public class CassandraServer implements
ksDef.name.toString(),
(Class<? extends AbstractReplicationStrategy>)Class.forName(ksDef.strategy_class.toString()),
(int)ksDef.replication_factor,
+ unavronateAccessMap(ksDef.users_access),
+ unavronateAccessMap(ksDef.groups_access),
cfDefs.toArray(new CFMetaData[cfDefs.size()]));
AddKeyspace add = new AddKeyspace(ksmeta);
add.apply();
Modified: cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java?rev=980220&r1=980219&r2=980220&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java Wed Jul 28 21:01:49 2010
@@ -343,11 +343,16 @@ public class DatabaseDescriptor
CommitLog.setSegmentSize(conf.commitlog_rotation_threshold_in_mb * 1024 * 1024);
// Hardcoded system tables
- KSMetaData systemMeta = new KSMetaData(Table.SYSTEM_TABLE, LocalStrategy.class, 1, new CFMetaData[]{CFMetaData.StatusCf,
- CFMetaData.HintsCf,
- CFMetaData.MigrationsCf,
- CFMetaData.SchemaCf,
- CFMetaData.StatisticsCf
+ KSMetaData systemMeta = new KSMetaData(Table.SYSTEM_TABLE,
+ LocalStrategy.class,
+ 1,
+ null,
+ null,
+ new CFMetaData[]{CFMetaData.StatusCf,
+ CFMetaData.HintsCf,
+ CFMetaData.MigrationsCf,
+ CFMetaData.SchemaCf,
+ CFMetaData.StatisticsCf
});
CFMetaData.map(CFMetaData.StatusCf);
CFMetaData.map(CFMetaData.HintsCf);
@@ -617,7 +622,7 @@ public class DatabaseDescriptor
cf.gc_grace_seconds,
metadata);
}
- defs.add(new KSMetaData(keyspace.name, strategyClass, keyspace.replication_factor, cfDefs));
+ defs.add(new KSMetaData(keyspace.name, strategyClass, keyspace.replication_factor, null, null, cfDefs));
}
Modified: cassandra/trunk/src/java/org/apache/cassandra/config/KSMetaData.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/config/KSMetaData.java?rev=980220&r1=980219&r2=980220&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/config/KSMetaData.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/config/KSMetaData.java Wed Jul 28 21:01:49 2010
@@ -32,14 +32,18 @@ import java.util.Map;
import org.apache.avro.util.Utf8;
import org.apache.commons.lang.ObjectUtils;
+import org.apache.cassandra.avro.AccessLevel;
+
public final class KSMetaData
{
public final String name;
public final Class<? extends AbstractReplicationStrategy> strategyClass;
public final int replicationFactor;
- private final Map<String, CFMetaData> cfMetaData;
+ public final Map<String, CFMetaData> cfMetaData;
+ public final Map<String, AccessLevel> usersAccess;
+ public final Map<String, AccessLevel> groupsAccess;
- public KSMetaData(String name, Class<? extends AbstractReplicationStrategy> strategyClass, int replicationFactor, CFMetaData... cfDefs)
+ public KSMetaData(String name, Class<? extends AbstractReplicationStrategy> strategyClass, int replicationFactor, Map<String,AccessLevel> usersAccess, Map<String,AccessLevel> groupsAccess, CFMetaData... cfDefs)
{
this.name = name;
this.strategyClass = strategyClass == null ? RackUnawareStrategy.class : strategyClass;
@@ -48,6 +52,10 @@ public final class KSMetaData
for (CFMetaData cfm : cfDefs)
cfmap.put(cfm.cfName, cfm);
this.cfMetaData = Collections.unmodifiableMap(cfmap);
+ this.usersAccess = usersAccess == null ?
+ Collections.<String, AccessLevel>emptyMap() : Collections.unmodifiableMap(usersAccess);
+ this.groupsAccess = groupsAccess == null ?
+ Collections.<String, AccessLevel>emptyMap() : Collections.unmodifiableMap(groupsAccess);
}
/**
@@ -57,7 +65,7 @@ public final class KSMetaData
{
List<CFMetaData> newCfs = new ArrayList<CFMetaData>(cfMetaData().values());
newCfs.add(cfm);
- return new KSMetaData(name, strategyClass, replicationFactor, newCfs.toArray(new CFMetaData[newCfs.size()]));
+ return new KSMetaData(name, strategyClass, replicationFactor, usersAccess, groupsAccess, newCfs.toArray(new CFMetaData[newCfs.size()]));
}
/**
@@ -69,7 +77,7 @@ public final class KSMetaData
List<CFMetaData> newCfs = new ArrayList<CFMetaData>(cfMetaData().values());
newCfs.remove(cfm);
assert newCfs.size() == cfMetaData().size() - 1;
- return new KSMetaData(name, strategyClass, replicationFactor, newCfs.toArray(new CFMetaData[newCfs.size()]));
+ return new KSMetaData(name, strategyClass, replicationFactor, usersAccess, groupsAccess, newCfs.toArray(new CFMetaData[newCfs.size()]));
}
/**
@@ -81,7 +89,7 @@ public final class KSMetaData
List<CFMetaData> newCfs = new ArrayList<CFMetaData>(cfMetaData().size());
for (CFMetaData oldCf : cfMetaData().values())
newCfs.add(CFMetaData.renameTable(oldCf, ksName));
- return new KSMetaData(ksName, strategyClass, replicationFactor, newCfs.toArray(new CFMetaData[newCfs.size()]));
+ return new KSMetaData(ksName, strategyClass, replicationFactor, usersAccess, groupsAccess, newCfs.toArray(new CFMetaData[newCfs.size()]));
}
public boolean equals(Object obj)
@@ -102,13 +110,15 @@ public final class KSMetaData
{
return cfMetaData;
}
-
+
public org.apache.cassandra.avro.KsDef deflate()
{
org.apache.cassandra.avro.KsDef ks = new org.apache.cassandra.avro.KsDef();
ks.name = new Utf8(name);
ks.strategy_class = new Utf8(strategyClass.getName());
ks.replication_factor = replicationFactor;
+ ks.users_access = SerDeUtils.toAvroMap(usersAccess);
+ ks.groups_access = SerDeUtils.toAvroMap(groupsAccess);
ks.cf_defs = SerDeUtils.createArray(cfMetaData.size(), org.apache.cassandra.avro.CfDef.SCHEMA$);
for (CFMetaData cfm : cfMetaData.values())
ks.cf_defs.add(cfm.deflate());
@@ -126,12 +136,14 @@ public final class KSMetaData
{
throw new ConfigurationException("Could not create ReplicationStrategy of type " + ks.strategy_class, ex);
}
+ Map<String,AccessLevel> usersAccess = SerDeUtils.fromAvroMap(ks.users_access);
+ Map<String,AccessLevel> groupsAccess = SerDeUtils.fromAvroMap(ks.groups_access);
int cfsz = (int)ks.cf_defs.size();
CFMetaData[] cfMetaData = new CFMetaData[cfsz];
Iterator<org.apache.cassandra.avro.CfDef> cfiter = ks.cf_defs.iterator();
for (int i = 0; i < cfsz; i++)
cfMetaData[i] = CFMetaData.inflate(cfiter.next());
- return new KSMetaData(ks.name.toString(), repStratClass, ks.replication_factor, cfMetaData);
+ return new KSMetaData(ks.name.toString(), repStratClass, ks.replication_factor, usersAccess, groupsAccess, cfMetaData);
}
}
Modified: cassandra/trunk/src/java/org/apache/cassandra/io/SerDeUtils.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/io/SerDeUtils.java?rev=980220&r1=980219&r2=980220&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/io/SerDeUtils.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/io/SerDeUtils.java Wed Jul 28 21:01:49 2010
@@ -22,6 +22,8 @@ import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.util.Map;
+import java.util.HashMap;
import org.apache.avro.Schema;
import org.apache.avro.io.BinaryDecoder;
@@ -45,6 +47,22 @@ public final class SerDeUtils
// unbuffered decoders
private final static DecoderFactory DIRECT_DECODERS = new DecoderFactory().configureDirectDecoder(true);
+ public static <T> Map<Utf8,T> toAvroMap(Map<String,T> map)
+ {
+ Map<Utf8,T> out = new HashMap<Utf8,T>();
+ for (Map.Entry<String,T> entry : map.entrySet())
+ out.put(new Utf8(entry.getKey()), entry.getValue());
+ return out;
+ }
+
+ public static <T> Map<String,T> fromAvroMap(Map<Utf8,T> map)
+ {
+ Map<String,T> out = new HashMap<String,T>();
+ for (Map.Entry<Utf8,T> entry : map.entrySet())
+ out.put(entry.getKey().toString(), entry.getValue());
+ return out;
+ }
+
/**
* Deserializes a single object based on the given Schema.
* @param schema writer's schema
Modified: cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java?rev=980220&r1=980219&r2=980220&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java Wed Jul 28 21:01:49 2010
@@ -225,6 +225,16 @@ public class CassandraServer implements
return thrift_clock;
}
+ private static Map<String,org.apache.cassandra.avro.AccessLevel> unthriftifyAccessMap(Map<String,AccessLevel> map)
+ {
+ Map<String,org.apache.cassandra.avro.AccessLevel> out = new HashMap<String,org.apache.cassandra.avro.AccessLevel>();
+ if (map == null)
+ return out;
+ for (Map.Entry<String,AccessLevel> entry : map.entrySet())
+ out.put(entry.getKey(), Enum.valueOf(org.apache.cassandra.avro.AccessLevel.class, entry.getValue().name()));
+ return out;
+ }
+
private Map<byte[], List<ColumnOrSuperColumn>> getSlice(List<ReadCommand> commands, ConsistencyLevel consistency_level)
throws InvalidRequestException, UnavailableException, TimedOutException
{
@@ -881,7 +891,9 @@ public class CassandraServer implements
KSMetaData ksm = new KSMetaData(
ks_def.name,
(Class<? extends AbstractReplicationStrategy>)Class.forName(ks_def.strategy_class),
- ks_def.replication_factor,
+ ks_def.replication_factor,
+ unthriftifyAccessMap(ks_def.users_access),
+ unthriftifyAccessMap(ks_def.groups_access),
cfDefs.toArray(new CFMetaData[cfDefs.size()]));
applyMigrationOnStage(new AddKeyspace(ksm));
return DatabaseDescriptor.getDefsVersion().toString();
Modified: cassandra/trunk/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java?rev=980220&r1=980219&r2=980220&view=diff
==============================================================================
--- cassandra/trunk/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java (original)
+++ cassandra/trunk/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java Wed Jul 28 21:01:49 2010
@@ -37,9 +37,7 @@ public class DatabaseDescriptorTest
{
protected <D extends SpecificRecord> D serDe(D record) throws IOException
{
- D actual = SerDeUtils.<D>deserialize(record.getSchema(), SerDeUtils.serialize(record));
- assert actual.equals(record) : actual + " != " + record;
- return actual;
+ return SerDeUtils.<D>deserialize(record.getSchema(), SerDeUtils.serialize(record));
}
@Test
@@ -83,9 +81,9 @@ public class DatabaseDescriptorTest
assert DatabaseDescriptor.getNonSystemTables().size() == 0;
// add a few.
- AddKeyspace ks0 = new AddKeyspace(new KSMetaData("ks0", RackUnawareStrategy.class, 3));
+ AddKeyspace ks0 = new AddKeyspace(new KSMetaData("ks0", RackUnawareStrategy.class, 3, null, null));
ks0.apply();
- AddKeyspace ks1 = new AddKeyspace(new KSMetaData("ks1", RackUnawareStrategy.class, 3));
+ AddKeyspace ks1 = new AddKeyspace(new KSMetaData("ks1", RackUnawareStrategy.class, 3, null, null));
ks1.apply();
assert DatabaseDescriptor.getTableDefinition("ks0") != null;
Modified: cassandra/trunk/test/unit/org/apache/cassandra/db/DefsTest.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/db/DefsTest.java?rev=980220&r1=980219&r2=980220&view=diff
==============================================================================
--- cassandra/trunk/test/unit/org/apache/cassandra/db/DefsTest.java (original)
+++ cassandra/trunk/test/unit/org/apache/cassandra/db/DefsTest.java Wed Jul 28 21:01:49 2010
@@ -262,7 +262,7 @@ public class DefsTest extends CleanupHel
{
DecoratedKey dk = Util.dk("key0");
CFMetaData newCf = new CFMetaData("NewKeyspace1", "AddedStandard1", ColumnFamilyType.Standard, ClockType.Timestamp, UTF8Type.instance, null, new TimestampReconciler(), "A new cf for a new ks", 0, false, 1.0, 0, 864000, Collections.<byte[], ColumnDefinition>emptyMap());
- KSMetaData newKs = new KSMetaData(newCf.tableName, RackUnawareStrategy.class, 5, newCf);
+ KSMetaData newKs = new KSMetaData(newCf.tableName, RackUnawareStrategy.class, 5, null, null, newCf);
new AddKeyspace(newKs).apply();
@@ -414,7 +414,7 @@ public class DefsTest extends CleanupHel
{
assert DatabaseDescriptor.getTableDefinition("EmptyKeyspace") == null;
- KSMetaData newKs = new KSMetaData("EmptyKeyspace", RackUnawareStrategy.class, 5, new CFMetaData[]{});
+ KSMetaData newKs = new KSMetaData("EmptyKeyspace", RackUnawareStrategy.class, 5, null, null);
new AddKeyspace(newKs).apply();
assert DatabaseDescriptor.getTableDefinition("EmptyKeyspace") != null;