Author: gdusbabek
Date: Thu Mar 4 20:17:12 2010
New Revision: 919155
URL: http://svn.apache.org/viewvc?rev=919155&view=rev
Log:
dump and load definition tables
Added:
incubator/cassandra/trunk/src/java/org/apache/cassandra/db/DefsTable.java
incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/DefsTest.java
Modified:
incubator/cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java
incubator/cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java
incubator/cassandra/trunk/test/system/test_thrift_server.py
Modified:
incubator/cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java
URL:
http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java?rev=919155&r1=919154&r2=919155&view=diff
==============================================================================
---
incubator/cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java
(original)
+++
incubator/cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java
Thu Mar 4 20:17:12 2010
@@ -41,7 +41,7 @@
public final double rowCacheSize; // default 0
public final double keyCacheSize; // default 0.01
- CFMetaData(String tableName, String cfName, String columnType,
AbstractType comparator, AbstractType subcolumnComparator, String comment,
double rowCacheSize, double keyCacheSize)
+ public CFMetaData(String tableName, String cfName, String columnType,
AbstractType comparator, AbstractType subcolumnComparator, String comment,
double rowCacheSize, double keyCacheSize)
{
this.tableName = tableName;
this.cfName = cfName;
Modified:
incubator/cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
URL:
http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java?rev=919155&r1=919154&r2=919155&view=diff
==============================================================================
---
incubator/cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
(original)
+++
incubator/cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
Thu Mar 4 20:17:12 2010
@@ -24,6 +24,7 @@
import org.apache.cassandra.db.commitlog.CommitLog;
import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.db.marshal.BytesType;
+import org.apache.cassandra.db.marshal.TimeUUIDType;
import org.apache.cassandra.db.marshal.UTF8Type;
import org.apache.cassandra.dht.IPartitioner;
import org.apache.cassandra.locator.IEndPointSnitch;
@@ -457,7 +458,7 @@
readTablesFromXml();
if (tables.isEmpty())
throw new ConfigurationException("No keyspaces configured");
-
+
// Hardcoded system tables
KSMetaData systemMeta = new KSMetaData(Table.SYSTEM_TABLE, null,
-1, null);
tables.put(Table.SYSTEM_TABLE, systemMeta);
@@ -479,6 +480,12 @@
0.0,
0.01));
+ // todo: fill in repStrat and epSnitch when this table is set to
replicate.
+ KSMetaData ksDefs = new KSMetaData(Table.DEFINITIONS, null, -1,
null);
+ ksDefs.cfMetaData.put(DefsTable.MIGRATIONS_CF, new
CFMetaData(ksDefs.name, DefsTable.MIGRATIONS_CF, "Standard", new
TimeUUIDType(), null, "individual schema mutations", 0, 0));
+ ksDefs.cfMetaData.put(DefsTable.SCHEMA_CF, new
CFMetaData(ksDefs.name, DefsTable.SCHEMA_CF, "Standard", new UTF8Type(), null,
"current state of the schema", 0, 0));
+ tables.put(Table.DEFINITIONS, ksDefs);
+
/* Load the seeds for node contact points */
String[] seedsxml = xmlUtils.getNodeValues("/Storage/Seeds/Seed");
if (seedsxml.length <= 0)
@@ -945,6 +952,7 @@
{
List<String> tableslist = new ArrayList<String>(tables.keySet());
tableslist.remove(Table.SYSTEM_TABLE);
+ tableslist.remove(Table.DEFINITIONS);
return Collections.unmodifiableList(tableslist);
}
@@ -1119,6 +1127,11 @@
return (int)Math.min(FBUtilities.absoluteFromFraction(v,
expectedRows), Integer.MAX_VALUE);
}
+ public static KSMetaData getTableDefinition(String table)
+ {
+ return tables.get(table);
+ }
+
private static class ConfigurationException extends Exception
{
public ConfigurationException(String message)
Added: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/DefsTable.java
URL:
http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/DefsTable.java?rev=919155&view=auto
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/DefsTable.java
(added)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/DefsTable.java
Thu Mar 4 20:17:12 2010
@@ -0,0 +1,68 @@
+/**
+ * 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.db;
+
+import org.apache.cassandra.config.CFMetaData;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.config.KSMetaData;
+import org.apache.cassandra.db.filter.NamesQueryFilter;
+import org.apache.cassandra.db.filter.QueryPath;
+import org.apache.cassandra.db.filter.SliceQueryFilter;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Map;
+import java.util.UUID;
+
+public class DefsTable
+{
+ public static final String MIGRATIONS_CF = "Migrations";
+ public static final String SCHEMA_CF = "Schema";
+
+ public static void dumpToStorage(UUID version) throws IOException
+ {
+ String versionKey = version.toString();
+ long now = System.currentTimeMillis();
+ RowMutation rm = new RowMutation(Table.DEFINITIONS, versionKey);
+ for (String tableName : DatabaseDescriptor.getNonSystemTables())
+ {
+ KSMetaData ks = DatabaseDescriptor.getTableDefinition(tableName);
+ rm.add(new QueryPath(SCHEMA_CF, null, ks.name.getBytes()),
KSMetaData.serialize(ks), now);
+ }
+ rm.apply();
+ }
+
+ public static Collection<KSMetaData> loadFromStorage(UUID version) throws
IOException
+ {
+ Table defs = Table.open(Table.DEFINITIONS);
+ ColumnFamilyStore cfStore = defs.getColumnFamilyStore(SCHEMA_CF);
+ SliceQueryFilter filter = new SliceQueryFilter(version.toString(), new
QueryPath(SCHEMA_CF), "".getBytes(), "".getBytes(), false, 1024);
+ ColumnFamily cf = cfStore.getColumnFamily(filter);
+ Collection<KSMetaData> tables = new ArrayList<KSMetaData>();
+ for (IColumn col : cf.getSortedColumns())
+ {
+ String ksName = new String(col.name());
+ KSMetaData ks = KSMetaData.deserialize(new
ByteArrayInputStream(col.value()));
+ tables.add(ks);
+ }
+ return tables;
+ }
+}
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java
URL:
http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java?rev=919155&r1=919154&r2=919155&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java
(original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java Thu
Mar 4 20:17:12 2010
@@ -46,6 +46,7 @@
public class Table
{
public static final String SYSTEM_TABLE = "system";
+ public static final String DEFINITIONS = "definitions";
private static final Logger logger = Logger.getLogger(Table.class);
private static final String SNAPSHOT_SUBDIR_NAME = "snapshots";
Modified: incubator/cassandra/trunk/test/system/test_thrift_server.py
URL:
http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/system/test_thrift_server.py?rev=919155&r1=919154&r2=919155&view=diff
==============================================================================
--- incubator/cassandra/trunk/test/system/test_thrift_server.py (original)
+++ incubator/cassandra/trunk/test/system/test_thrift_server.py Thu Mar 4
20:17:12 2010
@@ -892,7 +892,7 @@
def test_describe_keyspace(self):
""" Test keyspace description """
kspaces = client.describe_keyspaces()
- assert len(kspaces) == 5, kspaces # ['Keyspace1', 'Keyspace2',
'Keyspace3', 'Keyspace4', 'system']
+ assert len(kspaces) == 6, kspaces # ['system', 'Keyspace2',
'Keyspace3', 'Keyspace1', 'Keyspace4', 'definitions']
ks1 = client.describe_keyspace("Keyspace1")
assert set(ks1.keys()) == set(['Super1', 'Standard1', 'Standard2',
'StandardLong1', 'StandardLong2', 'Super3', 'Super2', 'Super4'])
sysks = client.describe_keyspace("system")
Added: incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/DefsTest.java
URL:
http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/DefsTest.java?rev=919155&view=auto
==============================================================================
--- incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/DefsTest.java
(added)
+++ incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/DefsTest.java
Thu Mar 4 20:17:12 2010
@@ -0,0 +1,105 @@
+/**
+ * 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.db;
+
+import org.apache.cassandra.config.CFMetaData;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.config.KSMetaData;
+import org.apache.cassandra.db.marshal.TimeUUIDType;
+import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.FBUtilitiesTest;
+import org.apache.cassandra.utils.UUIDGen;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.UUID;
+
+public class DefsTest
+{
+ @Before
+ public void setup()
+ {
+ // just something to ensure that DD has been initialized.
+ DatabaseDescriptor.getNonSystemTables();
+ }
+
+ @Test
+ public void saveAndRestore() throws IOException
+ {
+ // verify dump and reload.
+ UUID first =
UUIDGen.makeType1UUIDFromHost(FBUtilities.getLocalAddress());
+ DefsTable.dumpToStorage(first);
+ List<KSMetaData> defs = new
ArrayList<KSMetaData>(DefsTable.loadFromStorage(first));
+
+ assert defs.size() > 0;
+ assert defs.size() == DatabaseDescriptor.getNonSystemTables().size();
+ for (KSMetaData loaded : defs)
+ {
+ KSMetaData defined =
DatabaseDescriptor.getTableDefinition(loaded.name);
+ assert defined.equals(loaded);
+ }
+
+ // make a change and compare.
+ KSMetaData loadedKs = defs.iterator().next();
+ KSMetaData changed =
DatabaseDescriptor.getTableDefinition(loadedKs.name);
+ changed.cfMetaData.put("newly defined cf", new CFMetaData(changed.name,
+ "newly
defined cf",
+ "Standard",
+ new
TimeUUIDType(),
+ null,
+ "this is to
test a newly added table",
+ 0.2d,
+ 0.3d));
+ assert !changed.equals(loadedKs);
+
+ UUID second = UUIDGen.makeType1UUID("01:23:45:ab:cd:ef");
+ DefsTable.dumpToStorage(second);
+ defs = new ArrayList<KSMetaData>(DefsTable.loadFromStorage(second));
+
+ // defs should equal what is in DD.
+ assert defs.size() > 0;
+ assert defs.size() == DatabaseDescriptor.getNonSystemTables().size();
+ for (KSMetaData loaded : defs)
+ {
+ KSMetaData defined =
DatabaseDescriptor.getTableDefinition(loaded.name);
+ assert defined.equals(loaded);
+ }
+
+ // should be the same *except* for loadedKs.
+ List<KSMetaData> originals = new
ArrayList<KSMetaData>(DefsTable.loadFromStorage(first));
+ assert originals.size() == defs.size();
+ for (int i = 0; i < defs.size(); i++)
+ {
+ KSMetaData a = originals.get(i);
+ KSMetaData b = defs.get(i);
+ if (a.name.equals(changed.name))
+ assert !a.equals(b);
+ else
+ assert a.equals(b);
+ }
+ }
+
+
+
+
+}