Remove stress server functionality

Patch by marcuse; reviewed by Brandon Williams for CASSANDRA-17535
This commit is contained in:
Marcus Eriksson 2022-04-07 09:06:53 +02:00
parent af90c36340
commit 537321e9c7
11 changed files with 7 additions and 350 deletions

View File

@ -1,4 +1,5 @@
4.1
* Remove stress server functionality (CASSANDRA-17535)
* Reduce histogram snapshot long[] allocation overhead during speculative read and write threshold updates (CASSANDRA-17523)
* Add guardrail for creation of secondary indexes (CASSANDRA-17498)
* Add guardrail to disallow creation of uncompressed tables (CASSANDRA-17504)

View File

@ -67,8 +67,6 @@ Primary Options:::
Custom transport factories
-port:;;
The port to connect to cassandra nodes on
-sendto:;;
Specify a stress server to send this command to
-graph:;;
Graph recorded metrics
-tokenrange:;;

View File

@ -190,7 +190,6 @@ This package contains extra tools for working with Cassandra clusters.
%files tools
%attr(755,root,root) %{_bindir}/sstabledump
%attr(755,root,root) %{_bindir}/cassandra-stressd
%attr(755,root,root) %{_bindir}/compaction-stress
%attr(755,root,root) %{_bindir}/sstableexpiredblockers
%attr(755,root,root) %{_bindir}/sstablelevelreset

View File

@ -1,79 +0,0 @@
#!/bin/sh
# 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.
DESC="Cassandra Stress Test Daemon"
if [ "x$CASSANDRA_INCLUDE" = "x" ]; then
# Locations (in order) to use when searching for an include file.
for include in "`dirname "$0"`/cassandra.in.sh" \
"$HOME/.cassandra.in.sh" \
/usr/share/cassandra/cassandra.in.sh \
/usr/local/share/cassandra/cassandra.in.sh \
/opt/cassandra/cassandra.in.sh; do
if [ -r "$include" ]; then
. "$include"
break
fi
done
elif [ -r "$CASSANDRA_INCLUDE" ]; then
. "$CASSANDRA_INCLUDE"
fi
if [ -z "$CLASSPATH" ]; then
echo "You must set the CLASSPATH var" >&2
exit 1
fi
case "$1" in
start)
echo "Starting $DESC: "
"$JAVA" -server -cp "$CLASSPATH" $JVM_OPTS \
-Dcassandra.storagedir="$cassandra_storagedir" \
-Dlogback.configurationFile=logback-tools.xml \
org.apache.cassandra.stress.StressServer $@ 1> ./stressd.out.log 2> ./stressd.err.log &
echo $! > ./stressd.pid
echo "done."
;;
stop)
PID=`cat ./stressd.pid 2> /dev/null`
if [ "x$PID" = "x" ]; then
echo "$DESC is not running."
else
kill -9 $PID
rm ./stressd.pid
echo "$DESC is stopped."
fi
;;
status)
PID=`cat ./stressd.pid 2> /dev/null`
if [ "x$PID" = "x" ]; then
echo "$DESC is not running."
else
echo "$DESC is running with pid $PID."
fi
;;
*)
echo "Usage: $0 start|stop|status [-h <host>]"
;;
esac
# vi:ai sw=4 ts=4 tw=0 et

View File

