You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by br...@apache.org on 2021/04/19 13:47:48 UTC
[cassandra] branch CASSANDRA-16588 created (now e4606a6)
This is an automated email from the ASF dual-hosted git repository.
brandonwilliams pushed a change to branch CASSANDRA-16588
in repository https://gitbox.apache.org/repos/asf/cassandra.git.
at e4606a6 Update testDelayedResponse
This branch includes the following new commits:
new 64a5fff Ignore stale ack in shadow
new de62276 Check for specific app states in shadow round
new 9937c8b Fix condition in shadow round check
new 5e91a45 HIGHRES config
new e68602a Filter out dead states from startup safety check
new a46407d Update tests
new e4606a6 Update testDelayedResponse
The 7 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org
[cassandra] 04/07: HIGHRES config
Posted by br...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
brandonwilliams pushed a commit to branch CASSANDRA-16588
in repository https://gitbox.apache.org/repos/asf/cassandra.git
commit 5e91a4536d2d43a865c94c74da16535810c6b8fb
Author: Sam Tunnicliffe <sa...@beobal.com>
AuthorDate: Thu Apr 15 12:10:07 2021 +0100
HIGHRES config
---
.circleci/config.yml | 80 ++++++++++++++++++++++++++--------------------------
1 file changed, 40 insertions(+), 40 deletions(-)
diff --git a/.circleci/config.yml b/.circleci/config.yml
index 53ee44c..a08f93f 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -3,10 +3,10 @@ jobs:
j8_jvm_upgrade_dtests:
docker:
- image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:20210304
- resource_class: medium
+ resource_class: xlarge
working_directory: ~/
shell: /bin/bash -eo pipefail -l
- parallelism: 1
+ parallelism: 2
steps:
- attach_workspace:
at: /home/cassandra
@@ -88,8 +88,8 @@ jobs:
- CASSANDRA_SKIP_SYNC: true
- DTEST_REPO: git://github.com/apache/cassandra-dtest.git
- DTEST_BRANCH: trunk
- - CCM_MAX_HEAP_SIZE: 1024M
- - CCM_HEAP_NEWSIZE: 256M
+ - CCM_MAX_HEAP_SIZE: 2048M
+ - CCM_HEAP_NEWSIZE: 512M
- JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
- JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
build:
@@ -169,17 +169,17 @@ jobs:
- CASSANDRA_SKIP_SYNC: true
- DTEST_REPO: git://github.com/apache/cassandra-dtest.git
- DTEST_BRANCH: trunk
- - CCM_MAX_HEAP_SIZE: 1024M
- - CCM_HEAP_NEWSIZE: 256M
+ - CCM_MAX_HEAP_SIZE: 2048M
+ - CCM_HEAP_NEWSIZE: 512M
- JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
- JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
j8_dtests-no-vnodes:
docker:
- image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:20210304
- resource_class: medium
+ resource_class: xlarge
working_directory: ~/
shell: /bin/bash -eo pipefail -l
- parallelism: 4
+ parallelism: 100
steps:
- attach_workspace:
at: /home/cassandra
@@ -227,17 +227,17 @@ jobs:
- CASSANDRA_SKIP_SYNC: true
- DTEST_REPO: git://github.com/apache/cassandra-dtest.git
- DTEST_BRANCH: trunk
- - CCM_MAX_HEAP_SIZE: 1024M
- - CCM_HEAP_NEWSIZE: 256M
+ - CCM_MAX_HEAP_SIZE: 2048M
+ - CCM_HEAP_NEWSIZE: 512M
- JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
- JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
j8_upgradetests-no-vnodes:
docker:
- image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:20210304
- resource_class: medium
+ resource_class: xlarge
working_directory: ~/
shell: /bin/bash -eo pipefail -l
- parallelism: 4
+ parallelism: 100
steps:
- attach_workspace:
at: /home/cassandra
@@ -326,14 +326,14 @@ jobs:
- CASSANDRA_SKIP_SYNC: true
- DTEST_REPO: git://github.com/apache/cassandra-dtest.git
- DTEST_BRANCH: trunk
- - CCM_MAX_HEAP_SIZE: 1024M
- - CCM_HEAP_NEWSIZE: 256M
+ - CCM_MAX_HEAP_SIZE: 2048M
+ - CCM_HEAP_NEWSIZE: 512M
- JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
- JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
utests_stress:
docker:
- image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:20210304
- resource_class: medium
+ resource_class: xlarge
working_directory: ~/
shell: /bin/bash -eo pipefail -l
parallelism: 1
@@ -372,17 +372,17 @@ jobs:
- CASSANDRA_SKIP_SYNC: true
- DTEST_REPO: git://github.com/apache/cassandra-dtest.git
- DTEST_BRANCH: trunk
- - CCM_MAX_HEAP_SIZE: 1024M
- - CCM_HEAP_NEWSIZE: 256M
+ - CCM_MAX_HEAP_SIZE: 2048M
+ - CCM_HEAP_NEWSIZE: 512M
- JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
- JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
j8_unit_tests:
docker:
- image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:20210304
- resource_class: medium
+ resource_class: xlarge
working_directory: ~/
shell: /bin/bash -eo pipefail -l
- parallelism: 4
+ parallelism: 100
steps:
- attach_workspace:
at: /home/cassandra
@@ -464,17 +464,17 @@ jobs:
- CASSANDRA_SKIP_SYNC: true
- DTEST_REPO: git://github.com/apache/cassandra-dtest.git
- DTEST_BRANCH: trunk
- - CCM_MAX_HEAP_SIZE: 1024M
- - CCM_HEAP_NEWSIZE: 256M
+ - CCM_MAX_HEAP_SIZE: 2048M
+ - CCM_HEAP_NEWSIZE: 512M
- JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
- JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
j8_dtests-with-vnodes:
docker:
- image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:20210304
- resource_class: medium
+ resource_class: xlarge
working_directory: ~/
shell: /bin/bash -eo pipefail -l
- parallelism: 4
+ parallelism: 100
steps:
- attach_workspace:
at: /home/cassandra
@@ -522,17 +522,17 @@ jobs:
- CASSANDRA_SKIP_SYNC: true
- DTEST_REPO: git://github.com/apache/cassandra-dtest.git
- DTEST_BRANCH: trunk
- - CCM_MAX_HEAP_SIZE: 1024M
- - CCM_HEAP_NEWSIZE: 256M
+ - CCM_MAX_HEAP_SIZE: 2048M
+ - CCM_HEAP_NEWSIZE: 512M
- JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
- JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
j8_jvm_dtests:
docker:
- image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:20210304
- resource_class: medium
+ resource_class: xlarge
working_directory: ~/
shell: /bin/bash -eo pipefail -l
- parallelism: 1
+ parallelism: 2
steps:
- attach_workspace:
at: /home/cassandra
@@ -614,14 +614,14 @@ jobs:
- CASSANDRA_SKIP_SYNC: true
- DTEST_REPO: git://github.com/apache/cassandra-dtest.git
- DTEST_BRANCH: trunk
- - CCM_MAX_HEAP_SIZE: 1024M
- - CCM_HEAP_NEWSIZE: 256M
+ - CCM_MAX_HEAP_SIZE: 2048M
+ - CCM_HEAP_NEWSIZE: 512M
- JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
- JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
utests_long:
docker:
- image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:20210304
- resource_class: medium
+ resource_class: xlarge
working_directory: ~/
shell: /bin/bash -eo pipefail -l
parallelism: 1
@@ -660,17 +660,17 @@ jobs:
- CASSANDRA_SKIP_SYNC: true
- DTEST_REPO: git://github.com/apache/cassandra-dtest.git
- DTEST_BRANCH: trunk
- - CCM_MAX_HEAP_SIZE: 1024M
- - CCM_HEAP_NEWSIZE: 256M
+ - CCM_MAX_HEAP_SIZE: 2048M
+ - CCM_HEAP_NEWSIZE: 512M
- JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
- JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
utests_compression:
docker:
- image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:20210304
- resource_class: medium
+ resource_class: xlarge
working_directory: ~/
shell: /bin/bash -eo pipefail -l
- parallelism: 4
+ parallelism: 100
steps:
- attach_workspace:
at: /home/cassandra
@@ -752,8 +752,8 @@ jobs:
- CASSANDRA_SKIP_SYNC: true
- DTEST_REPO: git://github.com/apache/cassandra-dtest.git
- DTEST_BRANCH: trunk
- - CCM_MAX_HEAP_SIZE: 1024M
- - CCM_HEAP_NEWSIZE: 256M
+ - CCM_MAX_HEAP_SIZE: 2048M
+ - CCM_HEAP_NEWSIZE: 512M
- JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
- JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
j8_dtest_jars_build:
@@ -778,7 +778,7 @@ jobs:
git remote set-branches --add apache '$branch'
git fetch --depth 1 apache $branch
git checkout $branch
- git clean -fd
+ it clean -fd
# Loop to prevent failure due to maven-ant-tasks not downloading a jar..
for x in $(seq 1 3); do
${ANT_HOME}/bin/ant realclean; ${ANT_HOME}/bin/ant jar dtest-jar
@@ -797,7 +797,7 @@ jobs:
# and build the dtest-jar for the branch under test
${ANT_HOME}/bin/ant realclean
git checkout origin/$CIRCLE_BRANCH
- git clean -fd
+ it clean -fd
for x in $(seq 1 3); do
${ANT_HOME}/bin/ant realclean; ${ANT_HOME}/bin/ant jar dtest-jar
RETURN="$?"
@@ -830,8 +830,8 @@ jobs:
- CASSANDRA_SKIP_SYNC: true
- DTEST_REPO: git://github.com/apache/cassandra-dtest.git
- DTEST_BRANCH: trunk
- - CCM_MAX_HEAP_SIZE: 1024M
- - CCM_HEAP_NEWSIZE: 256M
+ - CCM_MAX_HEAP_SIZE: 2048M
+ - CCM_HEAP_NEWSIZE: 512M
- JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
- JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
workflows:
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org
[cassandra] 07/07: Update testDelayedResponse
Posted by br...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
brandonwilliams pushed a commit to branch CASSANDRA-16588
in repository https://gitbox.apache.org/repos/asf/cassandra.git
commit e4606a662b1742b50d61002b2f644b1c51900182
Author: Brandon Williams <br...@apache.org>
AuthorDate: Mon Apr 19 08:46:23 2021 -0500
Update testDelayedResponse
---
test/unit/org/apache/cassandra/gms/ShadowRoundTest.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/test/unit/org/apache/cassandra/gms/ShadowRoundTest.java b/test/unit/org/apache/cassandra/gms/ShadowRoundTest.java
index 880c0cf..20e5300 100644
--- a/test/unit/org/apache/cassandra/gms/ShadowRoundTest.java
+++ b/test/unit/org/apache/cassandra/gms/ShadowRoundTest.java
@@ -115,8 +115,8 @@ public class ShadowRoundTest
assertEquals("Unable to contact any seeds!", e.getMessage());
}
- // we expect one SYN for each seed during shadow round + additional SYNs after gossiper has been enabled
- assertTrue(spySyn.messagesIntercepted > noOfSeeds);
+ // we expect one SYN for each seed during shadow round
+ assertEquals(spySyn.messagesIntercepted, noOfSeeds);
// we don't expect to emit any GOSSIP_DIGEST_ACK2 or MIGRATION_REQUEST messages
assertEquals(0, spyAck2.messagesIntercepted);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org
[cassandra] 03/07: Fix condition in shadow round check
Posted by br...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
brandonwilliams pushed a commit to branch CASSANDRA-16588
in repository https://gitbox.apache.org/repos/asf/cassandra.git
commit 9937c8bf2672f377d6f0ab5a7da559ed69eed712
Author: Sam Tunnicliffe <sa...@beobal.com>
AuthorDate: Thu Apr 15 15:05:15 2021 +0100
Fix condition in shadow round check
---
src/java/org/apache/cassandra/gms/Gossiper.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/java/org/apache/cassandra/gms/Gossiper.java b/src/java/org/apache/cassandra/gms/Gossiper.java
index 756b043..412b2be 100644
--- a/src/java/org/apache/cassandra/gms/Gossiper.java
+++ b/src/java/org/apache/cassandra/gms/Gossiper.java
@@ -1705,7 +1705,7 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean
// it is possible for a previously queued ack to be sent to us when we come back up in shadow
EndpointState localState = epStateMap.get(FBUtilities.getBroadcastAddress());
// return false if response doesn't contain state necessary for safety check
- return localState != null && localState.containsApplicationState(ApplicationState.HOST_ID);
+ return localState == null || localState.containsApplicationState(ApplicationState.HOST_ID);
}
protected void maybeFinishShadowRound(InetAddress respondent, boolean isInShadowRound, Map<InetAddress, EndpointState> epStateMap)
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org
[cassandra] 05/07: Filter out dead states from startup safety check
Posted by br...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
brandonwilliams pushed a commit to branch CASSANDRA-16588
in repository https://gitbox.apache.org/repos/asf/cassandra.git
commit e68602ae300e6a2567e1b59efa4229ff3456e521
Author: Matt Fleming <ma...@codeblueprint.co.uk>
AuthorDate: Fri Apr 16 17:05:42 2021 +0100
Filter out dead states from startup safety check
---
src/java/org/apache/cassandra/gms/Gossiper.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/java/org/apache/cassandra/gms/Gossiper.java b/src/java/org/apache/cassandra/gms/Gossiper.java
index 412b2be..6bc25b6 100644
--- a/src/java/org/apache/cassandra/gms/Gossiper.java
+++ b/src/java/org/apache/cassandra/gms/Gossiper.java
@@ -1705,7 +1705,7 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean
// it is possible for a previously queued ack to be sent to us when we come back up in shadow
EndpointState localState = epStateMap.get(FBUtilities.getBroadcastAddress());
// return false if response doesn't contain state necessary for safety check
- return localState == null || localState.containsApplicationState(ApplicationState.HOST_ID);
+ return localState == null || isDeadState(localState) || localState.containsApplicationState(ApplicationState.HOST_ID);
}
protected void maybeFinishShadowRound(InetAddress respondent, boolean isInShadowRound, Map<InetAddress, EndpointState> epStateMap)
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org
[cassandra] 06/07: Update tests
Posted by br...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
brandonwilliams pushed a commit to branch CASSANDRA-16588
in repository https://gitbox.apache.org/repos/asf/cassandra.git
commit a46407d8d72b22d8abaae6c2e97c679a03e1c7c5
Author: Brandon Williams <br...@apache.org>
AuthorDate: Fri Apr 16 14:35:03 2021 -0500
Update tests
---
.../org/apache/cassandra/gms/ShadowRoundTest.java | 67 +++++++++++++++++++++-
1 file changed, 64 insertions(+), 3 deletions(-)
diff --git a/test/unit/org/apache/cassandra/gms/ShadowRoundTest.java b/test/unit/org/apache/cassandra/gms/ShadowRoundTest.java
index 5ce72b5..880c0cf 100644
--- a/test/unit/org/apache/cassandra/gms/ShadowRoundTest.java
+++ b/test/unit/org/apache/cassandra/gms/ShadowRoundTest.java
@@ -19,9 +19,16 @@
package org.apache.cassandra.gms;
+import java.net.InetAddress;
+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.apache.cassandra.dht.IPartitioner;
import org.junit.After;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -128,17 +135,71 @@ public class ShadowRoundTest
{
while (!Gossiper.instance.isEnabled()) ;
}
+ InetAddress junkaddr;
+ try
+ {
+ junkaddr = InetAddress.getByName("1.1.1.1");
+ }
+ catch (UnknownHostException e)
+ {
+ throw new RuntimeException(e);
+ }
+
+ HeartBeatState hb = new HeartBeatState(123, 456);
+ EndpointState state = new EndpointState(hb);
+ List<GossipDigest> gDigests = new ArrayList<GossipDigest>();
+ gDigests.add(new GossipDigest(FBUtilities.getBroadcastAddress(), hb.getGeneration(), hb.getHeartBeatVersion()));
+ gDigests.add(new GossipDigest(junkaddr, hb.getGeneration(), hb.getHeartBeatVersion()));
+ Map<InetAddress, EndpointState> smap = new HashMap<InetAddress, EndpointState>()
+ {
+ {
+ put(FBUtilities.getBroadcastAddress(), state);
+ put(junkaddr, state);
+ }
+ };
+ GossipDigestAck payload = new GossipDigestAck(gDigests, smap);
+
+ logger.debug("Simulating bad digest ACK reply");
+ return MessageIn.create(to, payload, Collections.emptyMap(), MessagingService.Verb.GOSSIP_DIGEST_ACK, MessagingService.current_version);
+ }, 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());
+ }
+ }
+ @Test
+ public void testPreviouslyAssassinatedInShadow()
+ {
+ final AtomicBoolean ackSend = new AtomicBoolean(false);
+ MockMessagingSpy spySyn = MockMessagingService.when(verb(MessagingService.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,
+ new VersionedValue.VersionedValueFactory(DatabaseDescriptor.getPartitioner()).left(
+ Collections.singletonList(DatabaseDescriptor.getPartitioner().getRandomToken()), 1L));
GossipDigestAck payload = new GossipDigestAck(
- Collections.singletonList(new GossipDigest(FBUtilities.getBroadcastAddress(), hb.getGeneration(), hb.getHeartBeatVersion())),
- Collections.singletonMap(FBUtilities.getBroadcastAddress(), state));
+ Collections.singletonList(new GossipDigest(FBUtilities.getBroadcastAddress(), hb.getGeneration(), hb.getHeartBeatVersion())),
+ Collections.singletonMap(FBUtilities.getBroadcastAddress(), state));
- logger.warn("Simulating digest ACK reply, {}", payload);
+ logger.debug("Simulating bad digest ACK reply");
return MessageIn.create(to, payload, Collections.emptyMap(), MessagingService.Verb.GOSSIP_DIGEST_ACK, MessagingService.current_version);
}, 1);
+
System.setProperty(Config.PROPERTY_PREFIX + "auto_bootstrap", "false");
try
{
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org
[cassandra] 02/07: Check for specific app states in shadow round
Posted by br...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
brandonwilliams pushed a commit to branch CASSANDRA-16588
in repository https://gitbox.apache.org/repos/asf/cassandra.git
commit de62276f3e51509877a0e8a18308d06c7c42b35d
Author: Sam Tunnicliffe <sa...@beobal.com>
AuthorDate: Thu Apr 15 11:52:16 2021 +0100
Check for specific app states in shadow round
---
src/java/org/apache/cassandra/gms/EndpointState.java | 5 +++++
src/java/org/apache/cassandra/gms/Gossiper.java | 17 ++++++++---------
2 files changed, 13 insertions(+), 9 deletions(-)
diff --git a/src/java/org/apache/cassandra/gms/EndpointState.java b/src/java/org/apache/cassandra/gms/EndpointState.java
index 674b597..b587635 100644
--- a/src/java/org/apache/cassandra/gms/EndpointState.java
+++ b/src/java/org/apache/cassandra/gms/EndpointState.java
@@ -83,6 +83,11 @@ public class EndpointState
return applicationState.get().get(key);
}
+ public boolean containsApplicationState(ApplicationState key)
+ {
+ return applicationState.get().containsKey(key);
+ }
+
public Set<Map.Entry<ApplicationState, VersionedValue>> states()
{
return applicationState.get().entrySet();
diff --git a/src/java/org/apache/cassandra/gms/Gossiper.java b/src/java/org/apache/cassandra/gms/Gossiper.java
index 5e6adbf..756b043 100644
--- a/src/java/org/apache/cassandra/gms/Gossiper.java
+++ b/src/java/org/apache/cassandra/gms/Gossiper.java
@@ -17,7 +17,6 @@
*/
package org.apache.cassandra.gms;
-import java.lang.management.ManagementFactory;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.*;
@@ -1701,16 +1700,12 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean
return anyNodeOn30;
}
- public boolean isShadowRoundStateMap(Map<InetAddress, EndpointState> epStateMap)
+ public boolean sufficientForStartupSafetyCheck(Map<InetAddress, EndpointState> epStateMap)
{
// it is possible for a previously queued ack to be sent to us when we come back up in shadow
EndpointState localState = epStateMap.get(FBUtilities.getBroadcastAddress());
- if (localState != null && epStateMap.size() == 1) // response only contains our IP
- {
- logger.debug("Not exiting shadow round because received bogus ACK {} -> {}", FBUtilities.getBroadcastAddress(), localState);
- return false;
- }
- return true;
+ // return false if response doesn't contain state necessary for safety check
+ return localState != null && localState.containsApplicationState(ApplicationState.HOST_ID);
}
protected void maybeFinishShadowRound(InetAddress respondent, boolean isInShadowRound, Map<InetAddress, EndpointState> epStateMap)
@@ -1719,8 +1714,12 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean
{
if (!isInShadowRound)
{
- if (!isShadowRoundStateMap(epStateMap))
+ if (!sufficientForStartupSafetyCheck(epStateMap))
+ {
+ logger.debug("Not exiting shadow round because received ACK with insufficient states {} -> {}",
+ FBUtilities.getBroadcastAddress(), epStateMap.get(FBUtilities.getBroadcastAddress()));
return;
+ }
if (!seeds.contains(respondent))
logger.warn("Received an ack from {}, who isn't a seed. Ensure your seed list includes a live node. Exiting shadow round",
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org
[cassandra] 01/07: Ignore stale ack in shadow
Posted by br...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
brandonwilliams pushed a commit to branch CASSANDRA-16588
in repository https://gitbox.apache.org/repos/asf/cassandra.git
commit 64a5fff0da3a389ff3ec0155b8472f919171cb20
Author: Brandon Williams <br...@apache.org>
AuthorDate: Wed Apr 14 13:49:21 2021 -0500
Ignore stale ack in shadow
---
src/java/org/apache/cassandra/gms/Gossiper.java | 15 +++++++++
.../org/apache/cassandra/gms/ShadowRoundTest.java | 37 ++++++++++++++++++++++
2 files changed, 52 insertions(+)
diff --git a/src/java/org/apache/cassandra/gms/Gossiper.java b/src/java/org/apache/cassandra/gms/Gossiper.java
index 69f7fee..5e6adbf 100644
--- a/src/java/org/apache/cassandra/gms/Gossiper.java
+++ b/src/java/org/apache/cassandra/gms/Gossiper.java
@@ -1701,12 +1701,27 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean
return anyNodeOn30;
}
+ public boolean isShadowRoundStateMap(Map<InetAddress, EndpointState> epStateMap)
+ {
+ // it is possible for a previously queued ack to be sent to us when we come back up in shadow
+ EndpointState localState = epStateMap.get(FBUtilities.getBroadcastAddress());
+ if (localState != null && epStateMap.size() == 1) // response only contains our IP
+ {
+ logger.debug("Not exiting shadow round because received bogus ACK {} -> {}", FBUtilities.getBroadcastAddress(), localState);
+ return false;
+ }
+ return true;
+ }
+
protected void maybeFinishShadowRound(InetAddress respondent, boolean isInShadowRound, Map<InetAddress, EndpointState> epStateMap)
{
if (inShadowRound)
{
if (!isInShadowRound)
{
+ if (!isShadowRoundStateMap(epStateMap))
+ return;
+
if (!seeds.contains(respondent))
logger.warn("Received an ack from {}, who isn't a seed. Ensure your seed list includes a live node. Exiting shadow round",
respondent);
diff --git a/test/unit/org/apache/cassandra/gms/ShadowRoundTest.java b/test/unit/org/apache/cassandra/gms/ShadowRoundTest.java
index f8cc49c..5ce72b5 100644
--- a/test/unit/org/apache/cassandra/gms/ShadowRoundTest.java
+++ b/test/unit/org/apache/cassandra/gms/ShadowRoundTest.java
@@ -28,6 +28,7 @@ import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.apache.cassandra.config.Config;
import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.db.Keyspace;
import org.apache.cassandra.exceptions.ConfigurationException;
@@ -38,6 +39,7 @@ import org.apache.cassandra.net.MessagingService;
import org.apache.cassandra.net.MockMessagingService;
import org.apache.cassandra.net.MockMessagingSpy;
import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.utils.FBUtilities;
import static org.apache.cassandra.net.MockMessagingService.verb;
import static org.junit.Assert.assertEquals;
@@ -113,4 +115,39 @@ public class ShadowRoundTest
assertEquals(0, spyAck2.messagesIntercepted);
assertEquals(0, spyMigrationReq.messagesIntercepted);
}
+
+ @Test
+ public void testBadAckInShadow()
+ {
+ final AtomicBoolean ackSend = new AtomicBoolean(false);
+ MockMessagingSpy spySyn = MockMessagingService.when(verb(MessagingService.Verb.GOSSIP_DIGEST_SYN))
+ .respondN((msgOut, to) ->
+ {
+ // ACK with bad data in shadow round
+ if (!ackSend.compareAndSet(false, true))
+ {
+ while (!Gossiper.instance.isEnabled()) ;
+ }
+
+ HeartBeatState hb = new HeartBeatState(123, 456);
+ EndpointState state = new EndpointState(hb);
+ GossipDigestAck payload = new GossipDigestAck(
+ Collections.singletonList(new GossipDigest(FBUtilities.getBroadcastAddress(), hb.getGeneration(), hb.getHeartBeatVersion())),
+ Collections.singletonMap(FBUtilities.getBroadcastAddress(), state));
+
+ logger.warn("Simulating digest ACK reply, {}", payload);
+ return MessageIn.create(to, payload, Collections.emptyMap(), MessagingService.Verb.GOSSIP_DIGEST_ACK, MessagingService.current_version);
+ }, 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: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org