You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by be...@apache.org on 2015/03/18 12:01:12 UTC

[1/3] cassandra git commit: Cleanup cell equality

Repository: cassandra
Updated Branches:
  refs/heads/cassandra-2.1 828496492 -> 69ffd1fa0
  refs/heads/trunk 7bef6f93a -> c2dc31c1f


Cleanup cell equality

patch by benedict; reviewed by sylvain for CASSANDRA-8947


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/69ffd1fa
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/69ffd1fa
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/69ffd1fa

Branch: refs/heads/cassandra-2.1
Commit: 69ffd1fa01dd9a5b7118cbcaf63dd2dffc1fa508
Parents: 8284964
Author: Benedict Elliott Smith <be...@apache.org>
Authored: Wed Mar 18 11:00:29 2015 +0000
Committer: Benedict Elliott Smith <be...@apache.org>
Committed: Wed Mar 18 11:00:29 2015 +0000

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../org/apache/cassandra/db/AbstractCell.java   |  3 +-
 .../apache/cassandra/db/BufferCounterCell.java  |  7 +---
 .../apache/cassandra/db/BufferDeletedCell.java  |  5 ---
 .../apache/cassandra/db/BufferExpiringCell.java | 13 ++----
 .../apache/cassandra/db/NativeCounterCell.java  |  8 +---
 .../apache/cassandra/db/NativeDeletedCell.java  |  6 ---
 .../apache/cassandra/db/NativeExpiringCell.java | 13 ++----
 test/unit/org/apache/cassandra/db/CellTest.java | 44 ++++++++++++++++++++
 9 files changed, 58 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/69ffd1fa/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 68df77e..2af8df6 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.1.4
+ * Cleanup cell equality (CASSANDRA-8947)
  * Introduce intra-cluster message coalescing (CASSANDRA-8692)
  * DatabaseDescriptor throws NPE when rpc_interface is used (CASSANDRA-8839)
  * Don't check if an sstable is live for offline compactions (CASSANDRA-8841)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/69ffd1fa/src/java/org/apache/cassandra/db/AbstractCell.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/AbstractCell.java b/src/java/org/apache/cassandra/db/AbstractCell.java
index f27871f..37d483f 100644
--- a/src/java/org/apache/cassandra/db/AbstractCell.java
+++ b/src/java/org/apache/cassandra/db/AbstractCell.java
@@ -136,7 +136,8 @@ public abstract class AbstractCell implements Cell
 
     public boolean equals(Cell cell)
     {
-        return timestamp() == cell.timestamp() && name().equals(cell.name()) && value().equals(cell.value());
+        return timestamp() == cell.timestamp() && name().equals(cell.name()) && value().equals(cell.value())
+               && serializationFlags() == cell.serializationFlags();
     }
 
     public int hashCode()

http://git-wip-us.apache.org/repos/asf/cassandra/blob/69ffd1fa/src/java/org/apache/cassandra/db/BufferCounterCell.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/BufferCounterCell.java b/src/java/org/apache/cassandra/db/BufferCounterCell.java
index bdd97a7..827182a 100644
--- a/src/java/org/apache/cassandra/db/BufferCounterCell.java
+++ b/src/java/org/apache/cassandra/db/BufferCounterCell.java
@@ -171,11 +171,6 @@ public class BufferCounterCell extends BufferCell implements CounterCell
     @Override
     public boolean equals(Cell cell)
     {
-        return cell instanceof CounterCell && equals((CounterCell) cell);
-    }
-
-    public boolean equals(CounterCell cell)
-    {
-        return super.equals(cell) && timestampOfLastDelete == cell.timestampOfLastDelete();
+        return super.equals(cell) && timestampOfLastDelete == ((CounterCell) cell).timestampOfLastDelete();
     }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/69ffd1fa/src/java/org/apache/cassandra/db/BufferDeletedCell.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/BufferDeletedCell.java b/src/java/org/apache/cassandra/db/BufferDeletedCell.java
index bcc170f..a38f322 100644
--- a/src/java/org/apache/cassandra/db/BufferDeletedCell.java
+++ b/src/java/org/apache/cassandra/db/BufferDeletedCell.java
@@ -107,11 +107,6 @@ public class BufferDeletedCell extends BufferCell implements DeletedCell
             throw new MarshalException("The local deletion time should not be negative");
     }
 
