Author: gdusbabek
Date: Wed Oct 20 12:58:56 2010
New Revision: 1025542

URL: http://svn.apache.org/viewvc?rev=1025542&view=rev
Log:
fix drop race with compaction. patch by gdusbabek, reviewed by jbellis. 
CASSANDRA-1631

Modified:
    cassandra/trunk/src/java/org/apache/cassandra/db/CompactionManager.java
    cassandra/trunk/src/java/org/apache/cassandra/db/Table.java
    
cassandra/trunk/src/java/org/apache/cassandra/db/migration/DropColumnFamily.java
    cassandra/trunk/src/java/org/apache/cassandra/db/migration/DropKeyspace.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=1025542&r1=1025541&r2=1025542&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/CompactionManager.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/CompactionManager.java Wed 
Oct 20 12:58:56 2010
@@ -19,6 +19,7 @@
 package org.apache.cassandra.db;
 
 import java.io.File;
+import java.io.IOError;
 import java.io.IOException;
 import java.lang.management.ManagementFactory;
 import java.net.InetAddress;
@@ -30,6 +31,7 @@ import java.util.concurrent.Future;
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
 
+import org.apache.cassandra.config.CFMetaData;
 import org.apache.commons.collections.PredicateUtils;
 import org.apache.commons.collections.iterators.CollatingIterator;
 import org.apache.commons.collections.iterators.FilterIterator;
@@ -497,6 +499,22 @@ public class CompactionManager implement
         return tablePairs;
     }
 
+    public Future submitDrop(final ColumnFamilyStore... stores)
+    {
+        Callable callable = new Callable()
+        {
+            public Object call() throws IOException
+            {
+                for (ColumnFamilyStore cfs : stores)
+                {
+                    cfs.table.dropCf(cfs.metadata.cfId);
+                }
+                return null;
+            }
+        };
+        return executor.submit(callable);
+    }
+    
     public Future submitIndexBuild(final ColumnFamilyStore cfs, final 
Table.IndexBuilder builder)
     {
         Runnable runnable = new Runnable()

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/Table.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java?rev=1025542&r1=1025541&r2=1025542&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/Table.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/Table.java Wed Oct 20 
12:58:56 2010
@@ -273,6 +273,7 @@ public class Table
         flushTask = 
StorageService.scheduledTasks.scheduleWithFixedDelay(runnable, minCheckMs, 
minCheckMs, TimeUnit.MILLISECONDS);
     }
     
+    // best invoked on the compaction mananger.
     public void dropCf(Integer cfId) throws IOException
     {
         assert columnFamilyStores.containsKey(cfId);

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=1025542&r1=1025541&r2=1025542&view=diff
==============================================================================
--- 
cassandra/trunk/src/java/org/apache/cassandra/db/migration/DropColumnFamily.java
 (original)
+++ 
cassandra/trunk/src/java/org/apache/cassandra/db/migration/DropColumnFamily.java
 Wed Oct 20 12:58:56 2010
@@ -5,15 +5,18 @@ 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.db.commitlog.CommitLog;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.UUIDGen;
 
+import java.io.IOError;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.ExecutionException;
 
 /**
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -85,13 +88,30 @@ public class DropColumnFamily extends Mi
         // reinitialize the table.
         KSMetaData existing = DatabaseDescriptor.getTableDefinition(tableName);
         CFMetaData cfm = existing.cfMetaData().get(cfName);
+        ColumnFamilyStore cfs = 
Table.open(cfm.tableName).getColumnFamilyStore(cfName);
         KSMetaData ksm = makeNewKeyspaceDefinition(existing);
         CFMetaData.purge(cfm);
         DatabaseDescriptor.setTableDefinition(ksm, newVersion);
         
         if (!clientMode)
         {
-            Table.open(ksm.name).dropCf(cfm.cfId);
+            try
+            {
+                CompactionManager.instance.submitDrop(cfs).get();
+            }
+            catch (InterruptedException ex)
+            {
+                throw new IOException(ex);
+            }
+            catch (ExecutionException ex)
+            {
+                // if the compaction manager catches IOException, it wraps it 
in an IOError and rethrows, which should
+                // get caught be the executor and rethrown as an 
ExecutionException.
+                if (ex.getCause() instanceof IOException)
+                    throw (IOException)ex.getCause();
+                else
+                    throw new IOException(ex);
+            }
         }
     }
     

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=1025542&r1=1025541&r2=1025542&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 
Wed Oct 20 12:58:56 2010
@@ -22,6 +22,8 @@ import org.apache.cassandra.config.CFMet
 import org.apache.cassandra.config.ConfigurationException;
 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.HintedHandOffManager;
 import org.apache.cassandra.db.SystemTable;
 import org.apache.cassandra.db.Table;
@@ -29,7 +31,9 @@ import org.apache.cassandra.db.commitlog
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.UUIDGen;
 
+import java.io.IOError;
 import java.io.IOException;
+import java.util.concurrent.ExecutionException;
 
 public class DropKeyspace extends Migration
 {
@@ -68,11 +72,26 @@ public class DropKeyspace extends Migrat
         
         // remove all cfs from the table instance.
         for (CFMetaData cfm : ksm.cfMetaData().values())
-        {
             CFMetaData.purge(cfm);
-            if (!clientMode)
+        
+        if (!clientMode)
+        {
+            try
+            {
+                
CompactionManager.instance.submitDrop(table.getColumnFamilyStores().toArray(new 
ColumnFamilyStore[0])).get();
+            }
+            catch (InterruptedException ex)
+            {
+                throw new IOException(ex);
+            }
+            catch (ExecutionException ex)
             {
-                table.dropCf(cfm.cfId);
+                // if the compaction manager catches IOException, it wraps it 
in an IOError and rethrows, which should
+                // get caught be the executor and rethrown as an 
ExecutionException.
+                if (ex.getCause() instanceof IOException)
+                    throw (IOException)ex.getCause();
+                else
+                    throw new IOException(ex);
             }
         }
                         


Reply via email to