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 <berenguerbl...@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-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org