-    public boolean equals(Cell cell)
-    {
-        return timestamp() == cell.timestamp() && getLocalDeletionTime() == cell.getLocalDeletionTime() && name().equals(cell.name());
-    }
-
     @Override
     public void updateDigest(MessageDigest digest)
     {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/69ffd1fa/src/java/org/apache/cassandra/db/BufferExpiringCell.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/BufferExpiringCell.java b/src/java/org/apache/cassandra/db/BufferExpiringCell.java
index 347604a..25172c8 100644
--- a/src/java/org/apache/cassandra/db/BufferExpiringCell.java
+++ b/src/java/org/apache/cassandra/db/BufferExpiringCell.java
@@ -167,15 +167,10 @@ public class BufferExpiringCell extends BufferCell implements ExpiringCell
     @Override
     public boolean equals(Cell cell)
     {
-        return cell instanceof ExpiringCell && equals((ExpiringCell) cell);
-    }
-
-    public boolean equals(ExpiringCell cell)
-    {
-        // super.equals() returns false if o is not a CounterCell
-        return super.equals(cell)
-               && getLocalDeletionTime() == cell.getLocalDeletionTime()
-               && getTimeToLive() == cell.getTimeToLive();
+        if (!super.equals(cell))
+            return false;
+        ExpiringCell that = (ExpiringCell) cell;
+        return getLocalDeletionTime() == that.getLocalDeletionTime() && getTimeToLive() == that.getTimeToLive();
     }
 
     /** @return Either a DeletedCell, or an ExpiringCell. */

http://git-wip-us.apache.org/repos/asf/cassandra/blob/69ffd1fa/src/java/org/apache/cassandra/db/NativeCounterCell.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/NativeCounterCell.java b/src/java/org/apache/cassandra/db/NativeCounterCell.java
index 3fe73ce..c16cc44 100644
--- a/src/java/org/apache/cassandra/db/NativeCounterCell.java
+++ b/src/java/org/apache/cassandra/db/NativeCounterCell.java
@@ -178,13 +178,9 @@ public class NativeCounterCell extends NativeCell implements CounterCell
         return SIZE;
     }
 
+    @Override
     public boolean equals(Cell cell)
     {
-        return cell instanceof CounterCell && equals((CounterCell) cell);
-    }
-
-    public boolean equals(CounterCell cell)
-    {
-        return super.equals(cell) && timestampOfLastDelete() == cell.timestampOfLastDelete();
+        return super.equals(cell) && timestampOfLastDelete() == ((CounterCell) cell).timestampOfLastDelete();
     }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/69ffd1fa/src/java/org/apache/cassandra/db/NativeDeletedCell.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/NativeDeletedCell.java b/src/java/org/apache/cassandra/db/NativeDeletedCell.java
index e900635..6bdef43 100644
--- a/src/java/org/apache/cassandra/db/NativeDeletedCell.java
+++ b/src/java/org/apache/cassandra/db/NativeDeletedCell.java
@@ -106,12 +106,6 @@ public class NativeDeletedCell extends NativeCell implements DeletedCell
     }
 
     @Override
