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/11/19 16:27:17 UTC

svn commit: r1036889 - in /cassandra/trunk/src/java/org/apache/cassandra/db: CompactionManager.java migration/DropColumnFamily.java migration/DropKeyspace.java migration/Migration.java migration/UpdateColumnFamily.java

Author: gdusbabek
Date: Fri Nov 19 15:27:16 2010
New Revision: 1036889

URL: http://svn.apache.org/viewvc?rev=1036889&view=rev
Log:
migration uses locks. patch by gdusbabek, reviewe by jbellis. CASSANDRA-1715

Modified:
    cassandra/trunk/src/java/org/apache/cassandra/db/CompactionManager.java
    cassandra/trunk/src/java/org/apache/cassandra/db/migration/DropColumnFamily.java
    cassandra/trunk/src/java/org/apache/cassandra/db/migration/DropKeyspace.java
    cassandra/trunk/src/java/org/apache/cassandra/db/migration/Migration.java
    cassandra/trunk/src/java/org/apache/cassandra/db/migration/UpdateColumnFamily.java

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/CompactionManager.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/CompactionManager.java?rev=1036889&r1=1036888&r2=1036889&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/CompactionManager.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/CompactionManager.java Fri Nov 19 15:27:16 2010
@@ -31,6 +31,7 @@ import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.locks.ReentrantLock;
+import java.util.concurrent.locks.Lock;
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
 
@@ -80,14 +81,9 @@ public class CompactionManager implement
     private CompactionExecutor executor = new CompactionExecutor();
     private Map<ColumnFamilyStore, Integer> estimatedCompactions = new NonBlockingHashMap<ColumnFamilyStore, Integer>();
     
-    public void lockCompactions()
+    public Lock getCompactionLock()
     {
-        compactionLock.lock();
-    }
-    
-    public void unlockCompactions()
-    {
-        compactionLock.unlock();
+        return compactionLock;
     }
 
     /**

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=1036889&r1=1036888&r2=1036889&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 Fri Nov 19 15:27:16 2010
@@ -82,16 +82,24 @@ public class DropColumnFamily extends Mi
     @Override
     public void applyModels() throws IOException
     {
-        // reinitialize the table.
-        KSMetaData existing = DatabaseDescriptor.getTableDefinition(tableName);
-        CFMetaData cfm = existing.cfMetaData().get(cfName);
-        KSMetaData ksm = makeNewKeyspaceDefinition(existing);
-        CFMetaData.purge(cfm);
-        DatabaseDescriptor.setTableDefinition(ksm, newVersion);
-        
-        if (!clientMode)
+        acquireLocks();
+        try
         {
-            Table.open(ksm.name).dropCf(cfm.cfId);
+            // reinitialize the table.
+            KSMetaData existing = DatabaseDescriptor.getTableDefinition(tableName);
+            CFMetaData cfm = existing.cfMetaData().get(cfName);
+            KSMetaData ksm = makeNewKeyspaceDefinition(existing);
+            CFMetaData.purge(cfm);
+            DatabaseDescriptor.setTableDefinition(ksm, newVersion);
+            
+            if (!clientMode)
+            {
+                Table.open(ksm.name).dropCf(cfm.cfId);
+            }
+        }
+        finally
+        {
+            releaseLocks();
         }
     }
     

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/migration/DropKeyspace.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/migration/DropKeyspace.java?rev=1036889&r1=1036888&r2=1036889&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/migration/DropKeyspace.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/migration/DropKeyspace.java Fri Nov 19 15:27:16 2010
@@ -60,29 +60,37 @@ public class DropKeyspace extends Migrat
     @Override
     public void applyModels() throws IOException
     {
-        KSMetaData ksm = DatabaseDescriptor.getTableDefinition(name);
-        // remove the table from the static instances.
-        Table table = Table.clear(ksm.name);
-        if (table == null)
-            throw new IOException("Table is not active. " + ksm.name);
-        
-        // remove all cfs from the table instance.
-        for (CFMetaData cfm : ksm.cfMetaData().values())
+        acquireLocks();
+        try
         {
-            CFMetaData.purge(cfm);
+            KSMetaData ksm = DatabaseDescriptor.getTableDefinition(name);
+            // remove the table from the static instances.
+            Table table = Table.clear(ksm.name);
+            if (table == null)
+                throw new IOException("Table is not active. " + ksm.name);
+            
+            // remove all cfs from the table instance.
+            for (CFMetaData cfm : ksm.cfMetaData().values())
+            {
+                CFMetaData.purge(cfm);
+                if (!clientMode)
+                {
+                    table.dropCf(cfm.cfId);
+                }
+            }
+                            
+            // reset defs.
+            DatabaseDescriptor.clearTableDefinition(ksm, newVersion);
+            
             if (!clientMode)
             {
-                table.dropCf(cfm.cfId);
+                // clear up any local hinted data for this keyspace.
+                HintedHandOffManager.renameHints(name, null);
             }
         }
-                        
-        // reset defs.
-        DatabaseDescriptor.clearTableDefinition(ksm, newVersion);
-        
-        if (!clientMode)
+        finally
         {
-            // clear up any local hinted data for this keyspace.
-            HintedHandOffManager.renameHints(name, null);
+            releaseLocks();
         }
     }
     

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/migration/Migration.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/migration/Migration.java?rev=1036889&r1=1036888&r2=1036889&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/migration/Migration.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/migration/Migration.java Fri Nov 19 15:27:16 2010
@@ -91,6 +91,19 @@ public abstract class Migration
         this.lastVersion = lastVersion;
         clientMode = StorageService.instance.isClientMode();
     }
+    
+    // block compactions and flushing.
+    protected final void acquireLocks()
+    {
+        CompactionManager.instance.getCompactionLock().lock();
+        Table.getFlushLock().lock();
+    }
+    
+    protected final void releaseLocks()
+    {
+        Table.getFlushLock().unlock();
+        CompactionManager.instance.getCompactionLock().unlock();
+    }
 
     /** override this to perform logic before writing the migration or applying it.  defaults to nothing. */
     public void beforeApplyModels() {}

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/migration/UpdateColumnFamily.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/migration/UpdateColumnFamily.java?rev=1036889&r1=1036888&r2=1036889&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/migration/UpdateColumnFamily.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/migration/UpdateColumnFamily.java Fri Nov 19 15:27:16 2010
@@ -12,6 +12,7 @@ import org.apache.cassandra.config.Confi
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.KSMetaData;
 import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.CompactionManager;
 import org.apache.cassandra.db.SystemTable;
 import org.apache.cassandra.db.Table;
 import org.apache.cassandra.utils.FBUtilities;
