From 95cf9a5f0d5c437a9e042018eadc698e3fd5f9e0 Mon Sep 17 00:00:00 2001 From: Jonathan Ellis Date: Thu, 9 May 2013 17:38:23 -0500 Subject: [PATCH] fix 2i updates with indentical values and timestamps patch by Sam Tunnicliffe; reviewed by jbellis for CASSANDRA-5540 --- CHANGES.txt | 1 + .../apache/cassandra/db/compaction/LazilyCompactedRow.java | 2 +- .../apache/cassandra/db/compaction/PrecompactedRow.java | 2 +- .../apache/cassandra/db/index/SecondaryIndexManager.java | 7 ++++++- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index ca3f130f12f3..dfe30152c702 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 1.2.5 + * fix 2i updates with indentical values and timestamps (CASSANDRA-5540) * fix compaction throttling bursty-ness (CASSANDRA-4316) * reduce memory consumption of IndexSummary (CASSANDRA-5506) * remove per-row column name bloom filters (CASSANDRA-5492) diff --git a/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java b/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java index 48b5b7d2ee60..1433add0a691 100644 --- a/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java +++ b/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java @@ -256,7 +256,7 @@ public void reduce(OnDiskAtom current) container.addColumn(column); if (indexer != SecondaryIndexManager.nullUpdater && !column.isMarkedForDelete() - && container.getColumn(column.name()) != column) + && !container.getColumn(column.name()).equals(column)) { indexer.remove(column); } diff --git a/src/java/org/apache/cassandra/db/compaction/PrecompactedRow.java b/src/java/org/apache/cassandra/db/compaction/PrecompactedRow.java index 34ddb88917ce..b1f639e639be 100644 --- a/src/java/org/apache/cassandra/db/compaction/PrecompactedRow.java +++ b/src/java/org/apache/cassandra/db/compaction/PrecompactedRow.java @@ -141,7 +141,7 @@ public void reduce(IColumn column) container.addColumn(column); if (indexer != SecondaryIndexManager.nullUpdater && !column.isMarkedForDelete() - && container.getColumn(column.name()) != column) + && !container.getColumn(column.name()).equals(column)) { indexer.remove(column); } diff --git a/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java b/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java index 3b27614d4ce8..2f035158aef9 100644 --- a/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java +++ b/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java @@ -616,15 +616,20 @@ public void insert(IColumn column) public void update(IColumn oldColumn, IColumn column) { + if (oldColumn.equals(column)) + return; + SecondaryIndex index = indexFor(column.name()); if (index == null) return; if (index instanceof PerColumnSecondaryIndex) { - ((PerColumnSecondaryIndex) index).delete(key.key, oldColumn); + // insert the new value before removing the old one, so we never have a period + // where the row is invisible to both queries (the opposite seems preferable); see CASSANDRA-5540 if (!column.isMarkedForDelete()) ((PerColumnSecondaryIndex) index).insert(key.key, column); + ((PerColumnSecondaryIndex) index).delete(key.key, oldColumn); } }