Author: jbellis
Date: Fri Apr 16 22:04:11 2010
New Revision: 935087
URL: http://svn.apache.org/viewvc?rev=935087&view=rev
Log:
move deletion code into DeletedColumn instead of using boolean isMarkedForDelete
patch by Sylvain Lebresne; reviewed by jbellis for CASSANDRA-699
Added:
cassandra/trunk/src/java/org/apache/cassandra/db/DeletedColumn.java
Modified:
cassandra/trunk/src/java/org/apache/cassandra/db/Column.java
cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java
cassandra/trunk/src/java/org/apache/cassandra/db/ColumnSerializer.java
cassandra/trunk/src/java/org/apache/cassandra/db/RowMutation.java
cassandra/trunk/src/java/org/apache/cassandra/tools/SSTableImport.java
cassandra/trunk/test/unit/org/apache/cassandra/tools/SSTableExportTest.java
Modified: cassandra/trunk/src/java/org/apache/cassandra/db/Column.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/Column.java?rev=935087&r1=935086&r2=935087&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/Column.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/Column.java Fri Apr 16
22:04:11 2010
@@ -19,7 +19,6 @@
package org.apache.cassandra.db;
import java.util.Collection;
-import java.nio.ByteBuffer;
import java.security.MessageDigest;
import java.io.IOException;
@@ -39,19 +38,18 @@ import org.apache.cassandra.io.util.Data
public class Column implements IColumn
{
- private static Logger logger_ = LoggerFactory.getLogger(Column.class);
+ private static Logger logger = LoggerFactory.getLogger(Column.class);
- private static ColumnSerializer serializer_ = new ColumnSerializer();
+ private static ColumnSerializer serializer = new ColumnSerializer();
public static ColumnSerializer serializer()
{
- return serializer_;
+ return serializer;
}
- private final byte[] name;
- private final byte[] value;
- private final long timestamp;
- private final boolean isMarkedForDelete;
+ protected final byte[] name;
+ protected final byte[] value;
+ protected final long timestamp;
Column(byte[] name)
{
@@ -65,18 +63,12 @@ public class Column implements IColumn
public Column(byte[] name, byte[] value, long timestamp)
{
- this(name, value, timestamp, false);
- }
-
- public Column(byte[] name, byte[] value, long timestamp, boolean isDeleted)
- {
assert name != null;
assert value != null;
assert name.length <= IColumn.MAX_NAME_LENGTH;
this.name = name;
this.value = value;
this.timestamp = timestamp;
- isMarkedForDelete = isDeleted;
}
public byte[] name()
@@ -111,16 +103,12 @@ public class Column implements IColumn
public boolean isMarkedForDelete()
{
- return isMarkedForDelete;
+ return false;
}
public long getMarkedForDeleteAt()
{
- if (!isMarkedForDelete())
- {
- throw new IllegalStateException("column is not marked for delete");
- }
- return timestamp;
+ throw new IllegalStateException("column is not marked for delete");
}
public long mostRecentLiveChangeAt()
@@ -172,7 +160,7 @@ public class Column implements IColumn
try
{
buffer.writeLong(timestamp);
- buffer.writeBoolean(isMarkedForDelete);
+ buffer.writeBoolean(isMarkedForDelete());
}
catch (IOException e)
{
@@ -183,14 +171,13 @@ public class Column implements IColumn
public int getLocalDeletionTime()
{
- assert isMarkedForDelete;
- return ByteBuffer.wrap(value).getInt();
+ throw new IllegalStateException("column is not marked for delete");
}
// note that we do not call this simply compareTo since it also makes
sense to compare Columns by name
public long comparePriority(Column o)
{
- if (isMarkedForDelete)
+ if (isMarkedForDelete())
{
// tombstone always wins ties.
return timestamp < o.timestamp ? -1 : 1;
Modified: cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java?rev=935087&r1=935086&r2=935087&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java Fri Apr
16 22:04:11 2010
@@ -172,25 +172,35 @@ public class ColumnFamily implements ICo
public void addColumn(QueryPath path, byte[] value, long timestamp)
{
- addColumn(path, value, timestamp, false);
+ assert path.columnName != null : path;
+ addColumn(path.superColumnName, new Column(path.columnName, value,
timestamp));
+ }
+
+ public void addTombstone(QueryPath path, byte[] localDeletionTime, long
timestamp)
+ {
+ addColumn(path.superColumnName, new DeletedColumn(path.columnName,
localDeletionTime, timestamp));
}
- /** In most places the CF must be part of a QueryPath but here it is
ignored. */
- public void addColumn(QueryPath path, byte[] value, long timestamp,
boolean deleted)
- {
+ public void deleteColumn(QueryPath path, int localDeletionTime, long
timestamp)
+ {
assert path.columnName != null : path;
- IColumn column;
- if (path.superColumnName == null)
+ addColumn(path.superColumnName, new DeletedColumn(path.columnName,
localDeletionTime, timestamp));
+ }
+
+ public void addColumn(byte[] superColumnName, Column column)
+ {
+ IColumn c;
+ if (superColumnName == null)
{
- column = new Column(path.columnName, value, timestamp, deleted);
+ c = column;
}
else
{
assert isSuper();
- column = new SuperColumn(path.superColumnName, getSubComparator());
- column.addColumn(new Column(path.columnName, value, timestamp,
deleted)); // checks subcolumn name
+ c = new SuperColumn(superColumnName, getSubComparator());
+ c.addColumn(column); // checks subcolumn name
}
- addColumn(column);
+ addColumn(c);
}
public void clear()
Modified: cassandra/trunk/src/java/org/apache/cassandra/db/ColumnSerializer.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnSerializer.java?rev=935087&r1=935086&r2=935087&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/ColumnSerializer.java
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/ColumnSerializer.java Fri
Apr 16 22:04:11 2010
@@ -58,6 +58,6 @@ public class ColumnSerializer implements
{
dis.readFully(value);
}
- return new Column(name, value, ts, delete);
+ return delete ? new DeletedColumn(name, value, ts) : new Column(name,
value, ts);
}
}
Added: cassandra/trunk/src/java/org/apache/cassandra/db/DeletedColumn.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/DeletedColumn.java?rev=935087&view=auto
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/DeletedColumn.java (added)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/DeletedColumn.java Fri Apr
16 22:04:11 2010
@@ -0,0 +1,58 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.db;
+
+import java.nio.ByteBuffer;
+
+import org.apache.cassandra.utils.FBUtilities;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DeletedColumn extends Column
+{
+ private static Logger logger =
LoggerFactory.getLogger(DeletedColumn.class);
+
+ public DeletedColumn(byte[] name, int localDeletionTime, long timestamp)
+ {
+ this(name, FBUtilities.toByteArray(localDeletionTime), timestamp);
+ }
+
+ public DeletedColumn(byte[] name, byte[] value, long ts)
+ {
+ super(name, value, ts);
+ }
+
+ @Override
+ public boolean isMarkedForDelete()
+ {
+ return true;
+ }
+
+ @Override
+ public long getMarkedForDeleteAt()
+ {
+ return timestamp;
+ }
+
+ @Override
+ public int getLocalDeletionTime()
+ {
+ return ByteBuffer.wrap(value()).getInt();
+ }
+}
Modified: cassandra/trunk/src/java/org/apache/cassandra/db/RowMutation.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/RowMutation.java?rev=935087&r1=935086&r2=935087&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/RowMutation.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/RowMutation.java Fri Apr
16 22:04:11 2010
@@ -183,9 +183,7 @@ public class RowMutation
}
else
{
- ByteBuffer bytes = ByteBuffer.allocate(4);
- bytes.putInt(localDeleteTime);
- columnFamily.addColumn(path, bytes.array(), timestamp, true);
+ columnFamily.deleteColumn(path, localDeleteTime, timestamp);
}
modifications_.put(cfName, columnFamily);
Modified: cassandra/trunk/src/java/org/apache/cassandra/tools/SSTableImport.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/tools/SSTableImport.java?rev=935087&r1=935086&r2=935087&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/tools/SSTableImport.java
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/tools/SSTableImport.java Fri
Apr 16 22:04:11 2010
@@ -88,7 +88,11 @@ public class SSTableImport
{
JsonColumn col = new JsonColumn(c);
QueryPath path = new QueryPath(cfamily.name(), null,
hexToBytes(col.name));
- cfamily.addColumn(path, hexToBytes(col.value), col.timestamp,
col.isDeleted);
+ if (col.isDeleted) {
+ cfamily.addColumn(path, hexToBytes(col.value), col.timestamp);
+ } else {
+ cfamily.addTombstone(path, hexToBytes(col.value),
col.timestamp);
+ }
}
}
@@ -112,7 +116,11 @@ public class SSTableImport
{
JsonColumn col = new JsonColumn(c);
QueryPath path = new QueryPath(cfamily.name(), superName,
hexToBytes(col.name));
- cfamily.addColumn(path, hexToBytes(col.value), col.timestamp,
col.isDeleted);
+ if (col.isDeleted) {
+ cfamily.addColumn(path, hexToBytes(col.value),
col.timestamp);
+ } else {
+ cfamily.addTombstone(path, hexToBytes(col.value),
col.timestamp);
+ }
}
SuperColumn superColumn =
(SuperColumn)cfamily.getColumn(superName);
Modified:
cassandra/trunk/test/unit/org/apache/cassandra/tools/SSTableExportTest.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/tools/SSTableExportTest.java?rev=935087&r1=935086&r2=935087&view=diff
==============================================================================
--- cassandra/trunk/test/unit/org/apache/cassandra/tools/SSTableExportTest.java
(original)
+++ cassandra/trunk/test/unit/org/apache/cassandra/tools/SSTableExportTest.java
Fri Apr 16 22:04:11 2010
@@ -64,14 +64,14 @@ public class SSTableExportTest extends S
SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2,
partitioner);
// Add rowA
- cfamily.addColumn(new QueryPath("Standard1", null, "colA".getBytes()),
"valA".getBytes(), 1, false);
+ cfamily.addColumn(new QueryPath("Standard1", null, "colA".getBytes()),
"valA".getBytes(), 1);
ColumnFamily.serializer().serializeWithIndexes(cfamily, dob);
writer.append(Util.dk("rowA"), dob);
dob.reset();
cfamily.clear();
// Add rowB
- cfamily.addColumn(new QueryPath("Standard1", null, "colB".getBytes()),
"valB".getBytes(), 1, false);
+ cfamily.addColumn(new QueryPath("Standard1", null, "colB".getBytes()),
"valB".getBytes(), 1);
ColumnFamily.serializer().serializeWithIndexes(cfamily, dob);
writer.append(Util.dk("rowB"), dob);
dob.reset();
@@ -102,21 +102,21 @@ public class SSTableExportTest extends S
SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2,
partitioner);
// Add rowA
- cfamily.addColumn(new QueryPath("Standard1", null, "colA".getBytes()),
"valA".getBytes(), 1, false);
+ cfamily.addColumn(new QueryPath("Standard1", null, "colA".getBytes()),
"valA".getBytes(), 1);
ColumnFamily.serializer().serializeWithIndexes(cfamily, dob);
writer.append(Util.dk("rowA"), dob);
dob.reset();
cfamily.clear();
// Add rowB
- cfamily.addColumn(new QueryPath("Standard1", null, "colB".getBytes()),
"valB".getBytes(), 1, false);
+ cfamily.addColumn(new QueryPath("Standard1", null, "colB".getBytes()),
"valB".getBytes(), 1);
ColumnFamily.serializer().serializeWithIndexes(cfamily, dob);
writer.append(Util.dk("rowB"), dob);
dob.reset();
cfamily.clear();
// Add rowExclude
- cfamily.addColumn(new QueryPath("Standard1", null, "colX".getBytes()),
"valX".getBytes(), 1, false);
+ cfamily.addColumn(new QueryPath("Standard1", null, "colX".getBytes()),
"valX".getBytes(), 1);
ColumnFamily.serializer().serializeWithIndexes(cfamily, dob);
writer.append(Util.dk("rowExclude"), dob);
dob.reset();
@@ -152,21 +152,21 @@ public class SSTableExportTest extends S
SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2,
partitioner);
// Add rowA
- cfamily.addColumn(new QueryPath("Super4", "superA".getBytes(),
"colA".getBytes()), "valA".getBytes(), 1, false);
+ cfamily.addColumn(new QueryPath("Super4", "superA".getBytes(),
"colA".getBytes()), "valA".getBytes(), 1);
ColumnFamily.serializer().serializeWithIndexes(cfamily, dob);
writer.append(Util.dk("rowA"), dob);
dob.reset();
cfamily.clear();
// Add rowB
- cfamily.addColumn(new QueryPath("Super4", "superB".getBytes(),
"colB".getBytes()), "valB".getBytes(), 1, false);
+ cfamily.addColumn(new QueryPath("Super4", "superB".getBytes(),
"colB".getBytes()), "valB".getBytes(), 1);
ColumnFamily.serializer().serializeWithIndexes(cfamily, dob);
writer.append(Util.dk("rowB"), dob);
dob.reset();
cfamily.clear();
// Add rowExclude
- cfamily.addColumn(new QueryPath("Super4", "superX".getBytes(),
"colX".getBytes()), "valX".getBytes(), 1, false);
+ cfamily.addColumn(new QueryPath("Super4", "superX".getBytes(),
"colX".getBytes()), "valX".getBytes(), 1);
ColumnFamily.serializer().serializeWithIndexes(cfamily, dob);
writer.append(Util.dk("rowExclude"), dob);
dob.reset();
@@ -200,14 +200,14 @@ public class SSTableExportTest extends S
SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2,
partitioner);
// Add rowA
- cfamily.addColumn(new QueryPath("Standard1", null, "name".getBytes()),
"val".getBytes(), 1, false);
+ cfamily.addColumn(new QueryPath("Standard1", null, "name".getBytes()),
"val".getBytes(), 1);
ColumnFamily.serializer().serializeWithIndexes(cfamily, dob);
writer.append(Util.dk("rowA"), dob);
dob.reset();
cfamily.clear();
// Add rowExclude
- cfamily.addColumn(new QueryPath("Standard1", null, "name".getBytes()),
"val".getBytes(), 1, false);
+ cfamily.addColumn(new QueryPath("Standard1", null, "name".getBytes()),
"val".getBytes(), 1);
ColumnFamily.serializer().serializeWithIndexes(cfamily, dob);
writer.append(Util.dk("rowExclude"), dob);
dob.reset();