@@ -78,30 +79,38 @@ public class UpdateColumnFamily extends 
 
     void applyModels() throws IOException
     {
-        logger.debug("Updating " + oldCfm + " to " + newCfm);
-        KSMetaData newKsm = makeNewKeyspaceDefinition(DatabaseDescriptor.getTableDefinition(newCfm.tableName));
-        DatabaseDescriptor.setTableDefinition(newKsm, newVersion);
-        
-        if (!clientMode)
+        acquireLocks();
+        try
         {
-            Table table = Table.open(oldCfm.tableName);
-            ColumnFamilyStore oldCfs = table.getColumnFamilyStore(oldCfm.cfName);
-            table.reloadCf(newCfm.cfId);
-
-            // clean up obsolete index data files
-            for (Map.Entry<ByteBuffer, ColumnDefinition> entry : oldCfm.column_metadata.entrySet())
+            logger.debug("Updating " + oldCfm + " to " + newCfm);
+            KSMetaData newKsm = makeNewKeyspaceDefinition(DatabaseDescriptor.getTableDefinition(newCfm.tableName));
+            DatabaseDescriptor.setTableDefinition(newKsm, newVersion);
+            
+            if (!clientMode)
             {
-                ByteBuffer column = entry.getKey();
-                ColumnDefinition def = entry.getValue();
-                if (def.index_type != null
-                    && (!newCfm.column_metadata.containsKey(column) || newCfm.column_metadata.get(column).index_type == null))
+                Table table = Table.open(oldCfm.tableName);
+                ColumnFamilyStore oldCfs = table.getColumnFamilyStore(oldCfm.cfName);
+                table.reloadCf(newCfm.cfId);
+    
+                // clean up obsolete index data files
+                for (Map.Entry<ByteBuffer, ColumnDefinition> entry : oldCfm.column_metadata.entrySet())
                 {
-                    ColumnFamilyStore indexCfs = oldCfs.getIndexedColumnFamilyStore(column);
-                    SystemTable.setIndexRemoved(table.name, indexCfs.columnFamily);
-                    indexCfs.removeAllSSTables();
+                    ByteBuffer column = entry.getKey();
+                    ColumnDefinition def = entry.getValue();
+                    if (def.index_type != null
+                        && (!newCfm.column_metadata.containsKey(column) || newCfm.column_metadata.get(column).index_type == null))
+                    {
+                        ColumnFamilyStore indexCfs = oldCfs.getIndexedColumnFamilyStore(column);
+                        SystemTable.setIndexRemoved(table.name, indexCfs.columnFamily);
+                        indexCfs.removeAllSSTables();
+                    }
                 }
             }
         }
+        finally
+        {
+            releaseLocks();
+        }
     }
 
     public void subdeflate(org.apache.cassandra.db.migration.avro.Migration mi)