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);
+        }
+    }
+
+    
+
+    
+}


Reply via email to