You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by sl...@apache.org on 2012/06/08 09:33:23 UTC

[5/5] git commit: Make sure DeletedColumn.isMFD always return true

Make sure DeletedColumn.isMFD always return true

patch by Wade Simmons & slebresne; reviewed by jbellis for CASSANDRA-4307


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

Branch: refs/heads/trunk
Commit: ac8bbb17ee86e2aede17672da5ee64824ae01381
Parents: 0144f2f
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Wed Jun 6 10:04:32 2012 +0200
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Wed Jun 6 10:04:32 2012 +0200

----------------------------------------------------------------------
 CHANGES.txt                                        |    2 +
 .../org/apache/cassandra/db/DeletedColumn.java     |    8 ++++++
 .../org/apache/cassandra/db/RemoveColumnTest.java  |   20 +++++++++++++++
 3 files changed, 30 insertions(+), 0 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/ac8bbb17/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index c0777d8..5a3bf5d 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,7 @@
 1.1.2
  * enforce 1m min keycache for auto (CASSANDRA-4306)
+ * Have DeletedColumn.isMFD always return true (CASSANDRA-4307)
+
 
 1.1.1
  * add getsstables command to nodetool (CASSANDRA-4199)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/ac8bbb17/src/java/org/apache/cassandra/db/DeletedColumn.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/DeletedColumn.java b/src/java/org/apache/cassandra/db/DeletedColumn.java
index f67ffc8..a52d240 100644
--- a/src/java/org/apache/cassandra/db/DeletedColumn.java
+++ b/src/java/org/apache/cassandra/db/DeletedColumn.java
@@ -39,6 +39,14 @@ public class DeletedColumn extends Column
     }
 
     @Override
+    public boolean isMarkedForDelete()
+    {
+        // We don't rely on the column implementation because it could mistakenly return false if
+        // some node are not exactly synchronized, which is problematic (see #4307)
+        return true;
+    }
+
+    @Override
     public long getMarkedForDeleteAt()
     {
         return timestamp;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/ac8bbb17/test/unit/org/apache/cassandra/db/RemoveColumnTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/RemoveColumnTest.java b/test/unit/org/apache/cassandra/db/RemoveColumnTest.java
index 67afba9..06ce57d 100644
--- a/test/unit/org/apache/cassandra/db/RemoveColumnTest.java
+++ b/test/unit/org/apache/cassandra/db/RemoveColumnTest.java
@@ -24,6 +24,7 @@ import java.util.concurrent.ExecutionException;
 import org.junit.Test;
 
 import static junit.framework.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 
 import org.apache.cassandra.db.filter.QueryFilter;
 import org.apache.cassandra.db.filter.QueryPath;
@@ -59,4 +60,23 @@ public class RemoveColumnTest extends SchemaLoader
         assertNull(Util.cloneAndRemoveDeleted(retrieved, Integer.MAX_VALUE));
         assertNull(Util.cloneAndRemoveDeleted(store.getColumnFamily(QueryFilter.getIdentityFilter(dk, new QueryPath("Standard1"))), Integer.MAX_VALUE));
     }
+
+    @Test
+    public void deletedColumnShouldAlwaysBeMarkedForDelete()
+    {
+        // Check for bug in #4307
+        long timestamp = System.currentTimeMillis();
+        int localDeletionTime = (int) (timestamp / 1000);
+        Column c = DeletedColumn.create(localDeletionTime, timestamp, "dc1");
+        assertTrue("DeletedColumn was not marked for delete", c.isMarkedForDelete());
+
+        // Simulate a node that is 30 seconds behind
+        c = DeletedColumn.create(localDeletionTime + 30, timestamp + 30000, "dc2");
+        assertTrue("DeletedColumn was not marked for delete", c.isMarkedForDelete());
+
+        // Simulate a node that is 30 ahead behind
+        c = DeletedColumn.create(localDeletionTime - 30, timestamp - 30000, "dc3");
+        assertTrue("DeletedColumn was not marked for delete", c.isMarkedForDelete());
+    }
+
 }