You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2011/03/28 21:07:04 UTC
svn commit: r1086344 - in /cassandra/trunk: ./ contrib/
interface/thrift/gen-java/org/apache/cassandra/thrift/
src/java/org/apache/cassandra/db/ src/java/org/apache/cassandra/db/migration/
Author: jbellis
Date: Mon Mar 28 19:07:03 2011
New Revision: 1086344
URL: http://svn.apache.org/viewvc?rev=1086344&view=rev
Log:
merge from 0.7
Modified:
cassandra/trunk/ (props changed)
cassandra/trunk/contrib/ (props changed)
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java (props changed)
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java (props changed)
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java (props changed)
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java (props changed)
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java (props changed)
cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.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
cassandra/trunk/src/java/org/apache/cassandra/db/migration/Migration.java
cassandra/trunk/src/java/org/apache/cassandra/db/migration/UpdateColumnFamily.java
Propchange: cassandra/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Mar 28 19:07:03 2011
@@ -1,5 +1,5 @@
/cassandra/branches/cassandra-0.6:922689-1052356,1052358-1053452,1053454,1053456-1081914,1083000
-/cassandra/branches/cassandra-0.7:1026516-1084291,1084660,1085372,1085538
+/cassandra/branches/cassandra-0.7:1026516-1084291,1084660,1085372,1085538,1086343
/cassandra/branches/cassandra-0.7.0:1053690-1055654
/cassandra/tags/cassandra-0.7.0-rc3:1051699-1053689
/incubator/cassandra/branches/cassandra-0.3:774578-796573
Propchange: cassandra/trunk/contrib/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Mar 28 19:07:03 2011
@@ -1,5 +1,5 @@
/cassandra/branches/cassandra-0.6/contrib:922689-1052356,1052358-1053452,1053454,1053456-1068009
-/cassandra/branches/cassandra-0.7/contrib:1026516-1084291,1084660,1085372,1085538
+/cassandra/branches/cassandra-0.7/contrib:1026516-1084291,1084660,1085372,1085538,1086343
/cassandra/branches/cassandra-0.7.0/contrib:1053690-1055654
/cassandra/tags/cassandra-0.7.0-rc3/contrib:1051699-1053689
/incubator/cassandra/branches/cassandra-0.3/contrib:774578-796573
Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Mar 28 19:07:03 2011
@@ -1,5 +1,5 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:922689-1052356,1052358-1053452,1053454,1053456-1081914,1083000
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1026516-1084291,1084660,1085372,1085538
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1026516-1084291,1084660,1085372,1085538,1086343
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1053690-1055654
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1051699-1053689
/incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/Cassandra.java:774578-796573
Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Mar 28 19:07:03 2011
@@ -1,5 +1,5 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:922689-1052356,1052358-1053452,1053454,1053456-1081914,1083000
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1026516-1084291,1084660,1085372,1085538
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1026516-1084291,1084660,1085372,1085538,1086343
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1053690-1055654
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1051699-1053689
/incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/column_t.java:774578-792198
Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Mar 28 19:07:03 2011
@@ -1,5 +1,5 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:922689-1052356,1052358-1053452,1053454,1053456-1081914,1083000
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1026516-1084291,1084660,1085372,1085538
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1026516-1084291,1084660,1085372,1085538,1086343
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1053690-1055654
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1051699-1053689
/incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/InvalidRequestException.java:774578-796573
Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Mar 28 19:07:03 2011
@@ -1,5 +1,5 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:922689-1052356,1052358-1053452,1053454,1053456-1081914,1083000
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1026516-1084291,1084660,1085372,1085538
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1026516-1084291,1084660,1085372,1085538,1086343
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1053690-1055654
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1051699-1053689
/incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/NotFoundException.java:774578-796573
Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Mar 28 19:07:03 2011
@@ -1,5 +1,5 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:922689-1052356,1052358-1053452,1053454,1053456-1081914,1083000
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1026516-1084291,1084660,1085372,1085538
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1026516-1084291,1084660,1085372,1085538,1086343
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1053690-1055654
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1051699-1053689
/incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/superColumn_t.java:774578-792198
Modified: cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java?rev=1086344&r1=1086343&r2=1086344&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java Mon Mar 28 19:07:03 2011
@@ -25,6 +25,8 @@ import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
import java.util.regex.Pattern;
import javax.management.MBeanServer;
import javax.management.ObjectName;
@@ -138,6 +140,9 @@ public class ColumnFamilyStore implement
private volatile DefaultInteger rowCacheSaveInSeconds;
private volatile DefaultInteger keyCacheSaveInSeconds;
+ /** Lock to allow migrations to block all flushing, so we can be sure not to write orphaned data files */
+ public final Lock flushLock = new ReentrantLock();
+
public static enum CacheType
{
KEY_CACHE_TYPE("KeyCache"),
@@ -591,19 +596,9 @@ public class ColumnFamilyStore implement
}
assert getMemtableThreadSafe() == oldMemtable;
- boolean isDropped = isIndex()
- ? DatabaseDescriptor.getCFMetaData(table.name, getParentColumnfamily()) == null
- : DatabaseDescriptor.getCFMetaData(metadata.cfId) == null;
- if (isDropped)
- {
- logger.debug("column family was dropped; no point in flushing");
- return null;
- }
-
- // Table.flusherLock ensures that we schedule discardCompletedSegments calls in the same order as their
+ // global synchronization ensures that we schedule discardCompletedSegments calls in the same order as their
// contexts (commitlog position) were read, even though the flush executor is multithreaded.
- Table.flusherLock.lock();
- try
+ synchronized (ColumnFamilyStore.class)
{
final CommitLogSegment.CommitLogContext ctx = writeCommitLog ? CommitLog.instance.getContext() : null;
@@ -646,10 +641,13 @@ public class ColumnFamilyStore implement
}
});
}
- finally
- {
- Table.flusherLock.unlock();
- }
+ }
+
+ public boolean isDropped()
+ {
+ return isIndex()
+ ? DatabaseDescriptor.getCFMetaData(table.name, getParentColumnfamily()) == null
+ : DatabaseDescriptor.getCFMetaData(metadata.cfId) == null;
}
void switchBinaryMemtable(DecoratedKey key, ByteBuffer buffer)
Modified: cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java?rev=1086344&r1=1086343&r2=1086344&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java Mon Mar 28 19:07:03 2011
@@ -38,7 +38,6 @@ import com.google.common.collect.Peeking
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.apache.cassandra.config.ConfigurationException;
import org.apache.cassandra.db.columniterator.IColumnIterator;
import org.apache.cassandra.db.columniterator.SimpleAbstractColumnIterator;
import org.apache.cassandra.db.filter.AbstractColumnIterator;
@@ -180,7 +179,16 @@ public class Memtable implements Compara
public void runMayThrow() throws IOException
{
waitForWriters();
- cfs.replaceFlushed(Memtable.this, writeSortedContents());
+ cfs.flushLock.lock();
+ SSTableReader sstable = writeSortedContents();
+ try
+ {
+ cfs.replaceFlushed(Memtable.this, sstable);
+ }
+ finally
+ {
+ cfs.flushLock.unlock();
+ }
latch.countDown();
}
});
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=1086344&r1=1086343&r2=1086344&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/Table.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/Table.java Mon Mar 28 19:07:03 2011
@@ -25,7 +25,6 @@ import java.nio.ByteBuffer;
import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
import com.google.common.base.Function;
import com.google.common.collect.Iterables;
@@ -58,13 +57,6 @@ public class Table
private static final Logger logger = LoggerFactory.getLogger(Table.class);
private static final String SNAPSHOT_SUBDIR_NAME = "snapshots";
- /**
- * Table.maybeSwitchMemtable aquires this lock when flushing.
- * This is a global lock mainly for the benfits of Migration, so that it
- * can block all flushing.
- */
- static final Lock flusherLock = new ReentrantLock();
-
// It is possible to call Table.open without a running daemon, so it makes sense to ensure
// proper directories here as well as in CassandraDaemon.
static
@@ -117,11 +109,6 @@ public class Table
}
return tableInstance;
}
-
- public static Lock getFlushLock()
- {
- return flusherLock;
- }
public static Table clear(String table) throws IOException
{
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=1086344&r1=1086343&r2=1086344&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 Mon Mar 28 19:07:03 2011
@@ -9,6 +9,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.Table;
import org.apache.cassandra.utils.FBUtilities;
import org.apache.cassandra.utils.UUIDGen;
@@ -66,35 +67,31 @@ public class DropColumnFamily extends Mi
return new KSMetaData(ksm.name, ksm.strategyClass, ksm.strategyOptions, ksm.replicationFactor, newCfs.toArray(new CFMetaData[newCfs.size()]));
}
- @Override
- public void beforeApplyModels()
+ public void applyModels() throws IOException
{
- if (clientMode)
- return;
ColumnFamilyStore cfs = Table.open(tableName).getColumnFamilyStore(cfName);
- cfs.snapshot(Table.getTimestampedSnapshotName(null));
- }
- public void applyModels() throws IOException
- {
- acquireLocks();
- try
+ // 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)
{
- // 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)
+ CompactionManager.instance.getCompactionLock().lock();
+ cfs.flushLock.lock();
+ try
{
+ cfs.snapshot(Table.getTimestampedSnapshotName(null));
Table.open(ksm.name).dropCf(cfm.cfId);
}
- }
- finally
- {
- releaseLocks();
+ finally
+ {
+ cfs.flushLock.unlock();
+ CompactionManager.instance.getCompactionLock().unlock();
+ }
}
}
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=1086344&r1=1086343&r2=1086344&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 Mon Mar 28 19:07:03 2011
@@ -24,6 +24,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.Table;
import org.apache.cassandra.utils.FBUtilities;
@@ -46,34 +48,37 @@ public class DropKeyspace extends Migrat
rm = makeDefinitionMutation(null, ksm, newVersion);
}
- @Override
- public void beforeApplyModels()
- {
- if (!clientMode)
- Table.open(name).snapshot(null);
- }
-
public void applyModels() throws IOException
{
- acquireLocks();
+ String snapshotName = Table.getTimestampedSnapshotName(null);
+ CompactionManager.instance.getCompactionLock().lock();
try
{
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())
{
+ ColumnFamilyStore cfs = Table.open(ksm.name).getColumnFamilyStore(cfm.cfName);
CFMetaData.purge(cfm);
if (!clientMode)
{
- table.dropCf(cfm.cfId);
+ cfs.flushLock.lock();
+ try
+ {
+ cfs.snapshot(snapshotName);
+ Table.open(ksm.name).dropCf(cfm.cfId);
+ }
+ finally
+ {
+ cfs.flushLock.unlock();
+ }
}
}
+ // remove the table from the static instances.
+ Table table = Table.clear(ksm.name);
+ assert table != null;
// reset defs.
DatabaseDescriptor.clearTableDefinition(ksm, newVersion);
@@ -85,7 +90,7 @@ public class DropKeyspace extends Migrat
}
finally
{
- releaseLocks();
+ CompactionManager.instance.getCompactionLock().unlock();
}
}
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=1086344&r1=1086343&r2=1086344&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 Mon Mar 28 19:07:03 2011
@@ -93,22 +93,6 @@ public abstract class Migration
this.lastVersion = lastVersion;
}
- // 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() {}
-
/** apply changes */
public final void apply() throws IOException, ConfigurationException
{
@@ -120,8 +104,6 @@ public abstract class Migration
if (!clientMode)
rm.apply();
- beforeApplyModels();
-
// write migration.
if (!clientMode)
{
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=1086344&r1=1086343&r2=1086344&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 Mon Mar 28 19:07:03 2011
@@ -63,14 +63,6 @@ public class UpdateColumnFamily extends
newKsMeta.cfMetaData().get(cf_def.name.toString()).apply(cf_def);
rm = Migration.makeDefinitionMutation(newKsMeta, null, newVersion);
}
-
- public void beforeApplyModels()
- {
- if (clientMode)
- return;
- ColumnFamilyStore cfs = Table.open(metadata.ksName).getColumnFamilyStore(metadata.cfName);
- cfs.snapshot(Table.getTimestampedSnapshotName(null));
- }
void applyModels() throws IOException
{