@ -18,8 +18,6 @@
package org.apache.cassandra.stress;
import java.io.*;
import java.net.Socket;
import java.net.SocketException;
import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.stress.settings.StressSettings;
@ -51,8 +49,6 @@ public final class Stress
* thread count with a high error rate / low count to get some basic numbers
*/
private static volatile boolean stopped = false;
public static void main(String[] arguments) throws Exception
{
System.exit(run(arguments));
@ -101,52 +97,11 @@ public final class Stress
logout.addStream(new PrintStream(settings.graph.temporaryLogFile));
}
if (settings.sendToDaemon != null)
{
Socket socket = new Socket(settings.sendToDaemon, 2159);
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
BufferedReader inp = new BufferedReader(new InputStreamReader(socket.getInputStream()));
Runtime.getRuntime().addShutdownHook(new ShutDown(socket, out));
out.writeObject(settings);
String line;
try
{
while (!socket.isClosed() && (line = inp.readLine()) != null)
{
if (line.equals("END") || line.equals("FAILURE"))
{
out.writeInt(1);
break;
}
logout.println(line);
}
}
catch (SocketException e)
{
if (!stopped)
e.printStackTrace();
}
out.close();
inp.close();
socket.close();
}
else
{
StressAction stressAction = new StressAction(settings, logout);
stressAction.run();
logout.flush();
if (settings.graph.inGraphMode())
new StressGraph(settings, arguments).generateGraph();
}
StressAction stressAction = new StressAction(settings, logout);
stressAction.run();
logout.flush();
if (settings.graph.inGraphMode())
new StressGraph(settings, arguments).generateGraph();
}
catch (Throwable t)
{
@ -164,37 +119,4 @@ public final class Stress
{
StressSettings.printHelp();
}
private static class ShutDown extends Thread
{
private final Socket socket;
private final ObjectOutputStream out;
public ShutDown(Socket socket, ObjectOutputStream out)
{
this.out = out;
this.socket = socket;
}
public void run()
{
try
{
if (!socket.isClosed())
{
System.out.println("Control-C caught. Canceling running action and shutting down...");
out.writeInt(1);
out.close();
stopped = true;
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}

View File

@ -1,135 +0,0 @@
/**
* 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.stress;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.commons.cli.*;
import org.apache.cassandra.concurrent.NamedThreadFactory;
import org.apache.cassandra.stress.settings.StressSettings;
import org.apache.cassandra.stress.util.MultiResultLogger;
import org.apache.cassandra.stress.util.ResultLogger;
public class StressServer
{
private static final Options availableOptions = new Options();
static
{
availableOptions.addOption("h", "host", true, "Host to listen for connections.");
}
private static final AtomicInteger threadCounter = new AtomicInteger(1);
public static void main(String[] args) throws Exception
{
ServerSocket serverSocket = null;
CommandLineParser parser = new PosixParser();
InetAddress address = InetAddress.getByName("127.0.0.1");
try
{
CommandLine cmd = parser.parse(availableOptions, args);
if (cmd.hasOption("h"))
{
address = InetAddress.getByName(cmd.getOptionValue("h"));
}
}
catch (ParseException e)
{
System.err.printf("Usage: ./bin/stressd start|stop|status [-h <host>]");
System.exit(1);
}
try
{
serverSocket = new ServerSocket(2159, 0, address);
}
catch (IOException e)
{
System.err.printf("Could not listen on port: %s:2159.%n", address.getHostAddress());
System.exit(1);
}
for (;;)
new StressThread(serverSocket.accept()).start();
}
public static class StressThread extends Thread
{
private final Socket socket;
public StressThread(Socket client)
{
this.socket = client;
}
public void run()
{
try
{
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
PrintStream out = new PrintStream(socket.getOutputStream());
ResultLogger log = new MultiResultLogger(out);
StressAction action = new StressAction((StressSettings) in.readObject(), log);
Thread actionThread = NamedThreadFactory.createThread(action, "stress-" + threadCounter.incrementAndGet());
actionThread.start();
while (actionThread.isAlive())
{
try
{
if (in.readInt() == 1)
{
actionThread.interrupt();
break;
}
}
catch (Exception e)
{
// continue without problem
}
}
out.close();
in.close();
socket.close();
}
catch (IOException e)
{
throw new RuntimeException(e.getMessage(), e);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
}

View File

@ -37,7 +37,6 @@ public enum CliOption
LOG("Where to log progress to, and the interval at which to do it", SettingsLog.helpPrinter()),
TRANSPORT("Custom transport factories", SettingsTransport.helpPrinter()),
PORT("The port to connect to cassandra nodes on", SettingsPort.helpPrinter()),
SENDTO("-send-to", "Specify a stress server to send this command to", SettingsMisc.sendToDaemonHelpPrinter()),
GRAPH("-graph", "Graph recorded metrics", SettingsGraph.helpPrinter()),
TOKENRANGE("Token range settings", SettingsTokenRange.helpPrinter())
;

View File

@ -65,7 +65,6 @@ public class Legacy implements Serializable
availableOptions.addOption("R", "replication-strategy", true, "Replication strategy to use (only on insert if keyspace does not exist), default:org.apache.cassandra.locator.SimpleStrategy");
availableOptions.addOption("O", "strategy-properties", true, "Replication strategy properties in the following format <dc_name>:<num>,<dc_name>:<num>,...");
availableOptions.addOption("V", "average-size-values", false, "Generate column values of average rather than specific size");
availableOptions.addOption("T", "send-to", true, "Send this as a request to the stress daemon at specified address.");
availableOptions.addOption("I", "compression", true, "Specify the compression to use for sstable, default:no compression");
availableOptions.addOption("Q", "query-names", true, "Comma-separated list of column names to retrieve from each row.");
availableOptions.addOption("Z", "compaction-strategy", true, "CompactionStrategy to use.");
@ -238,10 +237,6 @@ public class Legacy implements Serializable
if (cmd.hasOption("D"))
r.add("-node", "file=" + cmd.getOptionValue("D"));
if (cmd.hasOption("send-to"))
r.add("-send-to", cmd.getOptionValue("send-to"));
if (cmd.hasOption("Z"))
r.add("-schema", "compaction=" + cmd.getOptionValue("Z"));

View File

@ -233,16 +233,4 @@ public abstract class SettingsCommand implements Serializable
{
GroupedOptions.printOptions(System.out, type.toLowerCase(), new Uncertainty(), new Count(), new Duration());
}
static Runnable helpPrinter(final Command type)
{
return new Runnable()
{
@Override
public void run()
{
printHelp(type);
}
};
}
}

View File

@ -216,29 +216,4 @@ class SettingsMisc implements Serializable
}
});
}
static Runnable sendToDaemonHelpPrinter()
{
return () -> {
System.out.println("Usage: -sendto <host>");
System.out.println();
System.out.println("Specify a host running the stress server to send this stress command to");
};
}
static String getSendToDaemon(Map<String, String[]> clArgs)
{
String[] params = clArgs.remove("-send-to");
if (params == null)
params = clArgs.remove("-sendto");
if (params == null)
return null;
if (params.length != 1)
{
sendToDaemonHelpPrinter().run();
System.out.println("Invalid -sendto specifier: " + Arrays.toString(params));
System.exit(1);
}
return params[0];
}
}

View File

@ -43,7 +43,6 @@ public class StressSettings implements Serializable
public final SettingsSchema schema;
public final SettingsTransport transport;
public final SettingsPort port;
public final String sendToDaemon;
public final SettingsGraph graph;
public final SettingsTokenRange tokenRange;
@ -59,7 +58,6 @@ public class StressSettings implements Serializable
SettingsSchema schema,
SettingsTransport transport,
SettingsPort port,
String sendToDaemon,
SettingsGraph graph,
SettingsTokenRange tokenRange)
{
@ -75,7 +73,6 @@ public class StressSettings implements Serializable
this.schema = schema;
this.transport = transport;
this.port = port;
this.sendToDaemon = sendToDaemon;
this.graph = graph;
this.tokenRange = tokenRange;
}
@ -190,7 +187,6 @@ public class StressSettings implements Serializable
SettingsCommand command = SettingsCommand.get(clArgs);
if (command == null)
throw new IllegalArgumentException("No command specified");
String sendToDaemon = SettingsMisc.getSendToDaemon(clArgs);
SettingsPort port = SettingsPort.get(clArgs);
SettingsRate rate = SettingsRate.get(clArgs, command);
SettingsPopulation generate = SettingsPopulation.get(clArgs, command);
@ -221,7 +217,7 @@ public class StressSettings implements Serializable
System.exit(1);
}
return new StressSettings(command, rate, generate, insert, columns, errors, log, mode, node, schema, transport, port, sendToDaemon, graph, tokenRange);
return new StressSettings(command, rate, generate, insert, columns, errors, log, mode, node, schema, transport, port, graph, tokenRange);
}
private static Map<String, String[]> parseMap(String[] args)
@ -295,8 +291,6 @@ public class StressSettings implements Serializable
transport.printSettings(out);
out.println("Port:");
port.printSettings(out);
out.println("Send To Daemon:");
out.printf(" " + (sendToDaemon != null ? sendToDaemon : "*not set*") + "%n");
out.println("Graph:");
graph.printSettings(out);
out.println("TokenRange:");