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:30 UTC

svn commit: r980215 - in /cassandra/trunk/src/java/org/apache/cassandra: config/KSMetaData.java db/migration/AddColumnFamily.java db/migration/DropColumnFamily.java db/migration/RenameColumnFamily.java db/migration/RenameKeyspace.java

Author: gdusbabek
Date: Wed Jul 28 21:01:30 2010
New Revision: 980215

URL: http://svn.apache.org/viewvc?rev=980215&view=rev
Log:
move KSM modification code into copy methods. patch by stuhood, reviewed by gdusbabek. CASSANDRA-1237

Modified:
    cassandra/trunk/src/java/org/apache/cassandra/config/KSMetaData.java
    cassandra/trunk/src/java/org/apache/cassandra/db/migration/AddColumnFamily.java
    cassandra/trunk/src/java/org/apache/cassandra/db/migration/DropColumnFamily.java
    cassandra/trunk/src/java/org/apache/cassandra/db/migration/RenameColumnFamily.java
    cassandra/trunk/src/java/org/apache/cassandra/db/migration/RenameKeyspace.java

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=980215&r1=980214&r2=980215&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:30 2010
@@ -49,7 +49,41 @@ public final class KSMetaData
             cfmap.put(cfm.cfName, cfm);
         this.cfMetaData = Collections.unmodifiableMap(cfmap);
     }
-    
+
+    /**
+     * Copies this KSMetaData, adding an additional ColumnFamily.
+     */
+    public KSMetaData withColumnFamily(CFMetaData cfm)
+    {
+        List<CFMetaData> newCfs = new ArrayList<CFMetaData>(cfMetaData().values());
+        newCfs.add(cfm);
+        return new KSMetaData(name, strategyClass, replicationFactor, newCfs.toArray(new CFMetaData[newCfs.size()]));
+    }
+
+    /**
+     * Copies this KSMetaData, removing the ColumnFamily with the given name (which must exist).
+     */
+    public KSMetaData withoutColumnFamily(String cfName)
+    {
+        CFMetaData cfm = cfMetaData().get(cfName);
+        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()]));
+    }
+
+    /**
+     * Copies this KSMetaData, returning a renamed copy.
+     */
+    public KSMetaData withName(String ksName)
+    {
+        // cfs will need to have their tablenames reset, but their ids will not change
+        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()]));
+    }
+
     public boolean equals(Object obj)
     {
         if (obj == null)

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/migration/AddColumnFamily.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/migration/AddColumnFamily.java?rev=980215&r1=980214&r2=980215&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/migration/AddColumnFamily.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/migration/AddColumnFamily.java Wed Jul 28 21:01:30 2010
@@ -73,23 +73,16 @@ public class AddColumnFamily extends Mig
             throw new ConfigurationException("CF is already defined in that keyspace.");
         
         // clone ksm but include the new cf def.
-        KSMetaData newKsm = makeNewKeyspaceDefinition(ksm);
+        KSMetaData newKsm = ksm.withColumnFamily(cfm);
         
         rm = Migration.makeDefinitionMutation(newKsm, null, newVersion);
     }
     
