Digest will now always updated for non-empty rows Also reverted PreCompactedRow.
Another follow up on CASSANDRA-8979 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/2e6492a1 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/2e6492a1 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/2e6492a1 Branch: refs/heads/trunk Commit: 2e6492a1839040d5b417ab934490c453c92896d7 Parents: c8ab96d Author: Stefan Podkowinski <[email protected]> Authored: Thu Apr 2 12:21:20 2015 +0200 Committer: Yuki Morishita <[email protected]> Committed: Fri Apr 3 08:21:05 2015 -0500 ---------------------------------------------------------------------- .../db/compaction/LazilyCompactedRow.java | 9 +++++++-- .../db/compaction/PrecompactedRow.java | 21 ++++++++------------ 2 files changed, 15 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/2e6492a1/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java b/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java index b562ba5..9962d3f 100644 --- a/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java +++ b/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java @@ -134,6 +134,9 @@ public class LazilyCompactedRow extends AbstractCompactedRow implements Iterable { assert !closed; + // create merge iterator for reduced rows + Iterator<OnDiskAtom> iter = iterator(); + // no special-case for rows.size == 1, we're actually skipping some bytes here so just // blindly updating everything wouldn't be correct DataOutputBuffer out = new DataOutputBuffer(); @@ -142,7 +145,10 @@ public class LazilyCompactedRow extends AbstractCompactedRow implements Iterable { DeletionTime.serializer.serialize(emptyColumnFamily.deletionInfo().getTopLevelDeletion(), out); // do not update digest in case of missing or purged row level tombstones, see CASSANDRA-8979 - if (emptyColumnFamily.deletionInfo().getTopLevelDeletion() != DeletionTime.LIVE) + // - digest for non-empty rows needs to be updated with deletion in any case to match digest with versions before patch + // - empty rows must not update digest in case of LIVE delete status to avoid mismatches with non-existing rows + // this will however introduce in return a digest mismatch for versions before patch (which would update digest in any case) + if (iter.hasNext() || emptyColumnFamily.deletionInfo().getTopLevelDeletion() != DeletionTime.LIVE) { digest.update(out.getData(), 0, out.getLength()); } @@ -154,7 +160,6 @@ public class LazilyCompactedRow extends AbstractCompactedRow implements Iterable // initialize indexBuilder for the benefit of its tombstoneTracker, used by our reducing iterator indexBuilder = new ColumnIndex.Builder(emptyColumnFamily, key.key, out); - Iterator<OnDiskAtom> iter = iterator(); while (iter.hasNext()) iter.next().updateDigest(digest); close(); http://git-wip-us.apache.org/repos/asf/cassandra/blob/2e6492a1/src/java/org/apache/cassandra/db/compaction/PrecompactedRow.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/compaction/PrecompactedRow.java b/src/java/org/apache/cassandra/db/compaction/PrecompactedRow.java index f41e073..db72847 100644 --- a/src/java/org/apache/cassandra/db/compaction/PrecompactedRow.java +++ b/src/java/org/apache/cassandra/db/compaction/PrecompactedRow.java @@ -157,20 +157,15 @@ public class PrecompactedRow extends AbstractCompactedRow if (compactedCf == null) return; - // do not update digest in case of missing or purged row level tombstones, see CASSANDRA-8979 - if (compactedCf.deletionInfo().getTopLevelDeletion() != DeletionTime.LIVE) + DataOutputBuffer buffer = new DataOutputBuffer(); + try { - DataOutputBuffer buffer = new DataOutputBuffer(); - try - { - DeletionTime.serializer.serialize(compactedCf.deletionInfo().getTopLevelDeletion(), buffer); - - digest.update(buffer.getData(), 0, buffer.getLength()); - } - catch (IOException e) - { - throw new RuntimeException(e); - } + DeletionTime.serializer.serialize(compactedCf.deletionInfo().getTopLevelDeletion(), buffer); + digest.update(buffer.getData(), 0, buffer.getLength()); + } + catch (IOException e) + { + throw new RuntimeException(e); } compactedCf.updateDigest(digest); }
