Make sure DeletedColumn.isMFD always return true

patch by Wade Simmons & slebresne; reviewed by jbellis for CASSANDRA-4307
This commit is contained in:
Sylvain Lebresne 2012-06-06 10:04:32 +02:00
parent 0144f2fe41
commit ac8bbb17ee
3 changed files with 30 additions and 0 deletions

View File

@ -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)

View File

@ -38,6 +38,14 @@ public class DeletedColumn extends Column
super(name, value, timestamp);
}
@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()
{

View File

@ -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());
}
}