diff --git a/CHANGES.txt b/CHANGES.txt index 1fe21aaca9..c7522443a7 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,6 @@ 1.0.11 + * allow dropping columns shadowed by not-yet-expired supercolumn or row + tombstones in PrecompactedRow (CASSANDRA-4396) * synchronize LCS getEstimatedTasks to avoid CME (CASSANDRA-4255) * ensure unique streaming session id's (CASSANDRA-4223) * kick off background compaction when min/max thresholds change diff --git a/src/java/org/apache/cassandra/db/AbstractColumnContainer.java b/src/java/org/apache/cassandra/db/AbstractColumnContainer.java index 87e75eb744..af8a010649 100644 --- a/src/java/org/apache/cassandra/db/AbstractColumnContainer.java +++ b/src/java/org/apache/cassandra/db/AbstractColumnContainer.java @@ -251,13 +251,13 @@ public abstract class AbstractColumnContainer implements IColumnContainer, IIter } } - public boolean hasExpiredTombstones(int gcBefore) + public boolean hasIrrelevantData(int gcBefore) { if (isMarkedForDelete() && getLocalDeletionTime() < gcBefore) return true; for (IColumn column : columns) - if (column.hasExpiredTombstones(gcBefore)) + if (column.mostRecentLiveChangeAt() < getLocalDeletionTime() || column.hasIrrelevantData(gcBefore)) return true; return false; diff --git a/src/java/org/apache/cassandra/db/Column.java b/src/java/org/apache/cassandra/db/Column.java index a7cd39f570..072bfde82c 100644 --- a/src/java/org/apache/cassandra/db/Column.java +++ b/src/java/org/apache/cassandra/db/Column.java @@ -281,7 +281,7 @@ public class Column implements IColumn valueValidator.validate(value()); } - public boolean hasExpiredTombstones(int gcBefore) + public boolean hasIrrelevantData(int gcBefore) { return isMarkedForDelete() && getLocalDeletionTime() < gcBefore; } diff --git a/src/java/org/apache/cassandra/db/IColumn.java b/src/java/org/apache/cassandra/db/IColumn.java index fe6e949468..cefc12c4ee 100644 --- a/src/java/org/apache/cassandra/db/IColumn.java +++ b/src/java/org/apache/cassandra/db/IColumn.java @@ -75,7 +75,7 @@ public interface IColumn /** * @return true if the column or any its subcolumns expired before @param gcBefore */ - public boolean hasExpiredTombstones(int gcBefore); + public boolean hasIrrelevantData(int gcBefore); /** * For a standard column, this is the same as timestamp(). diff --git a/src/java/org/apache/cassandra/db/IColumnContainer.java b/src/java/org/apache/cassandra/db/IColumnContainer.java index b300706aec..3259fdd0d4 100644 --- a/src/java/org/apache/cassandra/db/IColumnContainer.java +++ b/src/java/org/apache/cassandra/db/IColumnContainer.java @@ -44,7 +44,7 @@ public interface IColumnContainer public boolean isMarkedForDelete(); public long getMarkedForDeleteAt(); - public boolean hasExpiredTombstones(int gcBefore); + public boolean hasIrrelevantData(int gcBefore); public AbstractType getComparator(); diff --git a/src/java/org/apache/cassandra/db/compaction/PrecompactedRow.java b/src/java/org/apache/cassandra/db/compaction/PrecompactedRow.java index 5b5ba8d52d..aced6d9d7b 100644 --- a/src/java/org/apache/cassandra/db/compaction/PrecompactedRow.java +++ b/src/java/org/apache/cassandra/db/compaction/PrecompactedRow.java @@ -67,7 +67,7 @@ public class PrecompactedRow extends AbstractCompactedRow // taking this into account. Boolean shouldPurge = null; - if (cf.hasExpiredTombstones(controller.gcBefore)) + if (cf.hasIrrelevantData(controller.gcBefore)) shouldPurge = controller.shouldPurge(key); ColumnFamily compacted = shouldPurge != null && shouldPurge ? ColumnFamilyStore.removeDeleted(cf, controller.gcBefore)