You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by sl...@apache.org on 2012/03/18 11:17:51 UTC

[3/5] git commit: Unify migration code

Unify migration code

patch by slebresne; reviewed by xedin for CASSANDRA-4017


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/438acfc8
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/438acfc8
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/438acfc8

Branch: refs/heads/trunk
Commit: 438acfc8c4b58e05791ebc232e4517c71a4631e7
Parents: 09ad083
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Wed Mar 14 16:59:12 2012 +0100
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Sun Mar 18 11:08:56 2012 +0100

----------------------------------------------------------------------
 CHANGES.txt                                        |    1 +
 .../org/apache/cassandra/config/CFMetaData.java    |   25 +-
 .../apache/cassandra/config/ColumnDefinition.java  |    6 +-
 .../cassandra/config/DatabaseDescriptor.java       |    4 +-
 .../org/apache/cassandra/config/KSMetaData.java    |   10 +-
 src/java/org/apache/cassandra/config/Schema.java   |   22 +--
 .../apache/cassandra/cql/DropIndexStatement.java   |    5 +-
 .../org/apache/cassandra/cql/QueryProcessor.java   |   62 +---
 .../cql3/statements/AlterTableStatement.java       |  163 +++++-----
 .../statements/CreateColumnFamilyStatement.java    |    7 +-
 .../cql3/statements/CreateIndexStatement.java      |   82 ++---
 .../cql3/statements/CreateKeyspaceStatement.java   |    7 +-
 .../cql3/statements/DropColumnFamilyStatement.java |    7 +-
 .../cql3/statements/DropIndexStatement.java        |    7 +-
 .../cql3/statements/DropKeyspaceStatement.java     |    7 +-
 .../cql3/statements/SchemaAlteringStatement.java   |   50 +---
 src/java/org/apache/cassandra/db/DefsTable.java    |  209 +++++++++++--
 src/java/org/apache/cassandra/db/Directories.java  |    2 +-
 src/java/org/apache/cassandra/db/SystemTable.java  |    5 +-
 .../cassandra/db/migration/AddColumnFamily.java    |   59 ----
 .../apache/cassandra/db/migration/AddKeyspace.java |   59 ----
 .../cassandra/db/migration/DropColumnFamily.java   |   57 ----
 .../cassandra/db/migration/DropKeyspace.java       |   54 ----
 .../apache/cassandra/db/migration/Migration.java   |  128 --------
 .../cassandra/db/migration/MigrationHelper.java    |  247 ---------------
 .../cassandra/db/migration/UpdateColumnFamily.java |   52 ---
 .../cassandra/db/migration/UpdateKeyspace.java     |   58 ----
 .../apache/cassandra/service/MigrationManager.java |  119 +++++++-
 .../org/apache/cassandra/service/StorageProxy.java |    3 +-
 .../apache/cassandra/thrift/CassandraServer.java   |   47 +--
 .../apache/cassandra/thrift/ThriftValidation.java  |    7 +-
 .../org/apache/cassandra/db/LongTableTest.java     |    4 +-
 .../apache/cassandra/db/MeteredFlusherTest.java    |    8 +-
 .../db/compaction/LongCompactionSpeedTest.java     |    4 +-
 .../cassandra/AbstractSerializationsTester.java    |    2 +-
 test/unit/org/apache/cassandra/CleanupHelper.java  |  126 --------
 test/unit/org/apache/cassandra/EmbeddedServer.java |    2 +-
 test/unit/org/apache/cassandra/SchemaLoader.java   |  115 +++++++-
 test/unit/org/apache/cassandra/cli/CliTest.java    |    6 +-
 .../apache/cassandra/config/CFMetaDataTest.java    |    4 +-
 .../cassandra/config/DatabaseDescriptorTest.java   |   12 +-
 .../unit/org/apache/cassandra/config/DefsTest.java |   94 ++----
 test/unit/org/apache/cassandra/db/CleanupTest.java |    4 +-
 .../apache/cassandra/db/ColumnFamilyStoreTest.java |    4 +-
 .../org/apache/cassandra/db/CommitLogTest.java     |    4 +-
 .../apache/cassandra/db/CounterMutationTest.java   |    4 +-
 .../unit/org/apache/cassandra/db/KeyCacheTest.java |    4 +-
 .../org/apache/cassandra/db/KeyCollisionTest.java  |    4 +-
 .../org/apache/cassandra/db/MultitableTest.java    |    4 +-
 .../unit/org/apache/cassandra/db/NameSortTest.java |    4 +-
 .../apache/cassandra/db/RecoveryManager2Test.java  |    4 +-
 .../apache/cassandra/db/RecoveryManager3Test.java  |    4 +-
 .../apache/cassandra/db/RecoveryManagerTest.java   |    4 +-
 .../cassandra/db/RecoveryManagerTruncateTest.java  |    4 +-
 .../cassandra/db/RemoveColumnFamilyTest.java       |    4 +-
 .../db/RemoveColumnFamilyWithFlush1Test.java       |    4 +-
 .../db/RemoveColumnFamilyWithFlush2Test.java       |    4 +-
 .../org/apache/cassandra/db/RemoveColumnTest.java  |    4 +-
 .../apache/cassandra/db/RemoveSubColumnTest.java   |    4 +-
 .../apache/cassandra/db/RemoveSuperColumnTest.java |    4 +-
 .../unit/org/apache/cassandra/db/RowCacheTest.java |    4 +-
 .../org/apache/cassandra/db/RowIterationTest.java  |    4 +-
 test/unit/org/apache/cassandra/db/ScrubTest.java   |    5 +-
 test/unit/org/apache/cassandra/db/TableTest.java   |    4 +-
 .../unit/org/apache/cassandra/db/TimeSortTest.java |    4 +-
 .../db/compaction/CompactionsPurgeTest.java        |    4 +-
 .../cassandra/db/compaction/CompactionsTest.java   |    4 +-
 .../cassandra/db/compaction/OneCompactionTest.java |    4 +-
 .../cassandra/db/marshal/CompositeTypeTest.java    |    4 +-
 .../db/marshal/DynamicCompositeTypeTest.java       |    4 +-
 .../org/apache/cassandra/dht/BootStrapperTest.java |    4 +-
 .../cassandra/io/BloomFilterTrackerTest.java       |    4 +-
 .../apache/cassandra/io/CompactSerializerTest.java |    4 +-
 .../cassandra/io/LazilyCompactedRowTest.java       |    4 +-
 .../cassandra/io/sstable/LegacySSTableTest.java    |    4 +-
 .../cassandra/io/sstable/SSTableReaderTest.java    |    4 +-
 .../io/sstable/SSTableSimpleWriterTest.java        |    4 +-
 .../apache/cassandra/io/sstable/SSTableTest.java   |    4 +-
 .../cassandra/locator/SimpleStrategyTest.java      |    4 +-
 .../service/AntiEntropyServiceTestAbstract.java    |    4 +-
 .../cassandra/service/CassandraServerTest.java     |    4 +-
 .../service/EmbeddedCassandraServiceTest.java      |    6 +-
 .../cassandra/service/LeaveAndBootstrapTest.java   |   48 ++--
 .../org/apache/cassandra/service/MoveTest.java     |   52 ++--
 .../org/apache/cassandra/service/RemoveTest.java   |   27 ++-
 .../apache/cassandra/service/StorageProxyTest.java |    4 +-
 .../service/StorageServiceClientTest.java          |    6 +-
 .../service/StorageServiceServerTest.java          |    6 +-
 .../cassandra/streaming/StreamingTransferTest.java |    4 +-
 .../cassandra/thrift/ThriftValidationTest.java     |    4 +-
 90 files changed, 818 insertions(+), 1444 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/438acfc8/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index d97fc5a..70db8e5 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -25,6 +25,7 @@
    serialization for schema (CASSANDRA-3792)
  * add missing column validator options to the CLI help (CASSANDRA-3926)
  * skip reading saved key cache if CF's caching strategy is NONE or ROWS_ONLY (CASSANDRA-3954)
+ * Unify migration code (CASSANDRA-4017)
 Merged from 1.0:
  * always compact away deleted hints immediately after handoff (CASSANDRA-3955)
  * delete hints from dropped ColumnFamilies on handoff instead of

http://git-wip-us.apache.org/repos/asf/cassandra/blob/438acfc8/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 157bb9e..2c1df75 100644
--- a/src/java/org/apache/cassandra/config/CFMetaData.java
+++ b/src/java/org/apache/cassandra/config/CFMetaData.java
@@ -39,7 +39,6 @@ import org.apache.cassandra.cql3.UntypedResultSet;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.compaction.AbstractCompactionStrategy;
 import org.apache.cassandra.db.marshal.*;
-import org.apache.cassandra.db.migration.Migration;
 import org.apache.cassandra.io.IColumnSerializer;
 import org.apache.cassandra.io.compress.CompressionParameters;
 import org.apache.cassandra.io.compress.SnappyCompressor;
@@ -72,9 +71,9 @@ public final class CFMetaData
     public static final CFMetaData StatusCf = newSystemMetadata(SystemTable.STATUS_CF, 0, "persistent metadata for the local node", BytesType.instance, null);
     public static final CFMetaData HintsCf = newSystemMetadata(HintedHandOffManager.HINTS_CF, 1, "hinted handoff data", BytesType.instance, BytesType.instance);
     @Deprecated
-    public static final CFMetaData MigrationsCf = newSystemMetadata(Migration.MIGRATIONS_CF, 2, "individual schema mutations", TimeUUIDType.instance, null);
+    public static final CFMetaData MigrationsCf = newSystemMetadata(DefsTable.OLD_MIGRATIONS_CF, 2, "individual schema mutations", TimeUUIDType.instance, null);
     @Deprecated
