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