-    public boolean equals(Cell cell)
-    {
-        return timestamp() == cell.timestamp() && getLocalDeletionTime() == cell.getLocalDeletionTime() && name().equals(cell.name());
-    }
-
-    @Override
     public long unsharedHeapSizeExcludingData()
     {
         return SIZE;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/69ffd1fa/src/java/org/apache/cassandra/db/NativeExpiringCell.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/NativeExpiringCell.java b/src/java/org/apache/cassandra/db/NativeExpiringCell.java
index d97e080..6369536 100644
--- a/src/java/org/apache/cassandra/db/NativeExpiringCell.java
+++ b/src/java/org/apache/cassandra/db/NativeExpiringCell.java
@@ -152,15 +152,10 @@ public class NativeExpiringCell extends NativeCell implements ExpiringCell
 
     public boolean equals(Cell cell)
     {
-        return cell instanceof ExpiringCell && equals((ExpiringCell) cell);
-    }
-
-    protected boolean equals(ExpiringCell cell)
-    {
-        // super.equals() returns false if o is not a CounterCell
-        return super.equals(cell)
-                && getLocalDeletionTime() == cell.getLocalDeletionTime()
-                && getTimeToLive() == cell.getTimeToLive();
+        if (!super.equals(cell))
+            return false;
+        ExpiringCell that = (ExpiringCell) cell;
+        return getLocalDeletionTime() == that.getLocalDeletionTime() && getTimeToLive() == that.getTimeToLive();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cassandra/blob/69ffd1fa/test/unit/org/apache/cassandra/db/CellTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/CellTest.java b/test/unit/org/apache/cassandra/db/CellTest.java
index 63d6f4c..493dbbf 100644
--- a/test/unit/org/apache/cassandra/db/CellTest.java
+++ b/test/unit/org/apache/cassandra/db/CellTest.java
@@ -21,6 +21,8 @@ package org.apache.cassandra.db;
  */
 
 
+import java.nio.ByteBuffer;
+
 import org.junit.Test;
 
 import junit.framework.Assert;
@@ -37,6 +39,29 @@ public class CellTest
     private static NativeAllocator allocator = new NativePool(Integer.MAX_VALUE, Integer.MAX_VALUE, 1f, null).newAllocator();
 
     @Test
+    public void testConflictingTypeEquality()
+    {
+        boolean[] tf = new boolean[]{ true, false };
+        for (boolean lhs : tf)
+        {
+            for (boolean rhs : tf)
+            {
+                // don't test equality for both sides native, as this is based on CellName resolution
+                if (lhs && rhs)
+                    continue;
+                Cell a = expiring("a", "a", 1, 1, lhs);
+                Cell b = regular("a", "a", 1, rhs);
+                Assert.assertNotSame(a, b);
+                Assert.assertNotSame(b, a);
+                a = deleted("a", 1, 1, lhs);
+                b = regular("a", ByteBufferUtil.bytes(1), 1, rhs);
+                Assert.assertNotSame(a, b);
+                Assert.assertNotSame(b, a);
+            }
+        }
+    }
+
+    @Test
     public void testExpiringCellReconile()
     {
         // equal
@@ -94,4 +119,23 @@ public class CellTest
         return cell;
     }
 
+    private Cell regular(String name, ByteBuffer value, long timestamp, boolean nativeCell)
+    {
+        Cell cell = new BufferCell(Util.cellname(name), value, timestamp);
+        if (nativeCell)
+            cell = new NativeCell(allocator, order.getCurrent(), cell);
+        return cell;
+    }
+    private Cell regular(String name, String value, long timestamp, boolean nativeCell)
+    {
+        return regular(name, ByteBufferUtil.bytes(value), timestamp, nativeCell);
+    }
+
+    private Cell deleted(String name, int localDeletionTime, long timestamp, boolean nativeCell)
+    {
+        DeletedCell cell = new BufferDeletedCell(Util.cellname(name), localDeletionTime, timestamp);
+        if (nativeCell)
+            cell = new NativeDeletedCell(allocator, order.getCurrent(), cell);
+        return cell;
+    }
 }


[3/3] cassandra git commit: Merge branch 'cassandra-2.1' into trunk

Posted by be...@apache.org.
Merge branch 'cassandra-2.1' into trunk


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/c2dc31c1
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/c2dc31c1
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/c2dc31c1

Branch: refs/heads/trunk
Commit: c2dc31c1f0f6b7564ef955b3815d9d89bdc58df2
Parents: 7bef6f9 69ffd1f
Author: Benedict Elliott Smith <be...@apache.org>
Authored: Wed Mar 18 11:00:59 2015 +0000
Committer: Benedict Elliott Smith <be...@apache.org>
Committed: Wed Mar 18 11:00:59 2015 +0000

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../org/apache/cassandra/db/AbstractCell.java   |  3 +-
 .../apache/cassandra/db/BufferCounterCell.java  |  7 +---
 .../apache/cassandra/db/BufferDeletedCell.java  |  5 ---
 .../apache/cassandra/db/BufferExpiringCell.java | 13 ++----
 .../apache/cassandra/db/NativeCounterCell.java  |  8 +---
 .../apache/cassandra/db/NativeDeletedCell.java  |  6 ---
 .../apache/cassandra/db/NativeExpiringCell.java | 13 ++----
 test/unit/org/apache/cassandra/db/CellTest.java | 44 ++++++++++++++++++++
 9 files changed, 58 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/c2dc31c1/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index ae98f56,2af8df6..997bf04
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -1,78 -1,5 +1,79 @@@
 +3.0
 + * Partition intra-cluster message streams by size, not type (CASSANDRA-8789)
 + * Add nodetool command to validate all sstables in a node (CASSANDRA-5791)
 + * Add WriteFailureException to native protocol, notify coordinator of
 +   write failures (CASSANDRA-8592)
 + * Convert SequentialWriter to nio (CASSANDRA-8709)
 + * Add role based access control (CASSANDRA-7653, 8650, 7216, 8760, 8849, 8761, 8850)
 + * Record client ip address in tracing sessions (CASSANDRA-8162)
 + * Indicate partition key columns in response metadata for prepared
 +   statements (CASSANDRA-7660)
 + * Merge UUIDType and TimeUUIDType parse logic (CASSANDRA-8759)
 + * Avoid memory allocation when searching index summary (CASSANDRA-8793)
 + * Optimise (Time)?UUIDType Comparisons (CASSANDRA-8730)
 + * Make CRC32Ex into a separate maven dependency (CASSANDRA-8836)
 + * Use preloaded jemalloc w/ Unsafe (CASSANDRA-8714)
 + * Avoid accessing partitioner through StorageProxy (CASSANDRA-8244, 8268)
 + * Upgrade Metrics library and remove depricated metrics (CASSANDRA-5657)
 + * Serializing Row cache alternative, fully off heap (CASSANDRA-7438)
 + * Duplicate rows returned when in clause has repeated values (CASSANDRA-6707)
 + * Make CassandraException unchecked, extend RuntimeException (CASSANDRA-8560)
 + * Support direct buffer decompression for reads (CASSANDRA-8464)
 + * DirectByteBuffer compatible LZ4 methods (CASSANDRA-7039)
 + * Group sstables for anticompaction correctly (CASSANDRA-8578)
 + * Add ReadFailureException to native protocol, respond
 +   immediately when replicas encounter errors while handling
 +   a read request (CASSANDRA-7886)
 + * Switch CommitLogSegment from RandomAccessFile to nio (CASSANDRA-8308)
 + * Allow mixing token and partition key restrictions (CASSANDRA-7016)
 + * Support index key/value entries on map collections (CASSANDRA-8473)
 + * Modernize schema tables (CASSANDRA-8261)
 + * Support for user-defined aggregation functions (CASSANDRA-8053)
 + * Fix NPE in SelectStatement with empty IN values (CASSANDRA-8419)
 + * Refactor SelectStatement, return IN results in natural order instead
 +   of IN value list order and ignore duplicate values in partition key IN restrictions (CASSANDRA-7981)
 + * Support UDTs, tuples, and collections in user-defined
 +   functions (CASSANDRA-7563)
 + * Fix aggregate fn results on empty selection, result column name,
 +   and cqlsh parsing (CASSANDRA-8229)
 + * Mark sstables as repaired after full repair (CASSANDRA-7586)
 + * Extend Descriptor to include a format value and refactor reader/writer
 +   APIs (CASSANDRA-7443)
 + * Integrate JMH for microbenchmarks (CASSANDRA-8151)
 + * Keep sstable levels when bootstrapping (CASSANDRA-7460)
 + * Add Sigar library and perform basic OS settings check on startup (CASSANDRA-7838)
 + * Support for aggregation functions (CASSANDRA-4914)
 + * Remove cassandra-cli (CASSANDRA-7920)
 + * Accept dollar quoted strings in CQL (CASSANDRA-7769)
 + * Make assassinate a first class command (CASSANDRA-7935)
 + * Support IN clause on any partition key column (CASSANDRA-7855)
 + * Support IN clause on any clustering column (CASSANDRA-4762)
 + * Improve compaction logging (CASSANDRA-7818)
 + * Remove YamlFileNetworkTopologySnitch (CASSANDRA-7917)
 + * Do anticompaction in groups (CASSANDRA-6851)
 + * Support user-defined functions (CASSANDRA-7395, 7526, 7562, 7740, 7781, 7929,
 +   7924, 7812, 8063, 7813, 7708)
 + * Permit configurable timestamps with cassandra-stress (CASSANDRA-7416)
 + * Move sstable RandomAccessReader to nio2, which allows using the
 +   FILE_SHARE_DELETE flag on Windows (CASSANDRA-4050)
 + * Remove CQL2 (CASSANDRA-5918)
 + * Add Thrift get_multi_slice call (CASSANDRA-6757)
 + * Optimize fetching multiple cells by name (CASSANDRA-6933)
 + * Allow compilation in java 8 (CASSANDRA-7028)
 + * Make incremental repair default (CASSANDRA-7250)
 + * Enable code coverage thru JaCoCo (CASSANDRA-7226)
 + * Switch external naming of 'column families' to 'tables' (CASSANDRA-4369) 
 + * Shorten SSTable path (CASSANDRA-6962)
 + * Use unsafe mutations for most unit tests (CASSANDRA-6969)
 + * Fix race condition during calculation of pending ranges (CASSANDRA-7390)
 + * Fail on very large batch sizes (CASSANDRA-8011)
 + * Improve concurrency of repair (CASSANDRA-6455, 8208)
 + * Select optimal CRC32 implementation at runtime (CASSANDRA-8614)
 + * Evaluate MurmurHash of Token once per query (CASSANDRA-7096)
 + * Generalize progress reporting (CASSANDRA-8901)
 +
  2.1.4
+  * Cleanup cell equality (CASSANDRA-8947)
   * Introduce intra-cluster message coalescing (CASSANDRA-8692)
   * DatabaseDescriptor throws NPE when rpc_interface is used (CASSANDRA-8839)
   * Don't check if an sstable is live for offline compactions (CASSANDRA-8841)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/c2dc31c1/src/java/org/apache/cassandra/db/AbstractCell.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/c2dc31c1/src/java/org/apache/cassandra/db/BufferExpiringCell.java
----------------------------------------------------------------------


[2/3] cassandra git commit: Cleanup cell equality

Posted by be...@apache.org.
Cleanup cell equality

patch by benedict; reviewed by sylvain for CASSANDRA-8947


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/69ffd1fa
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/69ffd1fa
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/69ffd1fa

Branch: refs/heads/trunk
Commit: 69ffd1fa01dd9a5b7118cbcaf63dd2dffc1fa508
Parents: 8284964
Author: Benedict Elliott Smith <be...@apache.org>
Authored: Wed Mar 18 11:00:29 2015 +0000
Committer: Benedict Elliott Smith <be...@apache.org>
Committed: Wed Mar 18 11:00:29 2015 +0000

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../org/apache/cassandra/db/AbstractCell.java   |  3 +-
 .../apache/cassandra/db/BufferCounterCell.java  |  7 +---
 .../apache/cassandra/db/BufferDeletedCell.java  |  5 ---
 .../apache/cassandra/db/BufferExpiringCell.java | 13 ++----
 .../apache/cassandra/db/NativeCounterCell.java  |  8 +---
 .../apache/cassandra/db/NativeDeletedCell.java  |  6 ---
 .../apache/cassandra/db/NativeExpiringCell.java | 13 ++----
 test/unit/org/apache/cassandra/db/CellTest.java | 44 ++++++++++++++++++++
 9 files changed, 58 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/69ffd1fa/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 68df77e..2af8df6 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.1.4
+ * Cleanup cell equality (CASSANDRA-8947)
  * Introduce intra-cluster message coalescing (CASSANDRA-8692)
  * DatabaseDescriptor throws NPE when rpc_interface is used (CASSANDRA-8839)
  * Don't check if an sstable is live for offline compactions (CASSANDRA-8841)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/69ffd1fa/src/java/org/apache/cassandra/db/AbstractCell.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/AbstractCell.java b/src/java/org/apache/cassandra/db/AbstractCell.java
index f27871f..37d483f 100644
--- a/src/java/org/apache/cassandra/db/AbstractCell.java
+++ b/src/java/org/apache/cassandra/db/AbstractCell.java
@@ -136,7 +136,8 @@ public abstract class AbstractCell implements Cell
 
     public boolean equals(Cell cell)
     {
-        return timestamp() == cell.timestamp() && name().equals(cell.name()) && value().equals(cell.value());
+        return timestamp() == cell.timestamp() && name().equals(cell.name()) && value().equals(cell.value())
+               && serializationFlags() == cell.serializationFlags();
     }
 
     public int hashCode()

http://git-wip-us.apache.org/repos/asf/cassandra/blob/69ffd1fa/src/java/org/apache/cassandra/db/BufferCounterCell.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/BufferCounterCell.java b/src/java/org/apache/cassandra/db/BufferCounterCell.java
index bdd97a7..827182a 100644
--- a/src/java/org/apache/cassandra/db/BufferCounterCell.java
+++ b/src/java/org/apache/cassandra/db/BufferCounterCell.java
@@ -171,11 +171,6 @@ public class BufferCounterCell extends BufferCell implements CounterCell
     @Override
     public boolean equals(Cell cell)
     {
-        return cell instanceof CounterCell && equals((CounterCell) cell);
-    }
-
-    public boolean equals(CounterCell cell)
-    {
-        return super.equals(cell) && timestampOfLastDelete == cell.timestampOfLastDelete();
+        return super.equals(cell) && timestampOfLastDelete == ((CounterCell) cell).timestampOfLastDelete();
     }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/69ffd1fa/src/java/org/apache/cassandra/db/BufferDeletedCell.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/BufferDeletedCell.java b/src/java/org/apache/cassandra/db/BufferDeletedCell.java
index bcc170f..a38f322 100644
--- a/src/java/org/apache/cassandra/db/BufferDeletedCell.java
+++ b/src/java/org/apache/cassandra/db/BufferDeletedCell.java
@@ -107,11 +107,6 @@ public class BufferDeletedCell extends BufferCell implements DeletedCell
             throw new MarshalException("The local deletion time should not be negative");
     }
 
