Merge branch 'cassandra-2.0' into cassandra-2.1
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/89a8f4a7 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/89a8f4a7 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/89a8f4a7 Branch: refs/heads/cassandra-2.1 Commit: 89a8f4a7e96b11a1ac13414cd4565a5b0b1f05f4 Parents: f7856c2 e2ad896 Author: Yuki Morishita <yu...@apache.org> Authored: Fri Mar 27 13:35:29 2015 -0500 Committer: Yuki Morishita <yu...@apache.org> Committed: Fri Mar 27 13:35:29 2015 -0500 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../db/compaction/LazilyCompactedRow.java | 7 ++++++- .../org/apache/cassandra/repair/Validator.java | 19 ++++++++++++++++--- 3 files changed, 23 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/89a8f4a7/CHANGES.txt ---------------------------------------------------------------------- diff --cc CHANGES.txt index 3f5571e,9494f61..64fa75f --- a/CHANGES.txt +++ b/CHANGES.txt @@@ -83,6 -23,10 +83,7 @@@ Merged from 2.0 * Add ability to limit number of native connections (CASSANDRA-8086) * Fix CQLSSTableWriter throwing exception and spawning threads (CASSANDRA-8808) + * Fix MT mismatch between empty and GC-able data (CASSANDRA-8979) - - -2.0.13: * Add offline tool to relevel sstables (CASSANDRA-8301) * Preserve stream ID for more protocol errors (CASSANDRA-8848) * Fix combining token() function with multi-column relations on http://git-wip-us.apache.org/repos/asf/cassandra/blob/89a8f4a7/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java ---------------------------------------------------------------------- diff --cc src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java index f61225a,b562ba5..88c87a4 --- a/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java +++ b/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java @@@ -159,7 -141,11 +159,12 @@@ public class LazilyCompactedRow extend try { DeletionTime.serializer.serialize(emptyColumnFamily.deletionInfo().getTopLevelDeletion(), out); - digest.update(out.getData(), 0, out.getLength()); ++ + // do not update digest in case of missing or purged row level tombstones, see CASSANDRA-8979 + if (emptyColumnFamily.deletionInfo().getTopLevelDeletion() != DeletionTime.LIVE) + { + digest.update(out.getData(), 0, out.getLength()); + } } catch (IOException e) { http://git-wip-us.apache.org/repos/asf/cassandra/blob/89a8f4a7/src/java/org/apache/cassandra/repair/Validator.java ---------------------------------------------------------------------- diff --cc src/java/org/apache/cassandra/repair/Validator.java index 641717e,5aa0cfe..8f8bf6d --- a/src/java/org/apache/cassandra/repair/Validator.java +++ b/src/java/org/apache/cassandra/repair/Validator.java @@@ -24,11 -24,12 +24,11 @@@ import java.util.List import java.util.Random; import com.google.common.annotations.VisibleForTesting; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import org.apache.cassandra.concurrent.Stage; import org.apache.cassandra.concurrent.StageManager; -import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.DecoratedKey; import org.apache.cassandra.db.compaction.AbstractCompactedRow; @@@ -186,7 -201,15 +191,15 @@@ public class Validator implements Runna // MerkleTree uses XOR internally, so we want lots of output bits here CountingDigest digest = new CountingDigest(FBUtilities.newMessageDigest("SHA-256")); row.update(digest); - return new MerkleTree.RowHash(row.key.getToken(), digest.digest(), digest.count); + // only return new hash for merkle tree in case digest was updated - see CASSANDRA-8979 + if (digest.count > 0) + { - return new MerkleTree.RowHash(row.key.token, digest.digest(), digest.count); ++ return new MerkleTree.RowHash(row.key.getToken(), digest.digest(), digest.count); + } + else + { + return null; + } } /**