diff --git a/CHANGES.txt b/CHANGES.txt index c5af7bce9c..3a11c88726 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,7 @@ +0.8.0-? + * fix NPE compacting index CFs (CASSANDRA-2528) + * Remove checking all column families on startup for compaction candidates (CASSANDRA-2444) + 0.8.0-beta1 * remove Avro RPC support (CASSANDRA-926) * adds support for columns that act as incr/decr counters diff --git a/doc/cql/CQL.textile b/doc/cql/CQL.textile index b671481293..464224dabc 100644 --- a/doc/cql/CQL.textile +++ b/doc/cql/CQL.textile @@ -73,7 +73,7 @@ h2. UPDATE _Synopsis:_ bc. -UPDATE [USING CONSISTENCY ] +UPDATE [USING ] SET name1 = value1, name2 = value2 WHERE KEY = keyname; An @UPDATE@ is used to write one or more columns to a record in a Cassandra column family. No results are returned. diff --git a/src/java/org/apache/cassandra/db/ColumnFamily.java b/src/java/org/apache/cassandra/db/ColumnFamily.java index e4e62c2d33..b617e41b91 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamily.java +++ b/src/java/org/apache/cassandra/db/ColumnFamily.java @@ -36,7 +36,6 @@ import org.slf4j.LoggerFactory; import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.filter.QueryPath; -import org.apache.cassandra.db.marshal.AbstractCommutativeType; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.db.marshal.MarshalException; import org.apache.cassandra.io.IColumnSerializer; @@ -49,6 +48,7 @@ public class ColumnFamily implements IColumnContainer, IIterableColumns /* The column serializer for this Column Family. Create based on config. */ private static ColumnFamilySerializer serializer = new ColumnFamilySerializer(); + private final CFMetaData cfm; public static ColumnFamilySerializer serializer() { @@ -67,29 +67,25 @@ public class ColumnFamily implements IColumnContainer, IIterableColumns public static ColumnFamily create(CFMetaData cfm) { - assert cfm != null; - return new ColumnFamily(cfm.cfType, cfm.comparator, cfm.subcolumnComparator, cfm.cfId); + return new ColumnFamily(cfm); } - private final Integer cfid; - private final ColumnFamilyType type; - private transient IColumnSerializer columnSerializer; final AtomicLong markedForDeleteAt = new AtomicLong(Long.MIN_VALUE); final AtomicInteger localDeletionTime = new AtomicInteger(Integer.MIN_VALUE); private ConcurrentSkipListMap columns; - public ColumnFamily(ColumnFamilyType type, AbstractType comparator, AbstractType subcolumnComparator, Integer cfid) + public ColumnFamily(CFMetaData cfm) { - this.type = type; - columnSerializer = type == ColumnFamilyType.Standard ? Column.serializer() : SuperColumn.serializer(subcolumnComparator); - columns = new ConcurrentSkipListMap(comparator); - this.cfid = cfid; + assert cfm != null; + this.cfm = cfm; + columnSerializer = cfm.cfType == ColumnFamilyType.Standard ? Column.serializer() : SuperColumn.serializer(cfm.subcolumnComparator); + columns = new ConcurrentSkipListMap(cfm.comparator); } public ColumnFamily cloneMeShallow() { - ColumnFamily cf = new ColumnFamily(type, getComparator(), getSubComparator(), cfid); + ColumnFamily cf = new ColumnFamily(cfm); cf.markedForDeleteAt.set(markedForDeleteAt.get()); cf.localDeletionTime.set(localDeletionTime.get()); return cf; @@ -100,9 +96,9 @@ public class ColumnFamily implements IColumnContainer, IIterableColumns return (columnSerializer instanceof SuperColumnSerializer) ? ((SuperColumnSerializer)columnSerializer).getComparator() : null; } - public ColumnFamilyType getColumnFamilyType() + public ColumnFamilyType getType() { - return type; + return cfm.cfType; } public ColumnFamily cloneMe() @@ -114,15 +110,15 @@ public class ColumnFamily implements IColumnContainer, IIterableColumns public Integer id() { - return cfid; + return cfm.cfId; } /** - * @return The CFMetaData for this row, or null if the column family was dropped. + * @return The CFMetaData for this row */ public CFMetaData metadata() { - return DatabaseDescriptor.getCFMetaData(cfid); + return cfm; } /* @@ -148,7 +144,7 @@ public class ColumnFamily implements IColumnContainer, IIterableColumns public boolean isSuper() { - return type == ColumnFamilyType.Super; + return getType() == ColumnFamilyType.Super; } public void addColumn(QueryPath path, ByteBuffer value, long timestamp) @@ -294,7 +290,8 @@ public class ColumnFamily implements IColumnContainer, IIterableColumns */ public ColumnFamily diff(ColumnFamily cfComposite) { - ColumnFamily cfDiff = new ColumnFamily(cfComposite.type, getComparator(), getSubComparator(), cfComposite.id()); + assert cfComposite.id().equals(id()); + ColumnFamily cfDiff = new ColumnFamily(cfm); if (cfComposite.getMarkedForDeleteAt() > getMarkedForDeleteAt()) { cfDiff.delete(cfComposite.getLocalDeletionTime(), cfComposite.getMarkedForDeleteAt()); diff --git a/src/java/org/apache/cassandra/service/AbstractCassandraDaemon.java b/src/java/org/apache/cassandra/service/AbstractCassandraDaemon.java index 00a10c6e39..0378edcab1 100644 --- a/src/java/org/apache/cassandra/service/AbstractCassandraDaemon.java +++ b/src/java/org/apache/cassandra/service/AbstractCassandraDaemon.java @@ -169,10 +169,9 @@ public abstract class AbstractCassandraDaemon implements CassandraDaemon logger.warn("Unable to start GCInspector (currently only supported on the Sun JVM)"); } - // replay the log if necessary and check for compaction candidates + // replay the log if necessary CommitLog.recover(); - CompactionManager.instance.checkAllColumnFamilies(); - + // check to see if CL.recovery modified the lastMigrationId. if it did, we need to re apply migrations. this isn't // the same as merely reloading the schema (which wouldn't perform file deletion after a DROP). The solution // is to read those migrations from disk and apply them. diff --git a/src/java/org/apache/cassandra/tools/SSTableImport.java b/src/java/org/apache/cassandra/tools/SSTableImport.java index 1b53563f14..5e6e45c6f8 100644 --- a/src/java/org/apache/cassandra/tools/SSTableImport.java +++ b/src/java/org/apache/cassandra/tools/SSTableImport.java @@ -278,7 +278,7 @@ public class SSTableImport for (Map.Entry rowKey : decoratedKeys.entrySet()) { - if (columnFamily.getColumnFamilyType() == ColumnFamilyType.Super) + if (columnFamily.getType() == ColumnFamilyType.Super) { addToSuperCF((Map) data.get(rowKey.getValue()), columnFamily); } @@ -350,7 +350,7 @@ public class SSTableImport if (tokenName.equals("START_ARRAY")) { - if (columnFamily.getColumnFamilyType() == ColumnFamilyType.Super) + if (columnFamily.getType() == ColumnFamilyType.Super) { throw new RuntimeException("Can't write Standard columns to the Super Column Family."); } @@ -360,7 +360,7 @@ public class SSTableImport } else if (tokenName.equals("START_OBJECT")) { - if (columnFamily.getColumnFamilyType() == ColumnFamilyType.Standard) + if (columnFamily.getType() == ColumnFamilyType.Standard) { throw new RuntimeException("Can't write Super columns to the Standard Column Family."); }