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]

Reply via email to