-    public boolean equals(Cell cell)
-    {
-        return timestamp() == cell.timestamp() && getLocalDeletionTime() == cell.getLocalDeletionTime() && name().equals(cell.name());
-    }
-
     @Override
     public void updateDigest(MessageDigest digest)
     {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/69ffd1fa/src/java/org/apache/cassandra/db/BufferExpiringCell.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/BufferExpiringCell.java b/src/java/org/apache/cassandra/db/BufferExpiringCell.java
index 347604a..25172c8 100644
--- a/src/java/org/apache/cassandra/db/BufferExpiringCell.java
+++ b/src/java/org/apache/cassandra/db/BufferExpiringCell.java
@@ -167,15 +167,10 @@ public class BufferExpiringCell extends BufferCell implements ExpiringCell
     @Override
     public boolean equals(Cell cell)
     {
-        return cell instanceof ExpiringCell && equals((ExpiringCell) cell);
-    }
-
-    public boolean equals(ExpiringCell cell)
-    {
-        // super.equals() returns false if o is not a CounterCell
-        return super.equals(cell)
-               && getLocalDeletionTime() == cell.getLocalDeletionTime()
-               && getTimeToLive() == cell.getTimeToLive();
+        if (!super.equals(cell))
+            return false;
+        ExpiringCell that = (ExpiringCell) cell;
+        return getLocalDeletionTime() == that.getLocalDeletionTime() && getTimeToLive() == that.getTimeToLive();
     }
 
     /** @return Either a DeletedCell, or an ExpiringCell. */

http://git-wip-us.apache.org/repos/asf/cassandra/blob/69ffd1fa/src/java/org/apache/cassandra/db/NativeCounterCell.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/NativeCounterCell.java b/src/java/org/apache/cassandra/db/NativeCounterCell.java
index 3fe73ce..c16cc44 100644
--- a/src/java/org/apache/cassandra/db/NativeCounterCell.java
+++ b/src/java/org/apache/cassandra/db/NativeCounterCell.java
@@ -178,13 +178,9 @@ public class NativeCounterCell extends NativeCell implements CounterCell
         return SIZE;
     }
 
