This is an automated email from the ASF dual-hosted git repository. mck pushed a commit to branch cassandra-2.2 in repository https://gitbox.apache.org/repos/asf/cassandra.git
The following commit(s) were added to refs/heads/cassandra-2.2 by this push: new ae326ee Fix Commit log replays when static column clustering keys are collections ae326ee is described below commit ae326eed2aa8f9c761fc7a0a872ce8172fde2f0f Author: Vincent White <vi...@instaclustr.com> AuthorDate: Thu Apr 5 04:23:28 2018 +0000 Fix Commit log replays when static column clustering keys are collections patch by Vincent White; reviewed by Mick Semb Wever for CASSANDRA-14365 --- CHANGES.txt | 1 + .../cassandra/serializers/MapSerializer.java | 6 ++- .../cassandra/serializers/SetSerializer.java | 4 ++ .../cassandra/db/commitlog/CommitLogTest.java | 47 +++++++++++++++++++++- 4 files changed, 56 insertions(+), 2 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 44b4abe..246627b 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 2.2.17 + * Fix Commit log replays when static column clustering keys are collections (CASSANDRA-14365) * Fix Red Hat init script on newer systemd versions (CASSANDRA-15273) * Allow EXTRA_CLASSPATH to work on tar/source installations (CASSANDRA-15567) diff --git a/src/java/org/apache/cassandra/serializers/MapSerializer.java b/src/java/org/apache/cassandra/serializers/MapSerializer.java index 66831a3..70cd944 100644 --- a/src/java/org/apache/cassandra/serializers/MapSerializer.java +++ b/src/java/org/apache/cassandra/serializers/MapSerializer.java @@ -72,6 +72,10 @@ public class MapSerializer<K, V> extends CollectionSerializer<Map<K, V>> { try { + if (bytes.remaining() == 0) + { + return; + } ByteBuffer input = bytes.duplicate(); int n = readCollectionSize(input, version); for (int i = 0; i < n; i++) @@ -84,7 +88,7 @@ public class MapSerializer<K, V> extends CollectionSerializer<Map<K, V>> } catch (BufferUnderflowException e) { - throw new MarshalException("Not enough bytes to read a set"); + throw new MarshalException("Not enough bytes to read a map"); } } diff --git a/src/java/org/apache/cassandra/serializers/SetSerializer.java b/src/java/org/apache/cassandra/serializers/SetSerializer.java index 4aaf36a..0ed14d3 100644 --- a/src/java/org/apache/cassandra/serializers/SetSerializer.java +++ b/src/java/org/apache/cassandra/serializers/SetSerializer.java @@ -62,6 +62,10 @@ public class SetSerializer<T> extends CollectionSerializer<Set<T>> { try { + if (bytes.remaining() == 0) + { + return; + } ByteBuffer input = bytes.duplicate(); int n = readCollectionSize(input, version); for (int i = 0; i < n; i++) diff --git a/test/unit/org/apache/cassandra/db/commitlog/CommitLogTest.java b/test/unit/org/apache/cassandra/db/commitlog/CommitLogTest.java index 9b63885..c883cbd 100644 --- a/test/unit/org/apache/cassandra/db/commitlog/CommitLogTest.java +++ b/test/unit/org/apache/cassandra/db/commitlog/CommitLogTest.java @@ -39,14 +39,18 @@ import org.junit.runners.Parameterized.Parameters; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.config.ParameterizedClass; +import org.apache.cassandra.config.Schema; +import org.apache.cassandra.cql3.ColumnIdentifier; import org.apache.cassandra.db.*; import org.apache.cassandra.db.commitlog.CommitLogReplayer.CommitLogReplayException; import org.apache.cassandra.db.compaction.CompactionManager; import org.apache.cassandra.db.composites.CellName; import org.apache.cassandra.db.composites.CellNameType; +import org.apache.cassandra.db.composites.CellNames; import org.apache.cassandra.db.filter.NamesQueryFilter; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.compress.DeflateCompressor; @@ -65,6 +69,7 @@ public class CommitLogTest private static final String KEYSPACE2 = "CommitLogTestNonDurable"; private static final String CF1 = "Standard1"; private static final String CF2 = "Standard2"; + private static final String CF3 = "Custom1"; public CommitLogTest(ParameterizedClass commitLogCompression) { @@ -91,11 +96,19 @@ public class CommitLogTest public static void defineSchema() throws ConfigurationException { SchemaLoader.prepareServer(); + CFMetaData custom = CFMetaData.compile(String.format("CREATE TABLE \"%s\" (" + + "k int," + + "c1 frozen<map<text, text>>," + + "c2 frozen<set<text>>," + + "s int static," + + "PRIMARY KEY (k, c1, c2)" + + ");", CF3),KEYSPACE1); SchemaLoader.createKeyspace(KEYSPACE1, SimpleStrategy.class, KSMetaData.optsWithRF(1), SchemaLoader.standardCFMD(KEYSPACE1, CF1), - SchemaLoader.standardCFMD(KEYSPACE1, CF2)); + SchemaLoader.standardCFMD(KEYSPACE1, CF2), + custom); SchemaLoader.createKeyspace(KEYSPACE2, false, true, @@ -103,6 +116,7 @@ public class CommitLogTest KSMetaData.optsWithRF(1), SchemaLoader.standardCFMD(KEYSPACE1, CF1), SchemaLoader.standardCFMD(KEYSPACE1, CF2)); + CompactionManager.instance.disableAutoCompaction(); } @@ -497,4 +511,35 @@ public class CommitLogTest row = command.getRow(notDurableKs); Assert.assertEquals(null, row.cf); } + + @Test + public void testRecoveryWithCollectionClusteringKeysStatic() throws Exception + { + Mutation rm = new Mutation(KEYSPACE1, bytes(0)); + + CFMetaData cfm = Schema.instance.getCFMetaData(KEYSPACE1,CF3); + + int clusterSize = cfm.comparator.clusteringPrefixSize(); + ByteBuffer[] elements = new ByteBuffer[clusterSize]; + for (int i = 0; i < clusterSize; i++) + elements[i] = ByteBufferUtil.EMPTY_BYTE_BUFFER; + + rm.add(CF3, CellNames.compositeSparse(elements, new ColumnIdentifier("s", true), true), bytes(1), 0); + + CommitLog.instance.add(rm); + int replayed = 0; + + try + { + System.setProperty(CommitLogReplayer.IGNORE_REPLAY_ERRORS_PROPERTY, "true"); + replayed = CommitLog.instance.resetUnsafe(false); + } + finally + { + System.clearProperty(CommitLogReplayer.IGNORE_REPLAY_ERRORS_PROPERTY); + } + + Assert.assertEquals(replayed, 1); + + } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org