-    public static final CFMetaData SchemaCf = newSystemMetadata(Migration.SCHEMA_CF, 3, "current state of the schema", UTF8Type.instance, null);
+    public static final CFMetaData SchemaCf = newSystemMetadata(DefsTable.OLD_SCHEMA_CF, 3, "current state of the schema", UTF8Type.instance, null);
     public static final CFMetaData IndexCf = newSystemMetadata(SystemTable.INDEX_CF, 5, "indexes that have been completed", UTF8Type.instance, null);
     public static final CFMetaData NodeIdCf = newSystemMetadata(SystemTable.NODE_ID_CF, 6, "nodeId and their metadata", TimeUUIDType.instance, null);
     public static final CFMetaData VersionCf =
@@ -884,16 +883,14 @@ public final class CFMetaData
     }
 
     /**
-     * Calculate the difference between current metadata and given and serialize it as schema RowMutation
+     * Create schema mutations to update this metadata to provided new state.
      *
      * @param newState The new metadata (for the same CF)
      * @param modificationTimestamp Timestamp to use for mutation
      *
      * @return Difference between attributes in form of schema mutation
-     *
-     * @throws ConfigurationException if any of the attributes didn't pass validation
      */
-    public RowMutation diff(CFMetaData newState, long modificationTimestamp) throws ConfigurationException
+    public RowMutation toSchemaUpdate(CFMetaData newState, long modificationTimestamp)
     {
         RowMutation rm = new RowMutation(Table.SYSTEM_TABLE, SystemTable.getSchemaKSKey(ksName));
 
@@ -1056,7 +1053,7 @@ public final class CFMetaData
         CFMetaData cfDef = fromSchemaNoColumns(result);
 
         Row serializedColumnDefinitions = ColumnDefinition.readSchema(cfDef.ksName, cfDef.cfName);
-        return addColumnDefinitionSchema(cfDef, serializedColumnDefinitions);
+        return addColumnDefinitionSchema(cfDef, serializedColumnDefinitions).updateCfDef();
     }
 
     private static CFMetaData fromSchema(Row row)
@@ -1131,7 +1128,7 @@ public final class CFMetaData
     // Package protected for use by tests
     static CFMetaData addColumnDefinitionSchema(CFMetaData cfDef, Row serializedColumnDefinitions)
     {
-        for (ColumnDefinition cd : ColumnDefinition.fromSchema(serializedColumnDefinitions, cfDef.comparator))
+        for (ColumnDefinition cd : ColumnDefinition.fromSchema(serializedColumnDefinitions, cfDef.getColumnDefinitionComparator()))
             cfDef.column_metadata.put(cd.name, cd);
         return cfDef;
     }
@@ -1146,9 +1143,10 @@ public final class CFMetaData
         return column_metadata.remove(def.name) != null;
     }
 
-    private void updateCfDef()
+    private CFMetaData updateCfDef()
     {
         cqlCfDef = new CFDefinition(this);
+        return this;
     }
 
     public CFDefinition getCfDef()
@@ -1157,6 +1155,11 @@ public final class CFMetaData
         return cqlCfDef;
     }
 
+    public static boolean isNameValid(String name)
+    {
+        return name.matches("\\w+");
+    }
+
     @Override
     public String toString()
     {
@@ -1178,7 +1181,7 @@ public final class CFMetaData
             .append("maxCompactionThreshold", maxCompactionThreshold)
             .append("keyAlias", keyAlias)
             .append("columnAliases", columnAliases)
-            .append("valueAlias", keyAlias)
+            .append("valueAlias", valueAlias)
             .append("column_metadata", column_metadata)
             .append("compactionStrategyClass", compactionStrategyClass)
             .append("compactionStrategyOptions", compactionStrategyOptions)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/438acfc8/src/java/org/apache/cassandra/config/ColumnDefinition.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/ColumnDefinition.java b/src/java/org/apache/cassandra/config/ColumnDefinition.java
index e47ac07..d8ac960 100644
--- a/src/java/org/apache/cassandra/config/ColumnDefinition.java
+++ b/src/java/org/apache/cassandra/config/ColumnDefinition.java
@@ -32,14 +32,12 @@ import org.apache.cassandra.cql3.UntypedResultSet;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.filter.QueryPath;
 import org.apache.cassandra.db.marshal.*;
-import org.apache.cassandra.db.migration.MigrationHelper;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.thrift.ColumnDef;
 import org.apache.cassandra.thrift.IndexType;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
 
-import static org.apache.cassandra.db.migration.MigrationHelper.*;
 import static org.apache.cassandra.utils.FBUtilities.json;
 
 public class ColumnDefinition
@@ -244,8 +242,8 @@ public class ColumnDefinition
         ColumnFamilyStore columnsStore = SystemTable.schemaCFS(SystemTable.SCHEMA_COLUMNS_CF);
         ColumnFamily cf = columnsStore.getColumnFamily(key,
                                                        new QueryPath(SystemTable.SCHEMA_COLUMNS_CF),
-                                                       MigrationHelper.searchComposite(cfName, true),
-                                                       MigrationHelper.searchComposite(cfName, false),
+                                                       DefsTable.searchComposite(cfName, true),
+                                                       DefsTable.searchComposite(cfName, false),
                                                        false,
                                                        Integer.MAX_VALUE);
         return new Row(key, cf);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/438acfc8/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
index db2669c..34a3ac0 100644
--- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
+++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
@@ -39,7 +39,6 @@ import org.apache.cassandra.config.Config.RequestSchedulerId;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.DefsTable;
 import org.apache.cassandra.db.SystemTable;
-import org.apache.cassandra.db.migration.Migration;
 import org.apache.cassandra.dht.IPartitioner;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.io.util.MmappedSegmentedFile;
@@ -50,6 +49,7 @@ import org.apache.cassandra.locator.SeedProvider;
 import org.apache.cassandra.scheduler.IRequestScheduler;
 import org.apache.cassandra.scheduler.NoScheduler;
 import org.apache.cassandra.service.CacheService;
+import org.apache.cassandra.service.MigrationManager;
 import org.apache.cassandra.thrift.CassandraDaemon;
 import org.apache.cassandra.utils.FBUtilities;
 import org.yaml.snakeyaml.Loader;
@@ -482,7 +482,7 @@ public class DatabaseDescriptor
             // we can load tables from local storage if a version is set in the system table and that actually maps to
             // real data in the definitions table.  If we do end up loading from xml, store the definitions so that we
             // don't load from xml anymore.
-            UUID uuid = Migration.getLastMigrationId();
+            UUID uuid = MigrationManager.getLastMigrationId();
 
             if (uuid == null)
             {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/438acfc8/src/java/org/apache/cassandra/config/KSMetaData.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/KSMetaData.java b/src/java/org/apache/cassandra/config/KSMetaData.java
index 5b9d5ba..c10a94f 100644
--- a/src/java/org/apache/cassandra/config/KSMetaData.java
+++ b/src/java/org/apache/cassandra/config/KSMetaData.java
@@ -38,7 +38,6 @@ import org.apache.cassandra.thrift.CfDef;
 import org.apache.cassandra.thrift.KsDef;
 import org.apache.cassandra.thrift.ColumnDef;
 
-import static org.apache.cassandra.db.migration.MigrationHelper.*;
 import static org.apache.cassandra.utils.FBUtilities.*;
 
 public final class KSMetaData
@@ -161,7 +160,7 @@ public final class KSMetaData
         return ksdef;
     }
 
-    public RowMutation diff(KSMetaData newState, long modificationTimestamp)
+    public RowMutation toSchemaUpdate(KSMetaData newState, long modificationTimestamp)
     {
         return newState.toSchema(modificationTimestamp);
     }
@@ -266,10 +265,15 @@ public final class KSMetaData
         for (CFMetaData cfm : cfms.values())
         {
             Row columnRow = ColumnDefinition.readSchema(cfm.ksName, cfm.cfName);
-            for (ColumnDefinition cd : ColumnDefinition.fromSchema(columnRow, cfm.comparator))
+            for (ColumnDefinition cd : ColumnDefinition.fromSchema(columnRow, cfm.getColumnDefinitionComparator()))
                 cfm.column_metadata.put(cd.name, cd);
         }
 
         return cfms;
     }