+    @Override
     public boolean equals(Cell cell)
     {
-        return cell instanceof CounterCell && equals((CounterCell) cell);
-    }
-
-    public boolean equals(CounterCell cell)
-    {
-        return super.equals(cell) && timestampOfLastDelete() == cell.timestampOfLastDelete();
+        return super.equals(cell) && timestampOfLastDelete() == ((CounterCell) cell).timestampOfLastDelete();
     }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/69ffd1fa/src/java/org/apache/cassandra/db/NativeDeletedCell.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/NativeDeletedCell.java b/src/java/org/apache/cassandra/db/NativeDeletedCell.java
index e900635..6bdef43 100644
--- a/src/java/org/apache/cassandra/db/NativeDeletedCell.java
+++ b/src/java/org/apache/cassandra/db/NativeDeletedCell.java
@@ -106,12 +106,6 @@ public class NativeDeletedCell extends NativeCell implements DeletedCell
     }
 
     @Override
-    public boolean equals(Cell cell)
-    {
-        return timestamp() == cell.timestamp() && getLocalDeletionTime() == cell.getLocalDeletionTime() && name().equals(cell.name());
-    }
-
-    @Override
     public long unsharedHeapSizeExcludingData()
     {
         return SIZE;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/69ffd1fa/src/java/org/apache/cassandra/db/NativeExpiringCell.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/NativeExpiringCell.java b/src/java/org/apache/cassandra/db/NativeExpiringCell.java
index d97e080..6369536 100644
--- a/src/java/org/apache/cassandra/db/NativeExpiringCell.java
+++ b/src/java/org/apache/cassandra/db/NativeExpiringCell.java
@@ -152,15 +152,10 @@ public class NativeExpiringCell extends NativeCell implements ExpiringCell
 
     public boolean equals(Cell cell)
     {
-        return cell instanceof ExpiringCell && equals((ExpiringCell) cell);
-    }
-
-    protected boolean equals(ExpiringCell cell)
-    {
-        // super.equals() returns false if o is not a CounterCell
-        return super.equals(cell)
-                && getLocalDeletionTime() == cell.getLocalDeletionTime()
-                && getTimeToLive() == cell.getTimeToLive();
+        if (!super.equals(cell))
+            return false;
+        ExpiringCell that = (ExpiringCell) cell;
+        return getLocalDeletionTime() == that.getLocalDeletionTime() && getTimeToLive() == that.getTimeToLive();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cassandra/blob/69ffd1fa/test/unit/org/apache/cassandra/db/CellTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/CellTest.java b/test/unit/org/apache/cassandra/db/CellTest.java
index 63d6f4c..493dbbf 100644
--- a/test/unit/org/apache/cassandra/db/CellTest.java
+++ b/test/unit/org/apache/cassandra/db/CellTest.java
@@ -21,6 +21,8 @@ package org.apache.cassandra.db;
  */
 
 
+import java.nio.ByteBuffer;
+
 import org.junit.Test;
 
 import junit.framework.Assert;
@@ -37,6 +39,29 @@ public class CellTest
     private static NativeAllocator allocator = new NativePool(Integer.MAX_VALUE, Integer.MAX_VALUE, 1f, null).newAllocator();
 
     @Test
+    public void testConflictingTypeEquality()
+    {
+        boolean[] tf = new boolean[]{ true, false };
+        for (boolean lhs : tf)
+        {
+            for (boolean rhs : tf)
+            {
+                // don't test equality for both sides native, as this is based on CellName resolution
+                if (lhs && rhs)
+                    continue;
+                Cell a = expiring("a", "a", 1, 1, lhs);
+                Cell b = regular("a", "a", 1, rhs);
+                Assert.assertNotSame(a, b);
+                Assert.assertNotSame(b, a);
+                a = deleted("a", 1, 1, lhs);
+                b = regular("a", ByteBufferUtil.bytes(1), 1, rhs);
+                Assert.assertNotSame(a, b);
+                Assert.assertNotSame(b, a);
+            }
+        }
+    }
+
+    @Test
     public void testExpiringCellReconile()
     {
         // equal
@@ -94,4 +119,23 @@ public class CellTest
         return cell;
     }
 
+    private Cell regular(String name, ByteBuffer value, long timestamp, boolean nativeCell)
+    {
+        Cell cell = new BufferCell(Util.cellname(name), value, timestamp);
+        if (nativeCell)
+            cell = new NativeCell(allocator, order.getCurrent(), cell);
+        return cell;
+    }
+    private Cell regular(String name, String value, long timestamp, boolean nativeCell)
+    {
+        return regular(name, ByteBufferUtil.bytes(value), timestamp, nativeCell);
+    }
+
+    private Cell deleted(String name, int localDeletionTime, long timestamp, boolean nativeCell)
+    {
+        DeletedCell cell = new BufferDeletedCell(Util.cellname(name), localDeletionTime, timestamp);
+        if (nativeCell)
+            cell = new NativeDeletedCell(allocator, order.getCurrent(), cell);
+        return cell;
+    }
 }