Fix restarting a node when other nodes are down in dtests

patch by Jacek Lewandowski; reviewed by Michael Semb Wever for CASSANDRA-17214
This commit is contained in:
Jacek Lewandowski 2021-12-16 08:45:05 +01:00 committed by Mick Semb Wever
parent ecfe7e809b
commit d543dae2cd
No known key found for this signature in database
GPG Key ID: E91335D77E3E87CB
4 changed files with 51 additions and 4 deletions

View File

@ -538,7 +538,7 @@
<dependency groupId="com.google.code.java-allocation-instrumenter" artifactId="java-allocation-instrumenter" version="${allocation-instrumenter.version}" scope="test">
<exclusion groupId="com.google.guava" artifactId="guava"/>
</dependency>
<dependency groupId="org.apache.cassandra" artifactId="dtest-api" version="0.0.11" scope="test"/>
<dependency groupId="org.apache.cassandra" artifactId="dtest-api" version="0.0.12" scope="test"/>
<dependency groupId="org.reflections" artifactId="reflections" version="0.9.12" scope="test"/>
<dependency groupId="com.puppycrawl.tools" artifactId="checkstyle" version="8.40" scope="test"/>
<dependency groupId="org.apache.hadoop" artifactId="hadoop-core" version="1.0.3" scope="provided">

View File

@ -281,6 +281,12 @@ public abstract class AbstractCluster<I extends IInstance> implements ICluster<I
return !isShutdown;
}
@Override
public boolean isValid()
{
return delegate != null;
}
@Override
public synchronized void startup()
{

View File

@ -38,6 +38,7 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.stream.Stream;
import javax.management.ListenerNotFoundException;
import javax.management.Notification;
import javax.management.NotificationListener;
@ -632,12 +633,13 @@ public class Instance extends IsolatedExecutor implements IInvokableInstance
}
else
{
Stream peers = cluster.stream().filter(instance -> ((IInstance) instance).isValid());
if (config.has(BLANK_GOSSIP))
cluster.stream().forEach(peer -> GossipHelper.statusToBlank((IInvokableInstance) peer).accept(this));
peers.forEach(peer -> GossipHelper.statusToBlank((IInvokableInstance) peer).accept(this));
else if (cluster instanceof Cluster)
cluster.stream().forEach(peer -> GossipHelper.statusToNormal((IInvokableInstance) peer).accept(this));
peers.forEach(peer -> GossipHelper.statusToNormal((IInvokableInstance) peer).accept(this));
else
cluster.stream().forEach(peer -> GossipHelper.unsafeStatusToNormal(this, (IInstance) peer));
peers.forEach(peer -> GossipHelper.unsafeStatusToNormal(this, (IInstance) peer));
StorageService.instance.setUpDistributedSystemKeyspaces();
StorageService.instance.setNormalModeUnsafe();

View File

@ -0,0 +1,39 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.cassandra.distributed.test;
import org.junit.Test;
import org.apache.cassandra.distributed.Cluster;
import org.apache.cassandra.utils.FBUtilities;
public class RestartTest extends TestBaseImpl
{
@Test
public void test() throws Exception
{
try (Cluster cluster = init(Cluster.build(2).withDataDirCount(1).start()))
{
FBUtilities.waitOnFuture(cluster.get(2).shutdown());
FBUtilities.waitOnFuture(cluster.get(1).shutdown());
cluster.get(1).startup();
cluster.get(2).startup();
}
}
}