This is an automated email from the ASF dual-hosted git repository.
brandonwilliams pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git
The following commit(s) were added to refs/heads/trunk by this push:
new 2344e77 Fixed race condition in MoveTest by waiting for stale
endpoints to be evicted from membership before starting another test.
2344e77 is described below
commit 2344e77c026f1ecfed4f9ba84dab21ede2cf5b26
Author: Gianluca Righetto <[email protected]>
AuthorDate: Thu Apr 9 18:55:10 2020 -0300
Fixed race condition in MoveTest by waiting for stale endpoints to be
evicted from membership before starting another test.
Patch by Gianluca Righetto, reviewed by brandonwilliams for CASSANDRA-15551.
---
.../org/apache/cassandra/service/MoveTest.java | 36 +++++++++++++++++++++-
1 file changed, 35 insertions(+), 1 deletion(-)
diff --git a/test/unit/org/apache/cassandra/service/MoveTest.java
b/test/unit/org/apache/cassandra/service/MoveTest.java
index a4da7b8..9777602 100644
--- a/test/unit/org/apache/cassandra/service/MoveTest.java
+++ b/test/unit/org/apache/cassandra/service/MoveTest.java
@@ -21,10 +21,18 @@ package org.apache.cassandra.service;
import java.net.UnknownHostException;
import java.util.*;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Condition;
+import java.util.function.Consumer;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Multimap;
+
+import org.apache.cassandra.config.OverrideConfigurationLoader;
+import org.apache.cassandra.diag.DiagnosticEventService;
+import org.apache.cassandra.gms.GossiperEvent;
import org.apache.cassandra.locator.EndpointsForRange;
import org.apache.cassandra.locator.EndpointsForToken;
import org.apache.cassandra.locator.RangesAtEndpoint;
@@ -32,7 +40,11 @@ import org.apache.cassandra.locator.RangesByEndpoint;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.rules.TestWatcher;
+import org.junit.runner.Description;
import org.apache.cassandra.locator.InetAddressAndPort;
import org.apache.cassandra.locator.Replica;
@@ -99,6 +111,7 @@ public class MoveTest
addNetworkTopologyKeyspace(Network_11_KeyspaceName, 1, 1);
addNetworkTopologyKeyspace(Network_22_KeyspaceName, 2, 2);
addNetworkTopologyKeyspace(Network_33_KeyspaceName, 3, 3);
+ DatabaseDescriptor.setDiagnosticEventsEnabled(true);
}
@AfterClass
@@ -108,10 +121,31 @@ public class MoveTest
}
@Before
- public void clearTokenMetadata()
+ public void clearTokenMetadata() throws InterruptedException
{
+ // we expect to have a single endpoint before running each test method,
+ // so we have to wait for the GossipStage thread to evict stale
endpoints
+ // from membership before moving on, otherwise it may break other
tests as
+ // things change in the background
+ final int endpointCount = Gossiper.instance.getEndpointCount() - 1;
+ final CountDownLatch latch = new CountDownLatch(endpointCount);
+ Consumer onEndpointEvicted = event -> latch.countDown();
+ DiagnosticEventService.instance().subscribe(GossiperEvent.class,
+
GossiperEvent.GossiperEventType.EVICTED_FROM_MEMBERSHIP,
+ onEndpointEvicted);
+
PendingRangeCalculatorService.instance.blockUntilFinished();
StorageService.instance.getTokenMetadata().clearUnsafe();
+
+ try
+ {
+ if (!latch.await(1, TimeUnit.MINUTES))
+ throw new RuntimeException("Took too long to evict stale
endpoints.");
+ }
+ finally
+ {
+ DiagnosticEventService.instance().unsubscribe(onEndpointEvicted);
+ }
}
private static void addNetworkTopologyKeyspace(String keyspaceName,
Integer... replicas) throws Exception
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]