diff --git a/src/java/org/apache/cassandra/config/CFMetaData.java b/src/java/org/apache/cassandra/config/CFMetaData.java index 4fe4692bff..b127fec348 100644 --- a/src/java/org/apache/cassandra/config/CFMetaData.java +++ b/src/java/org/apache/cassandra/config/CFMetaData.java @@ -255,14 +255,13 @@ public final class CFMetaData double keyCacheSize = din.readDouble(); double readRepairChance = din.readDouble(); int cfId = din.readInt(); - int columnMetadataSize = din.readInt(); + int columnMetadataEntries = din.readInt(); Map column_metadata = new TreeMap(FBUtilities.byteArrayComparator); - while (columnMetadataSize > 0) + for (int i = 0; i < columnMetadataEntries; i++) { int cdSize = din.readInt(); byte[] cdBytes = new byte[cdSize]; - if (in.read(cdBytes) != cdSize) - throw new IOException("short read of ColumnDefinition"); + din.readFully(cdBytes); ColumnDefinition cd = ColumnDefinition.deserialize(cdBytes); column_metadata.put(cd.name, cd); } diff --git a/src/java/org/apache/cassandra/config/ColumnFamily.java b/src/java/org/apache/cassandra/config/ColumnFamily.java index 9a0ae8f301..1ca1ddb267 100644 --- a/src/java/org/apache/cassandra/config/ColumnFamily.java +++ b/src/java/org/apache/cassandra/config/ColumnFamily.java @@ -18,5 +18,5 @@ public class ColumnFamily { public double keys_cached = CFMetaData.DEFAULT_KEY_CACHE_SIZE; public double read_repair_chance = CFMetaData.DEFAULT_READ_REPAIR_CHANCE; public boolean preload_row_cache = CFMetaData.DEFAULT_PRELOAD_ROW_CACHE; - public Map column_metata = Collections.emptyMap(); + public RawColumnDefinition[] column_metadata = new RawColumnDefinition[0]; } diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java index 18bcfcc1a7..af83354c0f 100644 --- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java +++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java @@ -115,11 +115,14 @@ public class DatabaseDescriptor InputStream input = new FileInputStream(new File(configFileName)); org.yaml.snakeyaml.constructor.Constructor constructor = new org.yaml.snakeyaml.constructor.Constructor(Config.class); TypeDescription desc = new TypeDescription(Config.class); + desc.putListPropertyType("keyspaces", Keyspace.class); TypeDescription ksDesc = new TypeDescription(Keyspace.class); ksDesc.putListPropertyType("column_families", ColumnFamily.class); - desc.putListPropertyType("keyspaces", Keyspace.class); + TypeDescription cfDesc = new TypeDescription(ColumnFamily.class); + cfDesc.putListPropertyType("column_metadata", RawColumnDefinition.class); constructor.addTypeDescription(desc); constructor.addTypeDescription(ksDesc); + constructor.addTypeDescription(cfDesc); Yaml yaml = new Yaml(new Loader(constructor)); conf = (Config)yaml.load(input); @@ -536,7 +539,34 @@ public class DatabaseDescriptor { throw new ConfigurationException("read_repair_chance must be between 0.0 and 1.0"); } - cfDefs[j++] = new CFMetaData(keyspace.name, cf.name, cfType, cf.clock_type, comparator, subcolumnComparator, reconciler, cf.comment, cf.rows_cached, cf.preload_row_cache, cf.keys_cached, cf.read_repair_chance, cf.column_metata); + + Map metadata = new TreeMap(FBUtilities.byteArrayComparator); + for (RawColumnDefinition rcd : cf.column_metadata) + { + try + { + byte[] columnName = rcd.name.getBytes("UTF-8"); + metadata.put(columnName, new ColumnDefinition(columnName, rcd.validator_class, rcd.index_type, rcd.index_name)); + } + catch (UnsupportedEncodingException e) + { + throw new AssertionError(e); + } + } + + cfDefs[j++] = new CFMetaData(keyspace.name, + cf.name, + cfType, + cf.clock_type, + comparator, + subcolumnComparator, + reconciler, + cf.comment, + cf.rows_cached, + cf.preload_row_cache, + cf.keys_cached, + cf.read_repair_chance, + metadata); } defs.add(new KSMetaData(keyspace.name, strategyClass, keyspace.replication_factor, cfDefs)); diff --git a/src/java/org/apache/cassandra/config/RawColumnDefinition.java b/src/java/org/apache/cassandra/config/RawColumnDefinition.java new file mode 100644 index 0000000000..bb51f258cf --- /dev/null +++ b/src/java/org/apache/cassandra/config/RawColumnDefinition.java @@ -0,0 +1,11 @@ +package org.apache.cassandra.config; + +import org.apache.cassandra.thrift.IndexType; + +public class RawColumnDefinition +{ + public String name; + public String validator_class; + public IndexType index_type; + public String index_name; +} diff --git a/test/conf/cassandra.yaml b/test/conf/cassandra.yaml index 7e84302bd6..f279206695 100644 --- a/test/conf/cassandra.yaml +++ b/test/conf/cassandra.yaml @@ -62,6 +62,12 @@ keyspaces: column_type: Super compare_subcolumns_with: UTF8Type + - name: Indexed1 + column_metadata: + - name: birthdate + validator_class: LongType + index_type: KEYS + - name: Keyspace2 replica_placement_strategy: org.apache.cassandra.locator.RackUnawareStrategy replication_factor: 1