This is an automated email from the ASF dual-hosted git repository.

marcuse pushed a commit to branch cassandra-3.0
in repository https://gitbox.apache.org/repos/asf/cassandra.git


The following commit(s) were added to refs/heads/cassandra-3.0 by this push:
     new f0aa60b  Avoid over-trimming of results in mixed mode clusters
f0aa60b is described below

commit f0aa60bec728fbdb9ee7455d2d6d2f6feb183330
Author: Marcus Eriksson <marc...@apache.org>
AuthorDate: Thu Nov 7 08:02:09 2019 +0100

    Avoid over-trimming of results in mixed mode clusters
    
    Patch by marcuse; reviewed by Aleksey Yeschenko and Sam Tunnicliffe for 
CASSANDRA-15405
---
 CHANGES.txt                                        |  1 +
 src/java/org/apache/cassandra/db/LegacyLayout.java | 27 ++++++++++++---
 .../cassandra/distributed/upgrade/UpgradeTest.java | 38 ++++++++++++++++++++++
 3 files changed, 62 insertions(+), 4 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index 08e95ed..547bb1a 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 3.0.20
+ * Avoid over-trimming of results in mixed mode clusters (CASSANDRA-15405)
  * validate value sizes in LegacyLayout (CASSANDRA-15373)
  * Ensure that tracing doesn't break connections in 3.x/4.0 mixed mode by 
default (CASSANDRA-15385)
  * Make sure index summary redistribution does not start when compactions are 
paused (CASSANDRA-15265)
diff --git a/src/java/org/apache/cassandra/db/LegacyLayout.java 
b/src/java/org/apache/cassandra/db/LegacyLayout.java
index c2d715d..42d50a1 100644
--- a/src/java/org/apache/cassandra/db/LegacyLayout.java
+++ b/src/java/org/apache/cassandra/db/LegacyLayout.java
@@ -487,7 +487,7 @@ public abstract class LegacyLayout
      * post-query limitation are in order (see above). This will be {@code 
Integer.MAX_VALUE} if no such limits are
      * necessary.
      */
-    private static int maxCellsPerPartition(ReadCommand command)
+    private static int maxLiveCellsPerPartition(ReadCommand command)
     {
         if (command == null)
             return Integer.MAX_VALUE;
@@ -525,9 +525,8 @@ public abstract class LegacyLayout
         // before we use the LegacyRangeTombstoneList at all
         List<LegacyLayout.LegacyCell> cells = Lists.newArrayList(pair.right);
 
-        int maxCellsPerPartition = maxCellsPerPartition(command);
-        if (cells.size() > maxCellsPerPartition)
-            cells = cells.subList(0, maxCellsPerPartition);
+        int maxCellsPerPartition = maxLiveCellsPerPartition(command);
+        cells = maybeTrimLiveCells(cells, maxCellsPerPartition, command);
 
         // The LegacyRangeTombstoneList already has range tombstones for the 
single-row deletions and complex
         // deletions.  Go through our normal range tombstones and add then to 
the LegacyRTL so that the range
@@ -548,6 +547,26 @@ public abstract class LegacyLayout
         return new LegacyUnfilteredPartition(info.getPartitionDeletion(), rtl, 
cells);
     }
 
+    private static List<LegacyCell> maybeTrimLiveCells(List<LegacyCell> cells, 
int maxLiveCells, ReadCommand command)
+    {
+        if (null == command || maxLiveCells >= cells.size())
+            return cells;
+
+        int nowInSec = command.nowInSec();
+        int live = 0;
+        int dead = 0;
+
+        for (int i = 0; i < cells.size() && live < maxLiveCells; i++)
+        {
+            if (cells.get(i).isLive(nowInSec))
+                live++;
+            else
+                dead++;
+        }
+
+        return cells.subList(0, live + dead);
+    }
+
     public static void serializeAsLegacyPartition(ReadCommand command, 
UnfilteredRowIterator partition, DataOutputPlus out, int version) throws 
IOException
     {
         assert version < MessagingService.VERSION_30;
diff --git 
a/test/distributed/org/apache/cassandra/distributed/upgrade/UpgradeTest.java 
b/test/distributed/org/apache/cassandra/distributed/upgrade/UpgradeTest.java
index 2c7f7bc..5a927fc 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/UpgradeTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/UpgradeTest.java
@@ -18,12 +18,17 @@
 
 package org.apache.cassandra.distributed.upgrade;
 
+import java.util.Iterator;
+
+import com.google.common.collect.Iterators;
 import org.junit.Test;
 
 import org.apache.cassandra.db.ConsistencyLevel;
 import org.apache.cassandra.distributed.impl.Versions;
 import org.apache.cassandra.distributed.test.DistributedTestBase;
 
+import static junit.framework.Assert.assertEquals;
+
 public class UpgradeTest extends UpgradeTestBase
 {
 
@@ -49,4 +54,37 @@ public class UpgradeTest extends UpgradeTestBase
             }).run();
     }
 
+    @Test
+    public void mixedModePagingTest() throws Throwable
+    {
+        new TestCase()
+        .upgrade(Versions.Major.v22, Versions.Major.v30)
+        .nodes(2)
+        .nodesToUpgrade(2)
+        .setup((cluster) -> {
+            cluster.schemaChange("ALTER KEYSPACE " + 
DistributedTestBase.KEYSPACE + " WITH replication = {'class': 'SimpleStrategy', 
'replication_factor': 1}");
+            cluster.schemaChange("CREATE TABLE " + 
DistributedTestBase.KEYSPACE + ".tbl (pk int, ck int, v int, PRIMARY KEY (pk, 
ck)) with compact storage");
+            for (int i = 0; i < 100; i++)
+                for (int j = 0; j < 200; j++)
+                    cluster.coordinator(2).execute("INSERT INTO " + 
DistributedTestBase.KEYSPACE + ".tbl (pk, ck, v) VALUES (?, ?, 1)", 
ConsistencyLevel.ALL, i, j);
+            cluster.forEach((i) -> i.flush(DistributedTestBase.KEYSPACE));
+            for (int i = 0; i < 100; i++)
+                for (int j = 10; j < 30; j++)
+                    cluster.coordinator(2).execute("DELETE FROM " + 
DistributedTestBase.KEYSPACE + ".tbl where pk=? and ck=?", 
ConsistencyLevel.ALL, i, j);
+            cluster.forEach((i) -> i.flush(DistributedTestBase.KEYSPACE));
+        })
+        .runAfterClusterUpgrade((cluster) -> {
+            for (int i = 0; i < 100; i++)
+            {
+                for (int pageSize = 10; pageSize < 100; pageSize++)
+                {
+                    Iterator<Object[]> res = 
cluster.coordinator(1).executeWithPaging("SELECT * FROM " + 
DistributedTestBase.KEYSPACE + ".tbl WHERE pk = ?",
+                                                                               
       ConsistencyLevel.ALL,
+                                                                               
       pageSize, i);
+                    assertEquals(180, Iterators.size(res));
+                }
+            }
+        }).run();
+    }
+
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org
For additional commands, e-mail: commits-h...@cassandra.apache.org

Reply via email to