This is an automated email from the ASF dual-hosted git repository. brandonwilliams pushed a commit to branch CASSANDRA-16588-trunk in repository https://gitbox.apache.org/repos/asf/cassandra.git
commit d80340302cec9a320c2e4da2c934d85efa009ac4 Author: Brandon Williams <[email protected]> AuthorDate: Fri Apr 16 14:13:26 2021 -0500 Update tests --- .../org/apache/cassandra/gms/ShadowRoundTest.java | 70 ++++++++++++++++++++-- 1 file changed, 65 insertions(+), 5 deletions(-) diff --git a/test/unit/org/apache/cassandra/gms/ShadowRoundTest.java b/test/unit/org/apache/cassandra/gms/ShadowRoundTest.java index f5d436f..7dcf3bc 100644 --- a/test/unit/org/apache/cassandra/gms/ShadowRoundTest.java +++ b/test/unit/org/apache/cassandra/gms/ShadowRoundTest.java @@ -19,7 +19,12 @@ package org.apache.cassandra.gms; +import java.net.UnknownHostException; +import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; import org.junit.After; @@ -34,6 +39,7 @@ import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.db.commitlog.CommitLog; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.locator.IEndpointSnitch; +import org.apache.cassandra.locator.InetAddressAndPort; import org.apache.cassandra.locator.PropertyFileSnitch; import org.apache.cassandra.net.Message; import org.apache.cassandra.net.MockMessagingService; @@ -132,14 +138,31 @@ public class ShadowRoundTest { while (!Gossiper.instance.isEnabled()) ; } + InetAddressAndPort junkaddr; + try + { + junkaddr = InetAddressAndPort.getByName("1.1.1.1"); + } + catch (UnknownHostException e) + { + throw new RuntimeException(e); + } HeartBeatState hb = new HeartBeatState(123, 456); EndpointState state = new EndpointState(hb); - GossipDigestAck payload = new GossipDigestAck( - Collections.singletonList(new GossipDigest(FBUtilities.getBroadcastAddressAndPort(), hb.getGeneration(), hb.getHeartBeatVersion())), - Collections.singletonMap(FBUtilities.getBroadcastAddressAndPort(), state)); - - logger.warn("Simulating bad digest ACK reply"); + List<GossipDigest> gDigests = new ArrayList<GossipDigest>(); + gDigests.add(new GossipDigest(FBUtilities.getBroadcastAddressAndPort(), hb.getGeneration(), hb.getHeartBeatVersion())); + gDigests.add(new GossipDigest(junkaddr, hb.getGeneration(), hb.getHeartBeatVersion())); + Map<InetAddressAndPort, EndpointState> smap = new HashMap<InetAddressAndPort, EndpointState>() + { + { + put(FBUtilities.getBroadcastAddressAndPort(), state); + put(junkaddr, state); + } + }; + GossipDigestAck payload = new GossipDigestAck(gDigests, smap); + + logger.debug("Simulating bad digest ACK reply"); return Message.builder(Verb.GOSSIP_DIGEST_ACK, payload) .from(to) .build(); @@ -157,4 +180,41 @@ public class ShadowRoundTest } } + @Test + public void testPreviouslyAssassinatedInShadow() + { + final AtomicBoolean ackSend = new AtomicBoolean(false); + MockMessagingSpy spySyn = MockMessagingService.when(verb(Verb.GOSSIP_DIGEST_SYN)) + .respondN((msgOut, to) -> + { + // ACK with self assassinated in shadow round + if (!ackSend.compareAndSet(false, true)) + { + while (!Gossiper.instance.isEnabled()) ; + } + HeartBeatState hb = new HeartBeatState(123, 456); + EndpointState state = new EndpointState(hb); + state.addApplicationState(ApplicationState.STATUS_WITH_PORT, VersionedValue.unsafeMakeVersionedValue(VersionedValue.STATUS_LEFT, 1)); + GossipDigestAck payload = new GossipDigestAck( + Collections.singletonList(new GossipDigest(FBUtilities.getBroadcastAddressAndPort(), hb.getGeneration(), hb.getHeartBeatVersion())), + Collections.singletonMap(FBUtilities.getBroadcastAddressAndPort(), state)); + + logger.debug("Simulating bad digest ACK reply"); + return Message.builder(Verb.GOSSIP_DIGEST_ACK, payload) + .from(to) + .build(); + }, 1); + + + System.setProperty(Config.PROPERTY_PREFIX + "auto_bootstrap", "false"); + try + { + StorageService.instance.initServer(); + } + catch (Exception e) + { + assertEquals("Unable to gossip with any peers", e.getMessage()); + } + } + } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
