blob: 5045301a0e606e75ba841d272cc119db9d232e30 [file] [log] [blame]
/*
* 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 java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.distributed.Cluster;
import org.apache.cassandra.hints.HintsService;
import org.apache.cassandra.service.StorageProxy;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
/**
* These tests replace the nodetool-related Python dtests in hintedhandoff_test.py.
*/
@RunWith(Parameterized.class)
public class HintedHandoffNodetoolTest extends TestBaseImpl
{
private static Cluster cluster;
@Parameterized.Parameter
public int node;
@Parameterized.Parameters(name = "node={0}")
public static List<Object[]> data()
{
List<Object[]> result = new ArrayList<>();
result.add(new Object[]{ 1 });
result.add(new Object[]{ 2 });
return result;
}
@BeforeClass
public static void before() throws IOException
{
cluster = init(Cluster.build().withNodes(2).withDCs(2).start());
}
@AfterClass
public static void after()
{
if (cluster != null)
cluster.close();
}
@Before
public void enableHandoff()
{
cluster.get(1).nodetoolResult("enablehandoff");
cluster.get(2).nodetoolResult("enablehandoff");
}
@SuppressWarnings("Convert2MethodRef")
@Test
public void testEnableHandoff()
{
cluster.get(node).nodetoolResult("statushandoff").asserts().success().stdoutContains("Hinted handoff is running");
assertTrue(cluster.get(node).callOnInstance(() -> StorageProxy.instance.getHintedHandoffEnabled()));
}
@Test
public void testDisableHandoff()
{
cluster.get(node).nodetoolResult("statushandoff").asserts().success().stdoutContains("Hinted handoff is running");
cluster.get(node).nodetoolResult("disablehandoff");
cluster.get(node).nodetoolResult("statushandoff").asserts().success().stdoutContains("Hinted handoff is not running");
cluster.get(node).nodetoolResult("enablehandoff");
cluster.get(node).nodetoolResult("statushandoff").asserts().success().stdoutContains("Hinted handoff is running");
}
@Test
public void testDisableForDC()
{
cluster.get(node).nodetoolResult("disablehintsfordc", "datacenter1");
cluster.get(node).nodetoolResult("statushandoff").asserts().success().stdoutContains("Data center datacenter1 is disabled");
cluster.get(node).nodetoolResult("enablehintsfordc", "datacenter1");
cluster.get(node).nodetoolResult("statushandoff").asserts().success().stdoutNotContains("Data center datacenter1 is disabled");
}
@Test
public void testPauseHandoff()
{
cluster.get(node).nodetoolResult("statushandoff").asserts().success().stdoutContains("Hinted handoff is running");
cluster.get(node).nodetoolResult("pausehandoff").asserts().success();
Boolean isPaused = cluster.get(node).callOnInstance(() -> HintsService.instance.isDispatchPaused());
assertTrue(isPaused);
cluster.get(node).nodetoolResult("resumehandoff").asserts().success();
isPaused = cluster.get(node).callOnInstance(() -> HintsService.instance.isDispatchPaused());
assertFalse(isPaused);
}
@Test
public void testThrottle()
{
Integer throttleInKB = cluster.get(node).callOnInstance(DatabaseDescriptor::getHintedHandoffThrottleInKB);
cluster.get(node).nodetoolResult("sethintedhandoffthrottlekb", String.valueOf(throttleInKB * 2)).asserts().success();
Integer newThrottleInKB = cluster.get(node).callOnInstance(DatabaseDescriptor::getHintedHandoffThrottleInKB);
assertEquals(throttleInKB * 2, newThrottleInKB.intValue());
}
@SuppressWarnings("Convert2MethodRef")
@Test
public void testMaxHintWindow()
{
Integer hintWindowMillis = cluster.get(node).callOnInstance(() -> StorageProxy.instance.getMaxHintWindow());
cluster.get(node).nodetoolResult("getmaxhintwindow")
.asserts()
.success()
.stdoutContains("Current max hint window: " + hintWindowMillis + " ms");
cluster.get(node).nodetoolResult("setmaxhintwindow", String.valueOf(hintWindowMillis * 2)).asserts().success();
cluster.get(node).nodetoolResult("getmaxhintwindow")
.asserts()
.success()
.stdoutContains("Current max hint window: " + hintWindowMillis * 2 + " ms");
}
}