You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by be...@apache.org on 2022/07/11 07:51:16 UTC

[cassandra] branch cassandra-4.1 updated: Fix flaky test - org.apache.cassandra.cql3.validation.operations.InsertUpdateIfConditionTest.testConditionalUpdate

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

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


The following commit(s) were added to refs/heads/cassandra-4.1 by this push:
     new 1d80dd0086 Fix flaky test - org.apache.cassandra.cql3.validation.operations.InsertUpdateIfConditionTest.testConditionalUpdate
1d80dd0086 is described below

commit 1d80dd008677e0084b1530295207a568853badee
Author: Bereng <be...@gmail.com>
AuthorDate: Thu Jun 9 08:53:01 2022 +0200

    Fix flaky test - org.apache.cassandra.cql3.validation.operations.InsertUpdateIfConditionTest.testConditionalUpdate
    
    patch by Berenguer Blasi; reviewed by Benjamin Lerer for CASSANDRA-17653
---
 src/java/org/apache/cassandra/gms/Gossiper.java     | 13 +++++++++++--
 .../cassandra/utils/ExpiringMemoizingSupplier.java  |  5 ++---
 .../operations/InsertUpdateIfConditionTest.java     | 21 +++++++++++++++++----
 3 files changed, 30 insertions(+), 9 deletions(-)

diff --git a/src/java/org/apache/cassandra/gms/Gossiper.java b/src/java/org/apache/cassandra/gms/Gossiper.java
index 4c72166a9d..4a46ca3040 100644
--- a/src/java/org/apache/cassandra/gms/Gossiper.java
+++ b/src/java/org/apache/cassandra/gms/Gossiper.java
@@ -2356,12 +2356,21 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean
      * Returns {@code true} if there are nodes on version lower than the provided version
      */
     public boolean isUpgradingFromVersionLowerThan(CassandraVersion referenceVersion)
+    {
+        return isUpgradingFromVersionLowerThanC17653(referenceVersion).left;
+    }
+
+    /* TODO: Aux method for debug purposes on fixing C17653. To be removed*/
+    @VisibleForTesting
+    public Pair<Boolean, CassandraVersion> isUpgradingFromVersionLowerThanC17653(CassandraVersion referenceVersion)
     {
         CassandraVersion v = upgradeFromVersionMemoized.get();
         if (CassandraVersion.NULL_VERSION.equals(v) && scheduledGossipTask == null)
-            return false;
+            return Pair.create(false, v);
+
+        boolean res = v != null && v.compareTo(referenceVersion) < 0;
 
-        return v != null && v.compareTo(referenceVersion) < 0;
+        return Pair.create(res, v);
     }
 
     private boolean nodesAgreeOnSchema(Collection<InetAddressAndPort> nodes)
diff --git a/src/java/org/apache/cassandra/utils/ExpiringMemoizingSupplier.java b/src/java/org/apache/cassandra/utils/ExpiringMemoizingSupplier.java
index 2cba64dcb0..02aa09d498 100644
--- a/src/java/org/apache/cassandra/utils/ExpiringMemoizingSupplier.java
+++ b/src/java/org/apache/cassandra/utils/ExpiringMemoizingSupplier.java
@@ -71,8 +71,7 @@ public class ExpiringMemoizingSupplier<T> implements Supplier<T>
                     else
                         return t.value();
 
-                    nanos = now + this.durationNanos;
-                    this.expirationNanos = nanos == 0L ? 1L : nanos;
+                    this.expirationNanos = now + this.durationNanos;
                     return t.value();
                 }
             }
@@ -81,7 +80,7 @@ public class ExpiringMemoizingSupplier<T> implements Supplier<T>
     }
 
     @VisibleForTesting
-    public void expire()
+    public synchronized void expire()
     {
         this.expirationNanos = 0;
     }
diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/InsertUpdateIfConditionTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/InsertUpdateIfConditionTest.java
index 627075f9de..20acd10ff1 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/operations/InsertUpdateIfConditionTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/operations/InsertUpdateIfConditionTest.java
@@ -21,6 +21,8 @@ package org.apache.cassandra.cql3.validation.operations;
 import java.util.Arrays;
 import java.util.Collection;
 
+import com.google.common.annotations.VisibleForTesting;
+
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -36,6 +38,7 @@ import org.apache.cassandra.gms.Gossiper;
 import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.schema.SchemaKeyspaceTables;
 import org.apache.cassandra.utils.CassandraVersion;
+import org.apache.cassandra.utils.Pair;
 
 import static java.lang.String.format;
 import static org.junit.Assert.assertEquals;
@@ -61,14 +64,18 @@ public class InsertUpdateIfConditionTest extends CQLTester
     public static Collection<Object[]> data()
     {
         return Arrays.asList(new Object[]{ "3.0", (Runnable) () -> {
-                                 assertTrue(Gossiper.instance.isUpgradingFromVersionLowerThan(new CassandraVersion("3.11")));
+                                 Pair<Boolean, CassandraVersion> res = Gossiper.instance.isUpgradingFromVersionLowerThanC17653(new CassandraVersion("3.11"));
+                                 assertTrue(debugMsgCASSANDRA17653(res), res.left);
                              } },
                              new Object[]{ "3.11", (Runnable) () -> {
-                                 assertTrue(Gossiper.instance.isUpgradingFromVersionLowerThan(SystemKeyspace.CURRENT_VERSION));
-                                 assertFalse(Gossiper.instance.isUpgradingFromVersionLowerThan(new CassandraVersion("3.11")));
+                                 Pair<Boolean, CassandraVersion> res = Gossiper.instance.isUpgradingFromVersionLowerThanC17653(SystemKeyspace.CURRENT_VERSION);
+                                 assertTrue(debugMsgCASSANDRA17653(res), res.left);
+                                 res = Gossiper.instance.isUpgradingFromVersionLowerThanC17653(new CassandraVersion("3.11"));
+                                 assertFalse(debugMsgCASSANDRA17653(res), res.left);
                              } },
                              new Object[]{ SystemKeyspace.CURRENT_VERSION.toString(), (Runnable) () -> {
-                                 assertFalse(Gossiper.instance.isUpgradingFromVersionLowerThan(SystemKeyspace.CURRENT_VERSION));
+                                 Pair<Boolean, CassandraVersion> res = Gossiper.instance.isUpgradingFromVersionLowerThanC17653(SystemKeyspace.CURRENT_VERSION);
+                                 assertFalse(debugMsgCASSANDRA17653(res), res.left);
                              } });
     }
 
@@ -959,4 +966,10 @@ public class InsertUpdateIfConditionTest extends CQLTester
 
         assertRows(execute("SELECT * FROM %s WHERE k = 1"), row(1, Duration.from("10s"), 6));
     }
+
+    // Helper to debug on the next occurrence of CASSANDRA-17653
+    private static String debugMsgCASSANDRA17653(Pair<Boolean, CassandraVersion> res)
+    {
+        return("Failed on Cass Version: " + res.right == null ? "null" : res.right + " boolean:" + res.left);
+    }
 }


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