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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]