+
+    public KSMetaData validate() throws ConfigurationException
+    {
+        return this;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/438acfc8/src/java/org/apache/cassandra/config/Schema.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/Schema.java b/src/java/org/apache/cassandra/config/Schema.java
index 2ae507b..6aa43e0 100644
--- a/src/java/org/apache/cassandra/config/Schema.java
+++ b/src/java/org/apache/cassandra/config/Schema.java
@@ -37,7 +37,6 @@ import org.apache.cassandra.db.Row;
 import org.apache.cassandra.db.SystemTable;
 import org.apache.cassandra.db.Table;
 import org.apache.cassandra.db.marshal.AbstractType;
-import org.apache.cassandra.db.migration.Migration;
 import org.apache.cassandra.io.sstable.Descriptor;
 import org.apache.cassandra.utils.Pair;
 
@@ -95,23 +94,8 @@ public class Schema
      */
     public Schema load(KSMetaData keyspaceDef)
     {
-        if (!Migration.isLegalName(keyspaceDef.name))
-            throw new RuntimeException("invalid keyspace name: " + keyspaceDef.name);
-
         for (CFMetaData cfm : keyspaceDef.cfMetaData().values())
-        {
-            if (!Migration.isLegalName(cfm.cfName))
-                throw new RuntimeException("invalid column family name: " + cfm.cfName);
-
-            try
-            {
-                load(cfm);
-            }
-            catch (ConfigurationException ex)
-            {
-                throw new IOError(ex);
-            }
-        }
+            load(cfm);
 
         setTableDefinition(keyspaceDef);
 
@@ -382,12 +366,12 @@ public class Schema
      *
      * @throws ConfigurationException if ColumnFamily was already loaded
      */
-    public void load(CFMetaData cfm) throws ConfigurationException
+    public void load(CFMetaData cfm)
     {
         Pair<String, String> key = new Pair<String, String>(cfm.ksName, cfm.cfName);
 
         if (cfIdMap.containsKey(key))
-            throw new ConfigurationException("Attempt to assign id to existing column family.");
+            throw new RuntimeException(String.format("Attempting to load already loaded column family %s.%s", cfm.ksName, cfm.cfName));
 
         logger.debug("Adding {} to cfIdMap", cfm);
         cfIdMap.put(key, cfm.cfId);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/438acfc8/src/java/org/apache/cassandra/cql/DropIndexStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql/DropIndexStatement.java b/src/java/org/apache/cassandra/cql/DropIndexStatement.java
index 6d1bb18..9c7a744 100644
--- a/src/java/org/apache/cassandra/cql/DropIndexStatement.java
+++ b/src/java/org/apache/cassandra/cql/DropIndexStatement.java
@@ -23,7 +23,6 @@ package org.apache.cassandra.cql;
 import java.io.IOException;
 
 import org.apache.cassandra.config.*;
-import org.apache.cassandra.db.migration.UpdateColumnFamily;
 import org.apache.cassandra.thrift.CfDef;
 import org.apache.cassandra.thrift.ColumnDef;
 import org.apache.cassandra.thrift.InvalidRequestException;
@@ -37,7 +36,7 @@ public class DropIndexStatement
         index = indexName;
     }
 
-    public UpdateColumnFamily generateMutation(String keyspace)
+    public CFMetaData generateCFMetadataUpdate(String keyspace)
     throws InvalidRequestException, ConfigurationException, IOException
     {
         CfDef cfDef = null;
@@ -54,7 +53,7 @@ public class DropIndexStatement
         if (cfDef == null)
             throw new InvalidRequestException("Index '" + index + "' could not be found in any of the ColumnFamilies of keyspace '" + keyspace + "'");
 
-        return new UpdateColumnFamily(CFMetaData.fromThrift(cfDef));
+        return CFMetaData.fromThrift(cfDef);
     }
 
     private CfDef getUpdatedCFDef(CfDef cfDef) throws InvalidRequestException

http://git-wip-us.apache.org/repos/asf/cassandra/blob/438acfc8/src/java/org/apache/cassandra/cql/QueryProcessor.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql/QueryProcessor.java b/src/java/org/apache/cassandra/cql/QueryProcessor.java
index c824561..912315c 100644
--- a/src/java/org/apache/cassandra/cql/QueryProcessor.java
+++ b/src/java/org/apache/cassandra/cql/QueryProcessor.java
@@ -43,11 +43,11 @@ import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.db.marshal.AsciiType;
 import org.apache.cassandra.db.marshal.MarshalException;
 import org.apache.cassandra.db.marshal.TypeParser;
-import org.apache.cassandra.db.migration.*;
 import org.apache.cassandra.dht.*;
 import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.service.StorageProxy;
 import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.service.MigrationManager;
 import org.apache.cassandra.thrift.*;
 import org.apache.cassandra.thrift.Column;
 import org.apache.cassandra.utils.ByteBufferUtil;
@@ -324,45 +324,6 @@ public class QueryProcessor
         }
     }
 
