You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by bl...@apache.org on 2015/08/14 18:07:46 UTC
cassandra git commit: Provide a per-table text->blob map for storing
extra metadata
Repository: cassandra
Updated Branches:
refs/heads/cassandra-3.0 128842766 -> 507ed1484
Provide a per-table text->blob map for storing extra metadata
patch by Benjamin Lerer; reviewed by Aleksey Yeschenko for CASSANDRA-9426
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/507ed148
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/507ed148
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/507ed148
Branch: refs/heads/cassandra-3.0
Commit: 507ed148408b113aa5b4e306bc512a0dcbb5e4f8
Parents: 1288427
Author: blerer <be...@datastax.com>
Authored: Fri Aug 14 18:04:34 2015 +0200
Committer: blerer <be...@datastax.com>
Committed: Fri Aug 14 18:04:34 2015 +0200
----------------------------------------------------------------------
.../org/apache/cassandra/config/CFMetaData.java | 6 ++
.../apache/cassandra/schema/SchemaKeyspace.java | 39 +++++++------
.../apache/cassandra/schema/TableParams.java | 25 ++++++--
.../cassandra/schema/SchemaKeyspaceTest.java | 60 +++++++++++++++++---
4 files changed, 103 insertions(+), 27 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/507ed148/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 0db3814..a830469 100644
--- a/src/java/org/apache/cassandra/config/CFMetaData.java
+++ b/src/java/org/apache/cassandra/config/CFMetaData.java
@@ -200,6 +200,12 @@ public final class CFMetaData
return this;
}
+ public CFMetaData extensions(Map<String, ByteBuffer> extensions)
+ {
+ params = TableParams.builder(params).extensions(extensions).build();
+ return this;
+ }
+
public CFMetaData droppedColumns(Map<ByteBuffer, DroppedColumn> cols)
{
droppedColumns = cols;
http://git-wip-us.apache.org/repos/asf/cassandra/blob/507ed148/src/java/org/apache/cassandra/schema/SchemaKeyspace.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/schema/SchemaKeyspace.java b/src/java/org/apache/cassandra/schema/SchemaKeyspace.java
index 5791db7..4f3fe93 100644
--- a/src/java/org/apache/cassandra/schema/SchemaKeyspace.java
+++ b/src/java/org/apache/cassandra/schema/SchemaKeyspace.java
@@ -99,6 +99,7 @@ public final class SchemaKeyspace
+ "compression map<text, text>,"
+ "dclocal_read_repair_chance double,"
+ "default_time_to_live int,"
+ + "extensions map<text, blob>,"
+ "flags set<text>," // SUPER, COUNTER, DENSE, COMPOUND
+ "gc_grace_seconds int,"
+ "id uuid,"
@@ -852,7 +853,8 @@ public final class SchemaKeyspace
.add("speculative_retry", params.speculativeRetry.toString())
.map("caching", params.caching.asMap())
.map("compaction", params.compaction.asMap())
- .map("compression", params.compression.asMap());
+ .map("compression", params.compression.asMap())
+ .map("extensions", params.extensions);
}
public static Mutation makeUpdateTableMutation(KeyspaceMetadata keyspace,
@@ -1071,21 +1073,26 @@ public final class SchemaKeyspace
private static TableParams createTableParamsFromRow(UntypedResultSet.Row row)
{
- return TableParams.builder()
- .bloomFilterFpChance(row.getDouble("bloom_filter_fp_chance"))
- .caching(CachingParams.fromMap(row.getTextMap("caching")))
- .comment(row.getString("comment"))
- .compaction(CompactionParams.fromMap(row.getTextMap("compaction")))
- .compression(CompressionParams.fromMap(row.getTextMap("compression")))
- .dcLocalReadRepairChance(row.getDouble("dclocal_read_repair_chance"))
- .defaultTimeToLive(row.getInt("default_time_to_live"))
- .gcGraceSeconds(row.getInt("gc_grace_seconds"))
- .maxIndexInterval(row.getInt("max_index_interval"))
- .memtableFlushPeriodInMs(row.getInt("memtable_flush_period_in_ms"))
- .minIndexInterval(row.getInt("min_index_interval"))
- .readRepairChance(row.getDouble("read_repair_chance"))
- .speculativeRetry(SpeculativeRetryParam.fromString(row.getString("speculative_retry")))
- .build();
+ TableParams.Builder builder = TableParams.builder();
+
+ builder.bloomFilterFpChance(row.getDouble("bloom_filter_fp_chance"))
+ .caching(CachingParams.fromMap(row.getTextMap("caching")))
+ .comment(row.getString("comment"))
+ .compaction(CompactionParams.fromMap(row.getTextMap("compaction")))
+ .compression(CompressionParams.fromMap(row.getTextMap("compression")))
+ .dcLocalReadRepairChance(row.getDouble("dclocal_read_repair_chance"))
+ .defaultTimeToLive(row.getInt("default_time_to_live"))
+ .gcGraceSeconds(row.getInt("gc_grace_seconds"))
+ .maxIndexInterval(row.getInt("max_index_interval"))
+ .memtableFlushPeriodInMs(row.getInt("memtable_flush_period_in_ms"))
+ .minIndexInterval(row.getInt("min_index_interval"))
+ .readRepairChance(row.getDouble("read_repair_chance"))
+ .speculativeRetry(SpeculativeRetryParam.fromString(row.getString("speculative_retry")));
+
+ if (row.has("extensions"))
+ builder.extensions(row.getMap("extensions", UTF8Type.instance, BytesType.instance));
+
+ return builder.build();
}
/*
http://git-wip-us.apache.org/repos/asf/cassandra/blob/507ed148/src/java/org/apache/cassandra/schema/TableParams.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/schema/TableParams.java b/src/java/org/apache/cassandra/schema/TableParams.java
index 3b3a88e..64e2c36 100644
--- a/src/java/org/apache/cassandra/schema/TableParams.java
+++ b/src/java/org/apache/cassandra/schema/TableParams.java
@@ -17,11 +17,14 @@
*/
package org.apache.cassandra.schema;
+import java.nio.ByteBuffer;
+import java.util.Map;
+
import com.google.common.base.MoreObjects;
import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableMap;
import org.apache.cassandra.exceptions.ConfigurationException;
-
import static java.lang.String.format;
public final class TableParams
@@ -37,6 +40,7 @@ public final class TableParams
COMPRESSION,
DCLOCAL_READ_REPAIR_CHANCE,
DEFAULT_TIME_TO_LIVE,
+ EXTENSIONS,
GC_GRACE_SECONDS,
MAX_INDEX_INTERVAL,
MEMTABLE_FLUSH_PERIOD_IN_MS,
@@ -73,6 +77,7 @@ public final class TableParams
public final CachingParams caching;
public final CompactionParams compaction;
public final CompressionParams compression;
+ public final ImmutableMap<String, ByteBuffer> extensions;
private TableParams(Builder builder)
{
@@ -91,6 +96,7 @@ public final class TableParams
caching = builder.caching;
compaction = builder.compaction;
compression = builder.compression;
+ extensions = builder.extensions;
}
public static Builder builder()
@@ -112,7 +118,8 @@ public final class TableParams
.memtableFlushPeriodInMs(params.memtableFlushPeriodInMs)
.minIndexInterval(params.minIndexInterval)
.readRepairChance(params.readRepairChance)
- .speculativeRetry(params.speculativeRetry);
+ .speculativeRetry(params.speculativeRetry)
+ .extensions(params.extensions);
}
public void validate()
@@ -191,7 +198,8 @@ public final class TableParams
&& speculativeRetry.equals(p.speculativeRetry)
&& caching.equals(p.caching)
&& compaction.equals(p.compaction)
- && compression.equals(p.compression);
+ && compression.equals(p.compression)
+ && extensions.equals(p.extensions);
}
@Override
@@ -209,7 +217,8 @@ public final class TableParams
speculativeRetry,
caching,
compaction,
- compression);
+ compression,
+ extensions);
}
@Override
@@ -229,6 +238,7 @@ public final class TableParams
.add(Option.CACHING.toString(), caching)
.add(Option.COMPACTION.toString(), compaction)
.add(Option.COMPRESSION.toString(), compression)
+ .add(Option.EXTENSIONS.toString(), extensions)
.toString();
}
@@ -247,6 +257,7 @@ public final class TableParams
private CachingParams caching = CachingParams.DEFAULT;
private CompactionParams compaction = CompactionParams.DEFAULT;
private CompressionParams compression = CompressionParams.DEFAULT;
+ private ImmutableMap<String, ByteBuffer> extensions = ImmutableMap.of();
public Builder()
{
@@ -334,5 +345,11 @@ public final class TableParams
compression = val;
return this;
}
+
+ public Builder extensions(Map<String, ByteBuffer> val)
+ {
+ extensions = ImmutableMap.copyOf(val);
+ return this;
+ }
}
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/507ed148/test/unit/org/apache/cassandra/schema/SchemaKeyspaceTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/schema/SchemaKeyspaceTest.java b/test/unit/org/apache/cassandra/schema/SchemaKeyspaceTest.java
index 11fe3f1..2f51803 100644
--- a/test/unit/org/apache/cassandra/schema/SchemaKeyspaceTest.java
+++ b/test/unit/org/apache/cassandra/schema/SchemaKeyspaceTest.java
@@ -18,18 +18,29 @@
*/
package org.apache.cassandra.schema;
+import java.io.IOException;
+import java.nio.ByteBuffer;
import java.util.ArrayList;
-import java.util.List;
+import java.util.Collections;
import java.util.HashSet;
+import java.util.List;
+
+import com.google.common.collect.ImmutableMap;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
import org.apache.cassandra.SchemaLoader;
import org.apache.cassandra.config.CFMetaData;
import org.apache.cassandra.config.Schema;
-import org.apache.cassandra.db.*;
-import org.apache.cassandra.db.rows.UnfilteredRowIterators;
-import org.apache.cassandra.db.partitions.PartitionUpdate;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.Mutation;
+import org.apache.cassandra.db.SystemKeyspace;
import org.apache.cassandra.db.marshal.AsciiType;
import org.apache.cassandra.db.marshal.UTF8Type;
+import org.apache.cassandra.db.partitions.PartitionUpdate;
+import org.apache.cassandra.db.rows.UnfilteredRowIterators;
import org.apache.cassandra.exceptions.ConfigurationException;
import org.apache.cassandra.thrift.CfDef;
import org.apache.cassandra.thrift.ColumnDef;
@@ -38,10 +49,8 @@ import org.apache.cassandra.thrift.ThriftConversion;
import org.apache.cassandra.utils.ByteBufferUtil;
import org.apache.cassandra.utils.FBUtilities;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
public class SchemaKeyspaceTest
{
@@ -128,6 +137,43 @@ public class SchemaKeyspaceTest
}
}
+ @Test
+ public void testExtensions() throws IOException
+ {
+ String keyspace = "SandBox";
+
+ createTable(keyspace, "CREATE TABLE test (a text primary key, b int, c int)");
+
+ CFMetaData metadata = Schema.instance.getCFMetaData(keyspace, "test");
+ assertTrue("extensions should be empty", metadata.params.extensions.isEmpty());
+
+ ImmutableMap<String, ByteBuffer> extensions = ImmutableMap.of("From ... with Love",
+ ByteBuffer.wrap(new byte[]{0, 0, 7}));
+
+ CFMetaData copy = metadata.copy().extensions(extensions);
+
+ updateTable(keyspace, metadata, copy);
+
+ metadata = Schema.instance.getCFMetaData(keyspace, "test");
+ assertEquals(extensions, metadata.params.extensions);
+ }
+
+ private static void updateTable(String keyspace, CFMetaData oldTable, CFMetaData newTable) throws IOException
+ {
+ KeyspaceMetadata ksm = Schema.instance.getKeyspaceInstance(keyspace).getMetadata();
+ Mutation mutation = SchemaKeyspace.makeUpdateTableMutation(ksm, oldTable, newTable, FBUtilities.timestampMicros(), false);
+ SchemaKeyspace.mergeSchema(Collections.singleton(mutation), true);
+ }
+
+ private static void createTable(String keyspace, String cql) throws IOException
+ {
+ CFMetaData table = CFMetaData.compile(cql, keyspace);
+
+ KeyspaceMetadata ksm = KeyspaceMetadata.create(keyspace, KeyspaceParams.simple(1), Tables.of(table));
+ Mutation mutation = SchemaKeyspace.makeCreateTableMutation(ksm, table, FBUtilities.timestampMicros());
+ SchemaKeyspace.mergeSchema(Collections.singleton(mutation), true);
+ }
+
private static void checkInverses(CFMetaData cfm) throws Exception
{
KeyspaceMetadata keyspace = Schema.instance.getKSMetaData(cfm.ksName);