Ignore empty Counter cells on digest calculation. patch by Francisco Fernández Castaño; reviewed by Sylvain Lebresne for CASSANDRA-14167
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/93012e43 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/93012e43 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/93012e43 Branch: refs/heads/trunk Commit: 93012e43ea03411456c20e7cec1ede73ff46b7d2 Parents: c498258 Author: Fransisco Fernandez Castano <francisco.cast...@datastax.com> Authored: Sun Apr 22 13:08:26 2018 +0200 Committer: Sylvain Lebresne <lebre...@gmail.com> Committed: Wed Jul 4 11:50:41 2018 +0200 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../cassandra/db/context/CounterContext.java | 3 +++ .../apache/cassandra/db/CounterCellTest.java | 23 ++++++++++++++++++++ 3 files changed, 27 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/93012e43/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index ee95718..00944dc 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0.17 + * Fix potential IndexOutOfBoundsException with counters (CASSANDRA-14167) * Restore resumable hints delivery, backport CASSANDRA-11960 (CASSANDRA-14419) * Always close RT markers returned by ReadCommand#executeLocally() (CASSANDRA-14515) * Reverse order queries with range tombstones can cause data loss (CASSANDRA-14513) http://git-wip-us.apache.org/repos/asf/cassandra/blob/93012e43/src/java/org/apache/cassandra/db/context/CounterContext.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/context/CounterContext.java b/src/java/org/apache/cassandra/db/context/CounterContext.java index 29e5cfc..b402464 100644 --- a/src/java/org/apache/cassandra/db/context/CounterContext.java +++ b/src/java/org/apache/cassandra/db/context/CounterContext.java @@ -692,6 +692,9 @@ public class CounterContext */ public void updateDigest(MessageDigest message, ByteBuffer context) { + // context can be empty due to the optimization from CASSANDRA-10657 + if (!context.hasRemaining()) + return; ByteBuffer dup = context.duplicate(); dup.position(context.position() + headerLength(context)); message.update(dup); http://git-wip-us.apache.org/repos/asf/cassandra/blob/93012e43/test/unit/org/apache/cassandra/db/CounterCellTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/db/CounterCellTest.java b/test/unit/org/apache/cassandra/db/CounterCellTest.java index a8ddfcc..8859fc6 100644 --- a/test/unit/org/apache/cassandra/db/CounterCellTest.java +++ b/test/unit/org/apache/cassandra/db/CounterCellTest.java @@ -29,13 +29,16 @@ import org.junit.Test; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.config.ColumnDefinition; +import org.apache.cassandra.db.rows.BTreeRow; import org.apache.cassandra.db.rows.BufferCell; import org.apache.cassandra.db.rows.Cell; import org.apache.cassandra.db.rows.CellPath; import org.apache.cassandra.db.rows.Cells; import org.apache.cassandra.db.context.CounterContext; +import org.apache.cassandra.db.rows.Row; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.schema.KeyspaceParams; +import org.apache.cassandra.serializers.AsciiSerializer; import org.apache.cassandra.utils.*; import static org.junit.Assert.*; @@ -281,4 +284,24 @@ public class CounterCellTest assert Arrays.equals(digest1.digest(), digest2.digest()); } + + @Test + public void testDigestWithEmptyCells() throws Exception + { + // For DB-1881 + ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore(COUNTER1); + + ColumnDefinition emptyColDef = cfs.metadata.getColumnDefinition(ByteBufferUtil.bytes("val2")); + BufferCell emptyCell = BufferCell.live(emptyColDef, 0, ByteBuffer.allocate(0)); + + Row.Builder builder = BTreeRow.unsortedBuilder(0); + builder.newRow(Clustering.make(AsciiSerializer.instance.serialize("test"))); + builder.addCell(emptyCell); + Row row = builder.build(); + + MessageDigest digest = MessageDigest.getInstance("md5"); + row.digest(digest); + assertNotNull(digest.digest()); + } + } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org