-    // Copypasta from o.a.c.thrift.CassandraDaemon
-    private static void applyMigrationOnStage(final Migration m) throws SchemaDisagreementException, InvalidRequestException
-    {
-        Future<?> f = StageManager.getStage(Stage.MIGRATION).submit(new Callable<Object>()
-        {
-            public Object call() throws Exception
-            {
-                m.apply();
-                return null;
-            }
-        });
-        try
-        {
-            f.get();
-        }
-        catch (InterruptedException e)
-        {
-            throw new RuntimeException(e);
-        }
-        catch (ExecutionException e)
-        {
-            // this means call() threw an exception. deal with it directly.
-            if (e.getCause() != null)
-            {
-                InvalidRequestException ex = new InvalidRequestException(e.getCause().getMessage());
-                ex.initCause(e.getCause());
-                throw ex;
-            }
-            else
-            {
-                InvalidRequestException ex = new InvalidRequestException(e.getMessage());
-                ex.initCause(e);
-                throw ex;
-            }
-        }
-
-        validateSchemaIsSettled();
-    }
-
     public static void validateKey(ByteBuffer key) throws InvalidRequestException
     {
         if (key == null || key.remaining() == 0)
@@ -723,7 +684,8 @@ public class QueryProcessor
                                 .setStrategy_options(create.getStrategyOptions());
                     ThriftValidation.validateKsDef(ksd);
                     ThriftValidation.validateKeyspaceNotYetExisting(create.getName());
-                    applyMigrationOnStage(new AddKeyspace(KSMetaData.fromThrift(ksd)));
+                    MigrationManager.announceNewKeyspace(KSMetaData.fromThrift(ksd));
+                    validateSchemaIsSettled();
                 }
                 catch (ConfigurationException e)
                 {
@@ -744,7 +706,8 @@ public class QueryProcessor
 
                 try
                 {
-                    applyMigrationOnStage(new AddColumnFamily(cfmd));
+                    MigrationManager.announceNewColumnFamily(cfmd);
+                    validateSchemaIsSettled();
                 }
                 catch (ConfigurationException e)
                 {
@@ -790,7 +753,8 @@ public class QueryProcessor
                 ThriftValidation.validateCfDef(cf_def, oldCfm);
                 try
                 {
-                    applyMigrationOnStage(new UpdateColumnFamily(CFMetaData.fromThrift(cf_def)));
+                    MigrationManager.announceColumnFamilyUpdate(CFMetaData.fromThrift(cf_def));
+                    validateSchemaIsSettled();
                 }
                 catch (ConfigurationException e)
                 {
@@ -809,7 +773,8 @@ public class QueryProcessor
 
                 try
                 {
-                    applyMigrationOnStage(dropIdx.generateMutation(clientState.getKeyspace()));
+                    MigrationManager.announceColumnFamilyUpdate(dropIdx.generateCFMetadataUpdate(clientState.getKeyspace()));
+                    validateSchemaIsSettled();
                 }
                 catch (ConfigurationException e)
                 {
@@ -835,7 +800,8 @@ public class QueryProcessor
 
                 try
                 {
-                    applyMigrationOnStage(new DropKeyspace(deleteKeyspace));
+                    MigrationManager.announceKeyspaceDrop(deleteKeyspace);
+                    validateSchemaIsSettled();
                 }
                 catch (ConfigurationException e)
                 {
@@ -854,7 +820,8 @@ public class QueryProcessor
 
                 try
                 {
-                    applyMigrationOnStage(new DropColumnFamily(keyspace, deleteColumnFamily));
+                    MigrationManager.announceColumnFamilyDrop(keyspace, deleteColumnFamily);
+                    validateSchemaIsSettled();
                 }
                 catch (ConfigurationException e)
                 {
@@ -875,7 +842,8 @@ public class QueryProcessor
 
                 try
                 {
-                    applyMigrationOnStage(new UpdateColumnFamily(CFMetaData.fromThrift(alterTable.getCfDef(keyspace))));
+                    MigrationManager.announceColumnFamilyUpdate(CFMetaData.fromThrift(alterTable.getCfDef(keyspace)));
+                    validateSchemaIsSettled();
                 }
                 catch (ConfigurationException e)
                 {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/438acfc8/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java b/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java
index 8935df7..9e08fbb 100644
--- a/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java
@@ -23,8 +23,7 @@ import java.util.*;
 
 import org.apache.cassandra.cql3.*;
 import org.apache.cassandra.config.*;
-import org.apache.cassandra.db.migration.Migration;
-import org.apache.cassandra.db.migration.UpdateColumnFamily;
+import org.apache.cassandra.service.MigrationManager;
 import org.apache.cassandra.thrift.CfDef;
 import org.apache.cassandra.thrift.ColumnDef;
 import org.apache.cassandra.thrift.InvalidRequestException;
@@ -51,99 +50,91 @@ public class AlterTableStatement extends SchemaAlteringStatement
         this.cfProps.addAll(propertyMap);
     }
 
-    public Migration getMigration() throws InvalidRequestException, IOException
+    public void announceMigration() throws InvalidRequestException, ConfigurationException
     {
-        try
-        {
-            CFMetaData meta = validateColumnFamily(keyspace(), columnFamily());
-            CfDef thriftDef = meta.toThrift();
-
-            CFDefinition cfDef = meta.getCfDef();
-            CFDefinition.Name name = this.oType == Type.OPTS ? null : cfDef.get(columnName);
-            switch (oType)
-            {
-                case ADD:
-                    if (cfDef.isCompact)
-                        throw new InvalidRequestException("Cannot add new column to a compact CF");
-                    if (name != null)
-                    {
-                        switch (name.kind)
-                        {
-                            case KEY_ALIAS:
-                            case COLUMN_ALIAS:
-                                throw new InvalidRequestException(String.format("Invalid column name %s because it conflicts with a PRIMARY KEY part", columnName));
-                            case COLUMN_METADATA:
-                                throw new InvalidRequestException(String.format("Invalid column name %s because it conflicts with an existing column", columnName));
-                        }
-                    }
-                    thriftDef.column_metadata.add(new ColumnDefinition(columnName.key,
-                                CFPropDefs.parseType(validator),
-                                null,
-                                null,
-                                null).toThrift());
-                    break;
-
-                case ALTER:
-                    if (name == null)
-                        throw new InvalidRequestException(String.format("Column %s was not found in CF %s", columnName, columnFamily()));
-
-                    switch (name.kind)
-                    {
-                        case KEY_ALIAS:
-                            thriftDef.key_validation_class = CFPropDefs.parseType(validator).toString();
-                            break;
-                        case COLUMN_ALIAS:
-                            throw new InvalidRequestException(String.format("Cannot alter PRIMARY KEY part %s", columnName));
-                        case VALUE_ALIAS:
-                            thriftDef.default_validation_class = CFPropDefs.parseType(validator).toString();
-                            break;
-                        case COLUMN_METADATA:
-                            ColumnDefinition column = meta.getColumnDefinition(columnName.key);
-                            column.setValidator(CFPropDefs.parseType(validator));
-                            thriftDef.column_metadata.add(column.toThrift());
-                            break;
-                    }
-                    break;
-
-                case DROP:
-                    if (cfDef.isCompact)
-                        throw new InvalidRequestException("Cannot drop columns from a compact CF");
-                    if (name == null)
-                        throw new InvalidRequestException(String.format("Column %s was not found in CF %s", columnName, columnFamily()));
+        CFMetaData meta = validateColumnFamily(keyspace(), columnFamily());
+        CfDef thriftDef = meta.toThrift();
 
+        CFDefinition cfDef = meta.getCfDef();
+        CFDefinition.Name name = this.oType == Type.OPTS ? null : cfDef.get(columnName);
+        switch (oType)
+        {
+            case ADD:
+                if (cfDef.isCompact)
+                    throw new InvalidRequestException("Cannot add new column to a compact CF");
+                if (name != null)
+                {
                     switch (name.kind)
                     {
                         case KEY_ALIAS:
                         case COLUMN_ALIAS:
-                            throw new InvalidRequestException(String.format("Cannot drop PRIMARY KEY part %s", columnName));
+                            throw new InvalidRequestException(String.format("Invalid column name %s because it conflicts with a PRIMARY KEY part", columnName));
                         case COLUMN_METADATA:
-                            ColumnDef toDelete = null;
-                            for (ColumnDef columnDef : thriftDef.column_metadata)
-                            {
-                                if (columnDef.name.equals(columnName.key))
-                                    toDelete = columnDef;
-                            }
-                            assert toDelete != null;
-                            thriftDef.column_metadata.remove(toDelete);
-                            break;
+                            throw new InvalidRequestException(String.format("Invalid column name %s because it conflicts with an existing column", columnName));
                     }
-                    break;
-                case OPTS:
-                    if (cfProps == null)
-                        throw new InvalidRequestException(String.format("ALTER COLUMNFAMILY WITH invoked, but no parameters found"));
-
-                    cfProps.validate();
-                    applyPropertiesToCfDef(thriftDef, cfProps);
-                    break;
-            }
-            return new UpdateColumnFamily(CFMetaData.fromThrift(thriftDef));
-        }
-        catch (ConfigurationException e)
-        {
-            InvalidRequestException ex = new InvalidRequestException(e.toString());
-            ex.initCause(e);
-            throw ex;
+                }
+                thriftDef.column_metadata.add(new ColumnDefinition(columnName.key,
+                            CFPropDefs.parseType(validator),
+                            null,
+                            null,
+                            null).toThrift());
+                break;
+
+            case ALTER:
+                if (name == null)
+                    throw new InvalidRequestException(String.format("Column %s was not found in CF %s", columnName, columnFamily()));
+
+                switch (name.kind)
+                {
+                    case KEY_ALIAS:
+                        thriftDef.key_validation_class = CFPropDefs.parseType(validator).toString();
+                        break;
+                    case COLUMN_ALIAS:
+                        throw new InvalidRequestException(String.format("Cannot alter PRIMARY KEY part %s", columnName));
+                    case VALUE_ALIAS:
+                        thriftDef.default_validation_class = CFPropDefs.parseType(validator).toString();
+                        break;
+                    case COLUMN_METADATA:
+                        ColumnDefinition column = meta.getColumnDefinition(columnName.key);
+                        column.setValidator(CFPropDefs.parseType(validator));
+                        thriftDef.column_metadata.add(column.toThrift());
+                        break;
+                }
+                break;
+
+            case DROP:
+                if (cfDef.isCompact)
+                    throw new InvalidRequestException("Cannot drop columns from a compact CF");
+                if (name == null)
+                    throw new InvalidRequestException(String.format("Column %s was not found in CF %s", columnName, columnFamily()));
+
+                switch (name.kind)
+                {
+                    case KEY_ALIAS:
+                    case COLUMN_ALIAS:
+                        throw new InvalidRequestException(String.format("Cannot drop PRIMARY KEY part %s", columnName));
+                    case COLUMN_METADATA:
+                        ColumnDef toDelete = null;
+                        for (ColumnDef columnDef : thriftDef.column_metadata)
+                        {
+                            if (columnDef.name.equals(columnName.key))
+                                toDelete = columnDef;
+                        }
+                        assert toDelete != null;
+                        thriftDef.column_metadata.remove(toDelete);
+                        break;
+                }
+                break;
+            case OPTS:
+                if (cfProps == null)
+                    throw new InvalidRequestException(String.format("ALTER COLUMNFAMILY WITH invoked, but no parameters found"));
+
+                cfProps.validate();
+                applyPropertiesToCfDef(thriftDef, cfProps);
+                break;
         }
+
+        MigrationManager.announceColumnFamilyUpdate(CFMetaData.fromThrift(thriftDef));
     }
 
     public static void applyPropertiesToCfDef(CfDef cfDef, CFPropDefs cfProps) throws InvalidRequestException

http://git-wip-us.apache.org/repos/asf/cassandra/blob/438acfc8/src/java/org/apache/cassandra/cql3/statements/CreateColumnFamilyStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateColumnFamilyStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateColumnFamilyStatement.java
index e175fed..1689895 100644
--- a/src/java/org/apache/cassandra/cql3/statements/CreateColumnFamilyStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/CreateColumnFamilyStatement.java
@@ -35,9 +35,8 @@ import org.apache.cassandra.config.ConfigurationException;
 import org.apache.cassandra.db.ColumnFamilyType;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.db.marshal.CompositeType;
-import org.apache.cassandra.db.migration.AddColumnFamily;
-import org.apache.cassandra.db.migration.Migration;
 import org.apache.cassandra.service.ClientState;
+import org.apache.cassandra.service.MigrationManager;
 import org.apache.cassandra.thrift.CqlResult;
 import org.apache.cassandra.thrift.InvalidRequestException;
 import org.apache.cassandra.thrift.ThriftValidation;
@@ -78,11 +77,11 @@ public class CreateColumnFamilyStatement extends SchemaAlteringStatement
         return columnDefs;
     }
 
-    public Migration getMigration() throws InvalidRequestException, ConfigurationException, IOException
+    public void announceMigration() throws InvalidRequestException, ConfigurationException
     {
         CFMetaData cfmd = getCFMetaData();
         ThriftValidation.validateCfDef(cfmd.toThrift(), null);
-        return new AddColumnFamily(cfmd);
+        MigrationManager.announceNewColumnFamily(cfmd);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/cassandra/blob/438acfc8/src/java/org/apache/cassandra/cql3/statements/CreateIndexStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateIndexStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateIndexStatement.java
index cc738c4..c42a854 100644
--- a/src/java/org/apache/cassandra/cql3/statements/CreateIndexStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/CreateIndexStatement.java
@@ -24,8 +24,7 @@ import org.slf4j.LoggerFactory;
 import org.apache.cassandra.config.CFMetaData;
 import org.apache.cassandra.config.ConfigurationException;
 import org.apache.cassandra.cql3.*;
-import org.apache.cassandra.db.migration.Migration;
-import org.apache.cassandra.db.migration.UpdateColumnFamily;
+import org.apache.cassandra.service.MigrationManager;
 import org.apache.cassandra.thrift.CfDef;
 import org.apache.cassandra.thrift.ColumnDef;
 import org.apache.cassandra.thrift.IndexType;
@@ -47,60 +46,47 @@ public class CreateIndexStatement extends SchemaAlteringStatement
         this.columnName = columnName;
     }
 
-    public Migration getMigration() throws InvalidRequestException, ConfigurationException
+    public void announceMigration() throws InvalidRequestException, ConfigurationException
     {
-        try
+        CFMetaData oldCfm = ThriftValidation.validateColumnFamily(keyspace(), columnFamily());
+        boolean columnExists = false;
+        // mutating oldCfm directly would be bad, but mutating a Thrift copy is fine.  This also
+        // sets us up to use validateCfDef to check for index name collisions.
+        CfDef cf_def = oldCfm.toThrift();
+        for (ColumnDef cd : cf_def.column_metadata)
         {
-            CFMetaData oldCfm = ThriftValidation.validateColumnFamily(keyspace(), columnFamily());
-            boolean columnExists = false;
-            // mutating oldCfm directly would be bad, but mutating a Thrift copy is fine.  This also
-            // sets us up to use validateCfDef to check for index name collisions.
-            CfDef cf_def = oldCfm.toThrift();
-            for (ColumnDef cd : cf_def.column_metadata)
+            if (cd.name.equals(columnName.key))
             {
-                if (cd.name.equals(columnName.key))
-                {
-                    if (cd.index_type != null)
-                        throw new InvalidRequestException("Index already exists");
-                    if (logger.isDebugEnabled())
-                        logger.debug("Updating column {} definition for index {}", columnName, indexName);
-                    cd.setIndex_type(IndexType.KEYS);
-                    cd.setIndex_name(indexName);
-                    columnExists = true;
-                    break;
-                }
+                if (cd.index_type != null)
+                    throw new InvalidRequestException("Index already exists");
+                if (logger.isDebugEnabled())
+                    logger.debug("Updating column {} definition for index {}", columnName, indexName);
+                cd.setIndex_type(IndexType.KEYS);
+                cd.setIndex_name(indexName);
+                columnExists = true;
+                break;
             }
-            if (!columnExists)
+        }
+        if (!columnExists)
+        {
+            CFDefinition cfDef = oldCfm.getCfDef();
+            CFDefinition.Name name = cfDef.get(columnName);
+            if (name != null)
             {
-                CFDefinition cfDef = oldCfm.getCfDef();
-                CFDefinition.Name name = cfDef.get(columnName);
-                if (name != null)
+                switch (name.kind)
                 {
-                    switch (name.kind)
-                    {
-                        case KEY_ALIAS:
-                        case COLUMN_ALIAS:
-                            throw new InvalidRequestException(String.format("Cannot create index on PRIMARY KEY part %s", columnName));
-                        case VALUE_ALIAS:
-                            throw new InvalidRequestException(String.format("Cannot create index on column %s of compact CF", columnName));
-                    }
+                    case KEY_ALIAS:
+                    case COLUMN_ALIAS:
+                        throw new InvalidRequestException(String.format("Cannot create index on PRIMARY KEY part %s", columnName));
+                    case VALUE_ALIAS:
+                        throw new InvalidRequestException(String.format("Cannot create index on column %s of compact CF", columnName));
                 }
-                throw new InvalidRequestException("No column definition found for column " + columnName);
             }
-
-            CFMetaData.addDefaultIndexNames(cf_def);
-            ThriftValidation.validateCfDef(cf_def, oldCfm);
-            return new UpdateColumnFamily(CFMetaData.fromThrift(cf_def));
-        }
-        catch (InvalidRequestException e)
-        {
-            logger.error("oups", e);
-            throw e;
-        }
-        catch (ConfigurationException e)
-        {
-            logger.error("oups", e);
-            throw e;
+            throw new InvalidRequestException("No column definition found for column " + columnName);
         }
+
+        CFMetaData.addDefaultIndexNames(cf_def);
+        ThriftValidation.validateCfDef(cf_def, oldCfm);
+        MigrationManager.announceColumnFamilyUpdate(CFMetaData.fromThrift(cf_def));
     }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/438acfc8/src/java/org/apache/cassandra/cql3/statements/CreateKeyspaceStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateKeyspaceStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateKeyspaceStatement.java
index 1e9349c..c5de9d6 100644
--- a/src/java/org/apache/cassandra/cql3/statements/CreateKeyspaceStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/CreateKeyspaceStatement.java
@@ -26,10 +26,9 @@ import java.util.Map;
 import org.apache.cassandra.config.ConfigurationException;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.KSMetaData;
-import org.apache.cassandra.db.migration.AddKeyspace;
-import org.apache.cassandra.db.migration.Migration;
 import org.apache.cassandra.locator.AbstractReplicationStrategy;
 import org.apache.cassandra.service.ClientState;
+import org.apache.cassandra.service.MigrationManager;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.thrift.CfDef;
 import org.apache.cassandra.thrift.InvalidRequestException;
@@ -103,12 +102,12 @@ public class CreateKeyspaceStatement extends SchemaAlteringStatement
         }
     }
 
-    public Migration getMigration() throws InvalidRequestException, ConfigurationException, IOException
+    public void announceMigration() throws InvalidRequestException, ConfigurationException
     {
         KsDef ksd = new KsDef(name, strategyClass, Collections.<CfDef>emptyList());
         ksd.setStrategy_options(strategyOptions);
         ThriftValidation.validateKsDef(ksd);
         ThriftValidation.validateKeyspaceNotYetExisting(name);
-        return new AddKeyspace(KSMetaData.fromThrift(ksd));
+        MigrationManager.announceNewKeyspace(KSMetaData.fromThrift(ksd));
     }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/438acfc8/src/java/org/apache/cassandra/cql3/statements/DropColumnFamilyStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/DropColumnFamilyStatement.java b/src/java/org/apache/cassandra/cql3/statements/DropColumnFamilyStatement.java
index 58e10b8..e0bd75d 100644
--- a/src/java/org/apache/cassandra/cql3/statements/DropColumnFamilyStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/DropColumnFamilyStatement.java
@@ -22,8 +22,7 @@ import java.io.IOException;
 
 import org.apache.cassandra.config.ConfigurationException;
 import org.apache.cassandra.cql3.CFName;
-import org.apache.cassandra.db.migration.DropColumnFamily;
-import org.apache.cassandra.db.migration.Migration;
+import org.apache.cassandra.service.MigrationManager;
 
 public class DropColumnFamilyStatement extends SchemaAlteringStatement
 {
@@ -32,8 +31,8 @@ public class DropColumnFamilyStatement extends SchemaAlteringStatement
         super(name);
     }
 
-    public Migration getMigration() throws ConfigurationException, IOException
+    public void announceMigration() throws ConfigurationException
     {
-        return new DropColumnFamily(keyspace(), columnFamily());
+        MigrationManager.announceColumnFamilyDrop(keyspace(), columnFamily());
     }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/438acfc8/src/java/org/apache/cassandra/cql3/statements/DropIndexStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/DropIndexStatement.java b/src/java/org/apache/cassandra/cql3/statements/DropIndexStatement.java
index 5d3721a..4959e81 100644
--- a/src/java/org/apache/cassandra/cql3/statements/DropIndexStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/DropIndexStatement.java
@@ -22,8 +22,7 @@ import java.io.IOException;
 
 import org.apache.cassandra.cql3.*;
 import org.apache.cassandra.config.*;
-import org.apache.cassandra.db.migration.Migration;
-import org.apache.cassandra.db.migration.UpdateColumnFamily;
+import org.apache.cassandra.service.MigrationManager;
 import org.apache.cassandra.thrift.CfDef;
 import org.apache.cassandra.thrift.ColumnDef;
 import org.apache.cassandra.thrift.InvalidRequestException;
@@ -38,7 +37,7 @@ public class DropIndexStatement extends SchemaAlteringStatement
         index = indexName;
     }
 
-    public Migration getMigration() throws InvalidRequestException, ConfigurationException, IOException
+    public void announceMigration() throws InvalidRequestException, ConfigurationException
     {
         CfDef cfDef = null;
 
@@ -54,7 +53,7 @@ public class DropIndexStatement extends SchemaAlteringStatement
         if (cfDef == null)
             throw new InvalidRequestException("Index '" + index + "' could not be found in any of the column families of keyspace '" + keyspace() + "'");
 
-        return new UpdateColumnFamily(CFMetaData.fromThrift(cfDef));
+        MigrationManager.announceColumnFamilyUpdate(CFMetaData.fromThrift(cfDef));
     }
 
     private CfDef getUpdatedCFDef(CfDef cfDef) throws InvalidRequestException

http://git-wip-us.apache.org/repos/asf/cassandra/blob/438acfc8/src/java/org/apache/cassandra/cql3/statements/DropKeyspaceStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/DropKeyspaceStatement.java b/src/java/org/apache/cassandra/cql3/statements/DropKeyspaceStatement.java
index 1ed057d..82dea1b 100644
--- a/src/java/org/apache/cassandra/cql3/statements/DropKeyspaceStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/DropKeyspaceStatement.java
@@ -21,9 +21,8 @@ package org.apache.cassandra.cql3.statements;
 import java.io.IOException;
 
 import org.apache.cassandra.config.ConfigurationException;
-import org.apache.cassandra.db.migration.DropKeyspace;
-import org.apache.cassandra.db.migration.Migration;
 import org.apache.cassandra.service.ClientState;
+import org.apache.cassandra.service.MigrationManager;
 import org.apache.cassandra.thrift.InvalidRequestException;
 import org.apache.cassandra.thrift.SchemaDisagreementException;
 import org.apache.cassandra.thrift.ThriftValidation;
@@ -45,8 +44,8 @@ public class DropKeyspaceStatement extends SchemaAlteringStatement
         ThriftValidation.validateKeyspaceNotSystem(keyspace);
     }
 
-    public Migration getMigration() throws ConfigurationException, IOException
+    public void announceMigration() throws ConfigurationException
     {
-        return new DropKeyspace(keyspace);
+        MigrationManager.announceKeyspaceDrop(keyspace);
     }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/438acfc8/src/java/org/apache/cassandra/cql3/statements/SchemaAlteringStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/SchemaAlteringStatement.java b/src/java/org/apache/cassandra/cql3/statements/SchemaAlteringStatement.java
index 4fab436..c2d7180 100644
--- a/src/java/org/apache/cassandra/cql3/statements/SchemaAlteringStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/SchemaAlteringStatement.java
@@ -76,7 +76,7 @@ public abstract class SchemaAlteringStatement extends CFStatement implements CQL
         return new Prepared(this);
     }
 
-    public abstract Migration getMigration() throws InvalidRequestException, IOException, ConfigurationException;
+    public abstract void announceMigration() throws InvalidRequestException, ConfigurationException;
 
     public void checkAccess(ClientState state) throws InvalidRequestException
     {
@@ -96,7 +96,7 @@ public abstract class SchemaAlteringStatement extends CFStatement implements CQL
     {
         try
         {
-            applyMigrationOnStage(getMigration());
+            announceMigration();
         }
         catch (ConfigurationException e)
         {
@@ -104,12 +104,7 @@ public abstract class SchemaAlteringStatement extends CFStatement implements CQL
             ex.initCause(e);
             throw ex;
         }
-        catch (IOException e)
-        {
-            InvalidRequestException ex = new InvalidRequestException(e.toString());
-            ex.initCause(e);
-            throw ex;
-        }
+        validateSchemaIsSettled();
         return null;
     }
 
@@ -120,45 +115,6 @@ public abstract class SchemaAlteringStatement extends CFStatement implements CQL
             throw new SchemaDisagreementException();
     }
 
-    // Copypasta from o.a.c.thrift.CassandraDaemon
-    private static void applyMigrationOnStage(final Migration m) throws SchemaDisagreementException, InvalidRequestException
-    {
-        Future<?> f = StageManager.getStage(Stage.MIGRATION).submit(new Callable<Object>()
-        {
-            public Object call() throws Exception
-            {
-                m.apply();
-                return null;
-            }
-        });
-        try
-        {
-            f.get();
-        }
-        catch (InterruptedException e)
-        {
-            throw new RuntimeException(e);
-        }
-        catch (ExecutionException e)
-        {
-            // this means call() threw an exception. deal with it directly.
-            if (e.getCause() != null)
-            {
-                InvalidRequestException ex = new InvalidRequestException(e.getCause().getMessage());
-                ex.initCause(e.getCause());
-                throw ex;
-            }
-            else
-            {
-                InvalidRequestException ex = new InvalidRequestException(e.getMessage());
-                ex.initCause(e);
-                throw ex;
-            }
-        }
-
-        validateSchemaIsSettled();
-    }
-
     private static Map<String, List<String>> describeSchemaVersions()
     {
         // unreachable hosts don't count towards disagreement

http://git-wip-us.apache.org/repos/asf/cassandra/blob/438acfc8/src/java/org/apache/cassandra/db/DefsTable.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/DefsTable.java b/src/java/org/apache/cassandra/db/DefsTable.java
index 05e4519..ddab690 100644
--- a/src/java/org/apache/cassandra/db/DefsTable.java
+++ b/src/java/org/apache/cassandra/db/DefsTable.java
@@ -21,10 +21,12 @@ package org.apache.cassandra.db;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.*;
+import java.util.concurrent.Future;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.Iterables;
 import com.google.common.collect.MapDifference;
 import com.google.common.collect.Maps;
 
@@ -36,14 +38,14 @@ import org.apache.cassandra.config.*;
 import org.apache.cassandra.db.filter.QueryFilter;
 import org.apache.cassandra.db.filter.QueryPath;
 import org.apache.cassandra.db.marshal.AsciiType;
-import org.apache.cassandra.db.migration.Migration;
-import org.apache.cassandra.db.migration.MigrationHelper;
+import org.apache.cassandra.db.marshal.UTF8Type;
 import org.apache.cassandra.db.migration.avro.KsDef;
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.service.MigrationManager;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.thrift.CfDef;
 import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.FBUtilities;
 
 /**
  * SCHEMA_{KEYSPACES, COLUMNFAMILIES, COLUMNS}_CF are used to store Keyspace/ColumnFamily attributes to make schema
@@ -123,6 +125,9 @@ public class DefsTable
     // NB: must be an invalid keyspace name
     public static final ByteBuffer DEFINITION_SCHEMA_COLUMN_NAME = ByteBufferUtil.bytes("Avro/Schema");
 
+    public static final String OLD_MIGRATIONS_CF = "Migrations";
+    public static final String OLD_SCHEMA_CF = "Schema";
+
     /* dumps current keyspace definitions to storage */
     public static synchronized void dumpToStorage(Collection<KSMetaData> keyspaces) throws IOException
     {
@@ -156,6 +161,19 @@ public class DefsTable
         return keyspaces;
     }
 
+    public static ByteBuffer searchComposite(String name, boolean start)
+    {
+        assert name != null;
+        ByteBuffer nameBytes = UTF8Type.instance.decompose(name);
+        int length = nameBytes.remaining();
+        byte[] bytes = new byte[2 + length + 1];
+        bytes[0] = (byte)((length >> 8) & 0xFF);
+        bytes[1] = (byte)(length & 0xFF);
+        ByteBufferUtil.arrayCopy(nameBytes, 0, bytes, 2, length);
+        bytes[bytes.length - 1] = (byte)(start ? 0 : 1);
+        return ByteBuffer.wrap(bytes);
+    }
+
     private static Row serializedColumnFamilies(DecoratedKey ksNameKey)
     {
         ColumnFamilyStore cfsStore = SystemTable.schemaCFS(SystemTable.SCHEMA_COLUMNFAMILIES_CF);
@@ -176,8 +194,8 @@ public class DefsTable
     {
         DecoratedKey vkey = StorageService.getPartitioner().decorateKey(toUTF8Bytes(version));
         Table defs = Table.open(Table.SYSTEM_TABLE);
-        ColumnFamilyStore cfStore = defs.getColumnFamilyStore(Migration.SCHEMA_CF);
-        ColumnFamily cf = cfStore.getColumnFamily(QueryFilter.getIdentityFilter(vkey, new QueryPath(Migration.SCHEMA_CF)));
+        ColumnFamilyStore cfStore = defs.getColumnFamilyStore(OLD_SCHEMA_CF);
+        ColumnFamily cf = cfStore.getColumnFamily(QueryFilter.getIdentityFilter(vkey, new QueryPath(OLD_SCHEMA_CF)));
         IColumn avroschema = cf.getColumn(DEFINITION_SCHEMA_COLUMN_NAME);
 
         Collection<KSMetaData> keyspaces = Collections.emptyList();
@@ -202,8 +220,8 @@ public class DefsTable
             dumpToStorage(keyspaces);
 
             logger.info("Truncating deprecated system column families (migrations, schema)...");
-            MigrationHelper.dropColumnFamily(Table.SYSTEM_TABLE, Migration.MIGRATIONS_CF, -1, false);
-            MigrationHelper.dropColumnFamily(Table.SYSTEM_TABLE, Migration.SCHEMA_CF, -1, false);
+            dropColumnFamily(Table.SYSTEM_TABLE, OLD_MIGRATIONS_CF);
+            dropColumnFamily(Table.SYSTEM_TABLE, OLD_SCHEMA_CF);
         }
 
         return keyspaces;
@@ -227,25 +245,34 @@ public class DefsTable
             return;
         }
 
-        // save current state of the schema
+        mergeSchema(MigrationManager.deserializeMigrationMessage(data, version));
+    }
+
+    public static synchronized void mergeSchema(Collection<RowMutation> mutations) throws ConfigurationException, IOException
+    {
+        // current state of the schema
         Map<DecoratedKey, ColumnFamily> oldKeyspaces = SystemTable.getSchema(SystemTable.SCHEMA_KEYSPACES_CF);
         Map<DecoratedKey, ColumnFamily> oldColumnFamilies = SystemTable.getSchema(SystemTable.SCHEMA_COLUMNFAMILIES_CF);
 
-        // apply remote mutations
-        for (RowMutation mutation : MigrationManager.deserializeMigrationMessage(data, version))
+        for (RowMutation mutation : mutations)
             mutation.apply();
 
         if (!StorageService.instance.isClientMode())
-            MigrationHelper.flushSchemaCFs();
+            flushSchemaCFs();
 
         Schema.instance.updateVersionAndAnnounce();
 
-        Set<String> keyspacesToDrop = mergeKeyspaces(oldKeyspaces, SystemTable.getSchema(SystemTable.SCHEMA_KEYSPACES_CF));
-        mergeColumnFamilies(oldColumnFamilies, SystemTable.getSchema(SystemTable.SCHEMA_COLUMNFAMILIES_CF));
+        // with new data applied
+        Map<DecoratedKey, ColumnFamily> newKeyspaces = SystemTable.getSchema(SystemTable.SCHEMA_KEYSPACES_CF);
+        Map<DecoratedKey, ColumnFamily> newColumnFamilies = SystemTable.getSchema(SystemTable.SCHEMA_COLUMNFAMILIES_CF);
+
+        Set<String> keyspacesToDrop = mergeKeyspaces(oldKeyspaces, newKeyspaces);
+        mergeColumnFamilies(oldColumnFamilies, newColumnFamilies);
 
         // it is safe to drop a keyspace only when all nested ColumnFamilies where deleted
         for (String keyspaceToDrop : keyspacesToDrop)
-            MigrationHelper.dropKeyspace(keyspaceToDrop, -1, false);
+            dropKeyspace(keyspaceToDrop);
+
     }
 
     private static Set<String> mergeKeyspaces(Map<DecoratedKey, ColumnFamily> old, Map<DecoratedKey, ColumnFamily> updated)
@@ -263,10 +290,7 @@ public class DefsTable
 
             // we don't care about nested ColumnFamilies here because those are going to be processed separately
             if (!ksAttrs.isEmpty())
-            {
-                KSMetaData ksm = KSMetaData.fromSchema(new Row(entry.getKey(), entry.getValue()), Collections.<CFMetaData>emptyList());
-                MigrationHelper.addKeyspace(ksm, -1, false);
-            }
+                addKeyspace(KSMetaData.fromSchema(new Row(entry.getKey(), entry.getValue()), Collections.<CFMetaData>emptyList()));
         }
 
         /**
@@ -287,8 +311,7 @@ public class DefsTable
 
             if (prevValue.isEmpty())
             {
-                KSMetaData ksm = KSMetaData.fromSchema(new Row(entry.getKey(), newValue), Collections.<CFMetaData>emptyList());
-                MigrationHelper.addKeyspace(ksm, -1, false);
+                addKeyspace(KSMetaData.fromSchema(new Row(entry.getKey(), newValue), Collections.<CFMetaData>emptyList()));
                 continue;
             }
 
@@ -311,14 +334,9 @@ public class DefsTable
             ColumnFamily newState = valueDiff.rightValue();
 
             if (newState.isEmpty())
-            {
                 keyspacesToDrop.add(AsciiType.instance.getString(key.key));
-            }
             else
-            {
-                KSMetaData ksm = KSMetaData.fromSchema(new Row(key, newState), Collections.<CFMetaData>emptyList());
-                MigrationHelper.updateKeyspace(ksm, -1, false);
-            }
+                updateKeyspace(KSMetaData.fromSchema(new Row(key, newState), Collections.<CFMetaData>emptyList()));
         }
 
         return keyspacesToDrop;
@@ -340,7 +358,7 @@ public class DefsTable
                Map<String, CFMetaData> cfDefs = KSMetaData.deserializeColumnFamilies(new Row(entry.getKey(), cfAttrs));
 
                 for (CFMetaData cfDef : cfDefs.values())
-                    MigrationHelper.addColumnFamily(cfDef, -1, false);
+                    addColumnFamily(cfDef);
             }
         }
 
@@ -353,17 +371,18 @@ public class DefsTable
 
             ColumnFamily prevValue = valueDiff.leftValue(); // state before external modification
             ColumnFamily newValue = valueDiff.rightValue(); // updated state
+
             Row newRow = new Row(keyspace, newValue);
 
             if (prevValue.isEmpty()) // whole keyspace was deleted and now it's re-created
             {
                 for (CFMetaData cfm : KSMetaData.deserializeColumnFamilies(newRow).values())
-                    MigrationHelper.addColumnFamily(cfm, -1, false);
+                    addColumnFamily(cfm);
             }
             else if (newValue.isEmpty()) // whole keyspace is deleted
             {
                 for (CFMetaData cfm : KSMetaData.deserializeColumnFamilies(new Row(keyspace, prevValue)).values())
-                    MigrationHelper.dropColumnFamily(cfm.ksName, cfm.cfName, -1, false);
+                    dropColumnFamily(cfm.ksName, cfm.cfName);
             }
             else // has modifications in the nested ColumnFamilies, need to perform nested diff to determine what was really changed
             {
@@ -378,17 +397,145 @@ public class DefsTable
                 MapDifference<String, CFMetaData> cfDefDiff = Maps.difference(oldCfDefs, newCfDefs);
 
                 for (CFMetaData cfDef : cfDefDiff.entriesOnlyOnRight().values())
-                    MigrationHelper.addColumnFamily(cfDef, -1, false);
+                    addColumnFamily(cfDef);
 
                 for (CFMetaData cfDef : cfDefDiff.entriesOnlyOnLeft().values())
-                    MigrationHelper.dropColumnFamily(cfDef.ksName, cfDef.cfName, -1, false);
+                    dropColumnFamily(cfDef.ksName, cfDef.cfName);
 
                 for (MapDifference.ValueDifference<CFMetaData> cfDef : cfDefDiff.entriesDiffering().values())
-                    MigrationHelper.updateColumnFamily(cfDef.rightValue(), -1, false);
+                    updateColumnFamily(cfDef.rightValue());
             }
         }
     }
 
+    private static void addKeyspace(KSMetaData ksm)
+    {
+        assert Schema.instance.getKSMetaData(ksm.name) == null;
+        Schema.instance.load(ksm);
+
+        if (!StorageService.instance.isClientMode())
+            Table.open(ksm.name);
+    }
+
+    private static void addColumnFamily(CFMetaData cfm) throws IOException
+    {
+        assert Schema.instance.getCFMetaData(cfm.ksName, cfm.cfName) == null;
+        KSMetaData ksm = Schema.instance.getTableDefinition(cfm.ksName);
+        ksm = KSMetaData.cloneWith(ksm, Iterables.concat(ksm.cfMetaData().values(), Collections.singleton(cfm)));
+
+        Schema.instance.load(cfm);
+
+        // make sure it's init-ed w/ the old definitions first,
+        // since we're going to call initCf on the new one manually
+        Table.open(cfm.ksName);
+
+        Schema.instance.setTableDefinition(ksm);
+
+        if (!StorageService.instance.isClientMode())
+            Table.open(ksm.name).initCf(cfm.cfId, cfm.cfName);
+    }
+
+    private static void updateKeyspace(KSMetaData newState) throws IOException
+    {
+        KSMetaData oldKsm = Schema.instance.getKSMetaData(newState.name);
+        assert oldKsm != null;
+        KSMetaData newKsm = KSMetaData.cloneWith(oldKsm.reloadAttributes(), oldKsm.cfMetaData().values());
+
+        Schema.instance.setTableDefinition(newKsm);
+
+        try
+        {
+            if (!StorageService.instance.isClientMode())
+                Table.open(newState.name).createReplicationStrategy(newKsm);
+        }
+        catch (ConfigurationException e)
+        {
+            // It's too late to throw a configuration exception, we should have catch those previously
+            throw new RuntimeException(e);
+        }
+    }
+
+    private static void updateColumnFamily(CFMetaData newState) throws IOException
+    {
+        CFMetaData cfm = Schema.instance.getCFMetaData(newState.ksName, newState.cfName);
+        assert cfm != null;
+        cfm.reload();
+
+        if (!StorageService.instance.isClientMode())
+        {
+            Table table = Table.open(cfm.ksName);
+            table.getColumnFamilyStore(cfm.cfName).reload();
+        }
+    }
+
+    private static void dropKeyspace(String ksName) throws IOException
+    {
+        KSMetaData ksm = Schema.instance.getTableDefinition(ksName);
+        String snapshotName = Table.getTimestampedSnapshotName(ksName);
+
+        // remove all cfs from the table instance.
+        for (CFMetaData cfm : ksm.cfMetaData().values())
+        {
+            ColumnFamilyStore cfs = Table.open(ksm.name).getColumnFamilyStore(cfm.cfName);
+
+            Schema.instance.purge(cfm);
+
+            if (!StorageService.instance.isClientMode())
+            {
+                cfs.snapshot(snapshotName);
+                Table.open(ksm.name).dropCf(cfm.cfId);
+            }
+        }
+
+        // remove the table from the static instances.
+        Table.clear(ksm.name);
+        Schema.instance.clearTableDefinition(ksm);
+    }
+
+    private static void dropColumnFamily(String ksName, String cfName) throws IOException
+    {
+        KSMetaData ksm = Schema.instance.getTableDefinition(ksName);
+        assert ksm != null;
+        ColumnFamilyStore cfs = Table.open(ksName).getColumnFamilyStore(cfName);
+        assert cfs != null;
+
+        // reinitialize the table.
+        CFMetaData cfm = ksm.cfMetaData().get(cfName);
+
+        Schema.instance.purge(cfm);
+        Schema.instance.setTableDefinition(makeNewKeyspaceDefinition(ksm, cfm));
+
+        if (!StorageService.instance.isClientMode())
+        {
+            cfs.snapshot(Table.getTimestampedSnapshotName(cfs.columnFamily));
+            Table.open(ksm.name).dropCf(cfm.cfId);
+        }
+    }
+
+    private static KSMetaData makeNewKeyspaceDefinition(KSMetaData ksm, CFMetaData toExclude)
+    {
+        // clone ksm but do not include the new def
+        List<CFMetaData> newCfs = new ArrayList<CFMetaData>(ksm.cfMetaData().values());
+        newCfs.remove(toExclude);
+        assert newCfs.size() == ksm.cfMetaData().size() - 1;
+        return KSMetaData.cloneWith(ksm, newCfs);
+    }
+
+    private static void flushSchemaCFs()
+    {
+        flushSchemaCF(SystemTable.SCHEMA_KEYSPACES_CF);
+        flushSchemaCF(SystemTable.SCHEMA_COLUMNFAMILIES_CF);
+        flushSchemaCF(SystemTable.SCHEMA_COLUMNS_CF);
+    }
+
+    private static void flushSchemaCF(String cfName)
+    {
+        Future<?> flush = SystemTable.schemaCFS(cfName).forceFlush();
+
+        if (flush != null)
+            FBUtilities.waitOnFuture(flush);
+    }
+
     private static ByteBuffer toUTF8Bytes(UUID version)
     {
         return ByteBufferUtil.bytes(version.toString());

http://git-wip-us.apache.org/repos/asf/cassandra/blob/438acfc8/src/java/org/apache/cassandra/db/Directories.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/Directories.java b/src/java/org/apache/cassandra/db/Directories.java
index 2afefd2..7f383ff 100644
--- a/src/java/org/apache/cassandra/db/Directories.java
+++ b/src/java/org/apache/cassandra/db/Directories.java
@@ -154,7 +154,7 @@ public class Directories
                 maxLocation = dir;
             }
         }
-        logger.debug("expected data files size is {}; largest free partition has {} bytes free", estimatedSize, maxFreeDisk);
+        logger.debug(String.format("expected data files size is %d; largest free partition (%s) has %d bytes free", estimatedSize, maxLocation, maxFreeDisk));
 
         // Load factor of 0.9 we do not want to use the entire disk that is too risky.
         maxFreeDisk = (long)(0.9 * maxFreeDisk);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/438acfc8/src/java/org/apache/cassandra/db/SystemTable.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/SystemTable.java b/src/java/org/apache/cassandra/db/SystemTable.java
index 6f2b9c8..277e087 100644
--- a/src/java/org/apache/cassandra/db/SystemTable.java
+++ b/src/java/org/apache/cassandra/db/SystemTable.java
@@ -37,7 +37,6 @@ import org.apache.cassandra.db.filter.QueryFilter;
 import org.apache.cassandra.db.filter.QueryPath;
 import org.apache.cassandra.db.marshal.AsciiType;
 import org.apache.cassandra.db.marshal.BytesType;
-import org.apache.cassandra.db.migration.MigrationHelper;
 import org.apache.cassandra.dht.IPartitioner;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
@@ -610,8 +609,8 @@ public class SystemTable
         ColumnFamilyStore schemaCFS = SystemTable.schemaCFS(SCHEMA_COLUMNFAMILIES_CF);
         ColumnFamily result = schemaCFS.getColumnFamily(key,
                                                         new QueryPath(SCHEMA_COLUMNFAMILIES_CF),
-                                                        MigrationHelper.searchComposite(cfName, true),
-                                                        MigrationHelper.searchComposite(cfName, false),
+                                                        DefsTable.searchComposite(cfName, true),
+                                                        DefsTable.searchComposite(cfName, false),
                                                         false,
                                                         Integer.MAX_VALUE);
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/438acfc8/src/java/org/apache/cassandra/db/migration/AddColumnFamily.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/migration/AddColumnFamily.java b/src/java/org/apache/cassandra/db/migration/AddColumnFamily.java
deleted file mode 100644
index c54e4ab..0000000
--- a/src/java/org/apache/cassandra/db/migration/AddColumnFamily.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * 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
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * 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.migration;
-
-import java.io.IOException;
-import java.util.Collection;
-
-import org.apache.cassandra.config.CFMetaData;
-import org.apache.cassandra.config.ConfigurationException;
-import org.apache.cassandra.config.KSMetaData;
-import org.apache.cassandra.config.Schema;
-import org.apache.cassandra.db.RowMutation;
-
-public class  AddColumnFamily extends Migration
-{
-    private final CFMetaData cfm;
-
-    public AddColumnFamily(CFMetaData cfm) throws ConfigurationException
-    {
-        super(System.nanoTime());
-
-        KSMetaData ksm = Schema.instance.getTableDefinition(cfm.ksName);
-
-        if (ksm == null)
-            throw new ConfigurationException(String.format("Can't add ColumnFamily '%s' to Keyspace '%s': Keyspace does not exist.", cfm.cfName, cfm.ksName));
-        else if (ksm.cfMetaData().containsKey(cfm.cfName))
-            throw new ConfigurationException(String.format("Can't add ColumnFamily '%s' to Keyspace '%s': Already exists.", cfm.cfName, cfm.ksName));
-        else if (!Migration.isLegalName(cfm.cfName))
-            throw new ConfigurationException("Can't add ColumnFamily '%s' to Keyspace '%s': Invalid ColumnFamily name.");
-
-        this.cfm = cfm;
-    }
-
-    protected RowMutation applyImpl() throws ConfigurationException, IOException
-    {
-        return MigrationHelper.addColumnFamily(cfm, timestamp, true);
-    }
-
-    @Override
-    public String toString()
-    {
-        return "Add column family: " + cfm.toString();
-    }
-}

http://git-wip-us.apache.org/repos/asf/cassandra/blob/438acfc8/src/java/org/apache/cassandra/db/migration/AddKeyspace.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/migration/AddKeyspace.java b/src/java/org/apache/cassandra/db/migration/AddKeyspace.java
deleted file mode 100644
index 36c4de9..0000000
--- a/src/java/org/apache/cassandra/db/migration/AddKeyspace.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * 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
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * 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.migration;
-
-import java.io.IOException;
-import java.util.Collection;
-
-import org.apache.cassandra.config.CFMetaData;
-import org.apache.cassandra.config.ConfigurationException;
-import org.apache.cassandra.config.KSMetaData;
-import org.apache.cassandra.config.Schema;
-import org.apache.cassandra.db.RowMutation;
-
-public class AddKeyspace extends Migration
-{
-    private final KSMetaData ksm;
-
-    public AddKeyspace(KSMetaData ksm) throws ConfigurationException
-    {
-        super(System.nanoTime());
-
-        if (Schema.instance.getTableDefinition(ksm.name) != null)
-            throw new ConfigurationException(String.format("Can't add Keyspace '%s': Already exists.", ksm.name));
-        else if (!Migration.isLegalName(ksm.name))
-            throw new ConfigurationException(String.format("Can't add Keyspace '%s': Invalid name.", ksm.name));
-        for (CFMetaData cfm : ksm.cfMetaData().values())
-            if (!Migration.isLegalName(cfm.cfName))
-                throw new ConfigurationException(String.format("Can't add Keyspace '%s': Invalid ColumnFamily name '%s'.", ksm.name, cfm.cfName));
-
-        this.ksm = ksm;
-    }
-
-    protected RowMutation applyImpl() throws ConfigurationException, IOException
-    {
-        return MigrationHelper.addKeyspace(ksm, timestamp, true);
-    }
-
-    @Override
-    public String toString()
-    {
-        return "Add keyspace: " + ksm.toString();
-    }
-}

http://git-wip-us.apache.org/repos/asf/cassandra/blob/438acfc8/src/java/org/apache/cassandra/db/migration/DropColumnFamily.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/migration/DropColumnFamily.java b/src/java/org/apache/cassandra/db/migration/DropColumnFamily.java
deleted file mode 100644
index 0628824..0000000
--- a/src/java/org/apache/cassandra/db/migration/DropColumnFamily.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * 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
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * 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.migration;
-
-import java.io.IOException;
-import java.util.Collection;
-
-import org.apache.cassandra.config.ConfigurationException;
-import org.apache.cassandra.config.KSMetaData;
-import org.apache.cassandra.config.Schema;
-import org.apache.cassandra.db.RowMutation;
-
-public class DropColumnFamily extends Migration
-{
-    private final String ksName;
-    private final String cfName;
-
-    public DropColumnFamily(String ksName, String cfName) throws ConfigurationException
-    {
-        super(System.nanoTime());
-
-        KSMetaData ksm = Schema.instance.getTableDefinition(ksName);
-        if (ksm == null)
-            throw new ConfigurationException("Can't drop ColumnFamily: No such keyspace '" + ksName + "'.");
-        else if (!ksm.cfMetaData().containsKey(cfName))
-            throw new ConfigurationException(String.format("Can't drop ColumnFamily (ks=%s, cf=%s) : Not defined in that keyspace.", ksName, cfName));
-
-        this.ksName = ksName;
-        this.cfName = cfName;
-    }
-
-    protected RowMutation applyImpl() throws ConfigurationException, IOException
-    {
-        return MigrationHelper.dropColumnFamily(ksName, cfName, timestamp, true);
-    }
-
-    @Override
-    public String toString()
-    {
-        return String.format("Drop column family: %s.%s", ksName, cfName);
-    }
-}

http://git-wip-us.apache.org/repos/asf/cassandra/blob/438acfc8/src/java/org/apache/cassandra/db/migration/DropKeyspace.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/migration/DropKeyspace.java b/src/java/org/apache/cassandra/db/migration/DropKeyspace.java
deleted file mode 100644
index d6e46a4..0000000
--- a/src/java/org/apache/cassandra/db/migration/DropKeyspace.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * 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
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * 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.migration;
-
-import java.io.IOException;
-import java.util.Collection;
-
-import org.apache.cassandra.config.ConfigurationException;
-import org.apache.cassandra.config.KSMetaData;
-import org.apache.cassandra.config.Schema;
-import org.apache.cassandra.db.RowMutation;
-
-public class DropKeyspace extends Migration
-{
-    private final String name;
-
-    public DropKeyspace(String name) throws ConfigurationException
-    {
-        super(System.nanoTime());
-
-        KSMetaData ksm = Schema.instance.getTableDefinition(name);
-        if (ksm == null)
-            throw new ConfigurationException("Can't drop keyspace '" + name + "' because it does not exist.");
-
-        this.name = name;
-    }
-
-    protected RowMutation applyImpl() throws ConfigurationException, IOException
-    {
-        return MigrationHelper.dropKeyspace(name, timestamp, true);
-    }
-
-    @Override
-    public String toString()
-    {
-        return "Drop keyspace: " + name;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cassandra/blob/438acfc8/src/java/org/apache/cassandra/db/migration/Migration.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/migration/Migration.java b/src/java/org/apache/cassandra/db/migration/Migration.java
deleted file mode 100644
index 9b239bb..0000000
--- a/src/java/org/apache/cassandra/db/migration/Migration.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/**
- * 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
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * 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.migration;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.UUID;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.cassandra.config.ConfigurationException;
-import org.apache.cassandra.config.Schema;
-import org.apache.cassandra.db.*;
-import org.apache.cassandra.db.filter.QueryFilter;
-import org.apache.cassandra.db.filter.QueryPath;
-import org.apache.cassandra.service.MigrationManager;
-import org.apache.cassandra.service.StorageService;
-import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.utils.UUIDGen;
-
-/**
- * A migration represents a single metadata mutation (cf dropped, added, etc.).
- *
- * There are two parts to a migration (think of it as a schema update):
- * 1. data is written to the schema cf (SCHEMA_KEYSPACES_CF).
- * 2. updated models are applied to the cassandra instance.
- *
- * Since all steps are not committed atomically, care should be taken to ensure that a node/cluster is reasonably
- * quiescent with regard to the Keyspace or ColumnFamily whose schema is being modified.
- */
-public abstract class Migration
-{
-    protected static final Logger logger = LoggerFactory.getLogger(Migration.class);
-
-    public static final String NAME_VALIDATOR_REGEX = "\\w+";
-    public static final String MIGRATIONS_CF = "Migrations";
-    public static final String SCHEMA_CF = "Schema";
-    public static final ByteBuffer LAST_MIGRATION_KEY = ByteBufferUtil.bytes("Last Migration");
-
-    protected final long timestamp;
-
-    Migration(long modificationTimestamp)
-    {
-        timestamp = modificationTimestamp;
-    }
-
-    public final void apply() throws ConfigurationException, IOException
-    {
-        RowMutation mutation = applyImpl();
-        assert mutation != null;
-
-        if (!StorageService.instance.isClientMode())
-            MigrationHelper.flushSchemaCFs();
-
-        Schema.instance.updateVersion();
-        announce(Collections.singletonList(mutation));
-    }
-
-    /**
-     * Class specific apply implementation where schema migration logic should be put
-     *
-     * @return mutation to update native schema
-     *
-     * @throws IOException on any I/O related error.
-     * @throws ConfigurationException if there is object misconfiguration.
-     */
-    protected abstract RowMutation applyImpl() throws ConfigurationException, IOException;
-
-    /**
-     * Send schema update (in form of row mutations) to alive nodes in the cluster.
-     *
-     * @param mutations to distribute in the cluster
-     */
-    private void announce(Collection<RowMutation> mutations)
-    {
-        assert !StorageService.instance.isClientMode();
-        MigrationManager.announce(mutations);
-        passiveAnnounce(); // keeps gossip in sync w/ what we just told everyone
-    }
-
-    /** Announce new schema version over Gossip */
-    public final void passiveAnnounce()
-    {
-        MigrationManager.passiveAnnounce(Schema.instance.getVersion());
-    }
-
-    /**
-     * Used only in case node has old style migration schema (newly updated)
-     * @return the UUID identifying version of the last applied migration
-     */
-    @Deprecated
-    public static UUID getLastMigrationId()
-    {
-        DecoratedKey<?> dkey = StorageService.getPartitioner().decorateKey(LAST_MIGRATION_KEY);
-        Table defs = Table.open(Table.SYSTEM_TABLE);
-        ColumnFamilyStore cfStore = defs.getColumnFamilyStore(SCHEMA_CF);
-        QueryFilter filter = QueryFilter.getNamesFilter(dkey, new QueryPath(SCHEMA_CF), LAST_MIGRATION_KEY);
-        ColumnFamily cf = cfStore.getColumnFamily(filter);
-        if (cf == null || cf.getColumnNames().size() == 0)
-            return null;
-        else
-            return UUIDGen.getUUID(cf.getColumn(LAST_MIGRATION_KEY).value());
-    }
-
-    public static boolean isLegalName(String s)
-    {
-        return s.matches(Migration.NAME_VALIDATOR_REGEX);
-    }
-}