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

Reply via email to