-    private KSMetaData makeNewKeyspaceDefinition(KSMetaData ksm)
-    {
-        List<CFMetaData> newCfs = new ArrayList<CFMetaData>(ksm.cfMetaData().values());
-        newCfs.add(cfm);
-        return new KSMetaData(ksm.name, ksm.strategyClass, ksm.replicationFactor, newCfs.toArray(new CFMetaData[newCfs.size()]));
-    }
-    
     public void applyModels() throws IOException
     {
         // reinitialize the table.
         KSMetaData ksm = DatabaseDescriptor.getTableDefinition(cfm.tableName);
-        ksm = makeNewKeyspaceDefinition(ksm);
+        ksm = ksm.withColumnFamily(cfm);
         try
         {
             CFMetaData.map(cfm);

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/migration/DropColumnFamily.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/migration/DropColumnFamily.java?rev=980215&r1=980214&r2=980215&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/migration/DropColumnFamily.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/migration/DropColumnFamily.java Wed Jul 28 21:01:30 2010
@@ -70,20 +70,10 @@ public class DropColumnFamily extends Mi
         else if (!ksm.cfMetaData().containsKey(cfName))
             throw new ConfigurationException("CF is not defined in that keyspace.");
         
-        KSMetaData newKsm = makeNewKeyspaceDefinition(ksm);
+        KSMetaData newKsm = ksm.withoutColumnFamily(cfName);
         rm = Migration.makeDefinitionMutation(newKsm, null, newVersion);
     }
 
-    private KSMetaData makeNewKeyspaceDefinition(KSMetaData ksm)
-    {
-        // clone ksm but do not include the new def
-        CFMetaData cfm = ksm.cfMetaData().get(cfName);
-        List<CFMetaData> newCfs = new ArrayList<CFMetaData>(ksm.cfMetaData().values());
-        newCfs.remove(cfm);
-        assert newCfs.size() == ksm.cfMetaData().size() - 1;
-        return new KSMetaData(ksm.name, ksm.strategyClass, ksm.replicationFactor, newCfs.toArray(new CFMetaData[newCfs.size()]));
-    }
-
     @Override
     public void beforeApplyModels()
     {
@@ -105,7 +95,7 @@ public class DropColumnFamily extends Mi
         // reinitialize the table.
         KSMetaData existing = DatabaseDescriptor.getTableDefinition(tableName);
         CFMetaData cfm = existing.cfMetaData().get(cfName);
-        KSMetaData ksm = makeNewKeyspaceDefinition(existing);
+        KSMetaData ksm = existing.withoutColumnFamily(cfName);
         CFMetaData.purge(cfm);
         DatabaseDescriptor.setTableDefinition(ksm, newVersion);
         

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/migration/RenameColumnFamily.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/migration/RenameColumnFamily.java?rev=980215&r1=980214&r2=980215&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/migration/RenameColumnFamily.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/migration/RenameColumnFamily.java Wed Jul 28 21:01:30 2010
@@ -38,8 +38,6 @@ import java.util.List;
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-
 public class RenameColumnFamily extends Migration
 {
     private static final Serializer serializer = new Serializer();
@@ -86,12 +84,8 @@ public class RenameColumnFamily extends 
     private KSMetaData makeNewKeyspaceDefinition(KSMetaData ksm)
     {
         CFMetaData oldCfm = ksm.cfMetaData().get(oldName);
-        List<CFMetaData> newCfs = new ArrayList<CFMetaData>(ksm.cfMetaData().values());
-        newCfs.remove(oldCfm);
-        assert newCfs.size() == ksm.cfMetaData().size() - 1;
-        CFMetaData newCfm = CFMetaData.rename(oldCfm, newName);
-        newCfs.add(newCfm);
-        return new KSMetaData(ksm.name, ksm.strategyClass, ksm.replicationFactor, newCfs.toArray(new CFMetaData[newCfs.size()]));
+        KSMetaData temp = ksm.withoutColumnFamily(oldName);
+        return temp.withColumnFamily(CFMetaData.rename(oldCfm, newName));
     }
 
     @Override

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/migration/RenameKeyspace.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/migration/RenameKeyspace.java?rev=980215&r1=980214&r2=980215&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/migration/RenameKeyspace.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/migration/RenameKeyspace.java Wed Jul 28 21:01:30 2010
@@ -69,25 +69,11 @@ public class RenameKeyspace extends Migr
             throw new ConfigurationException("Keyspace already exists.");
         
         // clone the ksm, replacing thename.
-        KSMetaData newKsm = rename(oldKsm, newName, false); 
+        KSMetaData newKsm = oldKsm.withName(newName); 
         
         rm = makeDefinitionMutation(newKsm, oldKsm, newVersion);
     }
     
-    private static KSMetaData rename(KSMetaData ksm, String newName, boolean purgeOldCfs)
-    {
-        // cfs will need to have their tablenames reset. CFMetaData are immutable, so new ones get created with the
-        // same ids.
-        List<CFMetaData> newCfs = new ArrayList<CFMetaData>(ksm.cfMetaData().size());
-        for (CFMetaData oldCf : ksm.cfMetaData().values())
-        {
-            if (purgeOldCfs)
-                CFMetaData.purge(oldCf);
-            newCfs.add(CFMetaData.renameTable(oldCf, newName));
-        }
-        return new KSMetaData(newName, ksm.strategyClass, ksm.replicationFactor, newCfs.toArray(new CFMetaData[newCfs.size()]));
-    }
-
     @Override
     public ICompactSerializer getSerializer()
     {
@@ -102,8 +88,9 @@ public class RenameKeyspace extends Migr
         
         KSMetaData oldKsm = DatabaseDescriptor.getTableDefinition(oldName);
         for (CFMetaData cfm : oldKsm.cfMetaData().values())
+            // remove cf mappings for previous ksname
             CFMetaData.purge(cfm);
-        KSMetaData newKsm = rename(oldKsm, newName, true);
+        KSMetaData newKsm = oldKsm.withName(newName);
         for (CFMetaData cfm : newKsm.cfMetaData().values())
         {
             try