blob: f23a801af0ca2427aebddf62fd598b5f3bbdd53b [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.ignite.loadtests.util;
import java.io.PrintStream;
import java.util.HashMap;
import java.util.Map;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.lang.IgniteClosure;
import org.jetbrains.annotations.Nullable;
/**
* Contains constants and methods for working with
* command line arguments, JVM properties and environment
* variables.
*/
public class GridLoadTestArgs {
/** Cache name. */
public static final String CACHE_NAME = "IGNITE_CACHE_NAME";
/** Threads count. */
public static final String THREADS_CNT = "IGNITE_THREADS_COUNT";
/** Test duration in seconds. */
public static final String TEST_DUR_SEC = "IGNITE_TEST_DUR_SEC";
/** Value size. */
public static final String VALUE_SIZE = "IGNITE_VALUE_SIZE";
/** Properties map for dumping. */
private static ThreadLocal<Map<String, String>> props = new ThreadLocal<Map<String, String>>() {
@Override protected Map<String, String> initialValue() {
return new HashMap<>();
}
};
/**
* Gets the value of either JVM property or environment variable,
* if property is not set.
*
* @param name Property name.
* @param dflt Default value.
* @return JVM property value or environment variable value if
* JVM property is {@code null} or default value if both
* are {@code null}.
*/
public static String getStringProperty(String name, String dflt) {
String ret = getStringProperty0(name);
if (ret == null)
ret = dflt;
props.get().put(name, ret);
return ret;
}
/**
* Gets the value of either JVM property or environment variable,
* if property is not set.
*
* @param name Property name.
* @return JVM property value or environment variable value if
* JVM property is undefined. Returns {@code null} if
* both JVM property and environment variable are not set.
*/
@Nullable public static String getStringProperty(String name) {
return saveProperty(name, getStringProperty0(name));
}
/**
* Helper method for getting property values.
*
* @param name Property name.
* @return JVM property value or environment variable value if
* JVM property is undefined. Returns {@code null} if
* both JVM property and environment variable are not set.
*/
@Nullable private static String getStringProperty0(String name) {
String ret = System.getProperty(name);
return ret != null ? ret : System.getenv(name);
}
/**
* Gets the integer value of either JVM property or environment variable,
* if property is not set.
*
* @param name Property name.
* @return JVM property value or environment variable value if
* JVM property is {@code null} or {@code null} if both
* are {@code null}.
*/
@Nullable public static Integer getIntProperty(String name) {
return saveProperty(name, getIntProperty0(name));
}
/**
* Gets the integer value of either JVM property or environment variable,
* if property is not set.
*
* @param name Property name.
* @param dflt Default value.
* @return JVM property value or environment variable value if
* JVM property is {@code null} or default value if both
* are {@code null}.
*/
public static int getIntProperty(String name, int dflt) {
Integer ret = getIntProperty0(name);
return saveProperty(name, ret != null ? ret : dflt);
}
/**
* Helper method for getting int properties.
*
* @param name Property name.
* @return JVM property value or environment variable value if
* JVM property is {@code null} or {@code null} if both
* are {@code null}.
*/
@Nullable private static Integer getIntProperty0(String name) {
Integer ret = Integer.getInteger(name);
if (ret == null) {
String env = System.getenv(name);
ret = env != null ? Integer.valueOf(env) : null;
}
return ret;
}
/**
* Gets the integer value of either JVM property or environment variable,
* if property is not set.
*
* @param name Property name.
* @param dflt Default value.
* @param validClo Value validation closure, which returns {@code null}, if the value
* is valid, and error message, if it's not valid.
* @return JVM property value or environment variable value if
* JVM property is {@code null} or default value if both
* are {@code null}.
* @throws IgniteCheckedException If the value didn't pass the validation.
*/
public static int getIntProperty(String name, int dflt, IgniteClosure<Integer, String> validClo)
throws IgniteCheckedException {
int ret = getIntProperty(name, dflt);
String errMsg = validClo.apply(ret);
if (errMsg != null)
throw new IgniteCheckedException("Illegal value for " + name + " parameter: " + errMsg);
return ret;
}
/**
* Gets the long value of either JVM property or environment variable,
* if property is not set.
*
* @param name Property name.
* @return JVM property value or environment variable value if
* JVM property is undefined. Returns {@code null} if
* both JVM property and environment variable are not set.
*/
@Nullable public static Long getLongProperty(String name) {
return saveProperty(name, getLongProperty0(name));
}
/**
* Gets the long value of either JVM property or environment variable,
* if property is not set.
*
* @param name Property name.
* @param dflt Default value.
* @return JVM property value or environment variable value if
* JVM property is {@code null} or default value if both
* are {@code null}.
*/
public static long getLongProperty(String name, long dflt) {
Long ret = getLongProperty(name);
return saveProperty(name, ret != null ? ret : dflt);
}
/**
* Helper method for getting long property.
*
* @param name Property name.
* @return JVM property value or environment variable value if
* JVM property is undefined. Returns {@code null} if
* both JVM property and environment variable are not set.
*/
@Nullable private static Long getLongProperty0(String name) {
Long ret = Long.getLong(name);
if (ret == null) {
String env = System.getenv(name);
ret = env != null ? Long.valueOf(env) : null;
}
return ret;
}
/**
* Gets the boolean value of either JVM property or environment variable,
* if property is not set.
*
* @param name Property name.
* @param dflt Default value.
* @return JVM property value or environment variable value if
* JVM property is {@code null} or default value if both
* are {@code null}.
*/
@SuppressWarnings("ConstantConditions")
public static boolean getBooleanProperty(String name, boolean dflt) {
Boolean ret = Boolean.getBoolean(name);
if (ret == null) {
String env = System.getenv(name);
ret = env != null ? Boolean.valueOf(env) : null;
}
return saveProperty(name, ret != null ? ret : dflt);
}
/**
* Prints a message about undefined JVM property to standard
* error.
*
* @param propName JVM property name.
*/
public static void printErrorUndefined(String propName) {
System.err.println("JVM property " + propName + " should be defined " +
"(use -D" + propName + "=...)");
}
/**
* Dumps the properties (name + value), that were retrieved using
* {@code get[type]Property()}.
*
* @param out Output stream to dump properties to.
*/
public static void dumpProperties(PrintStream out) {
for (Map.Entry<String, String> prop : props.get().entrySet())
out.println(prop.getKey() + ": " + prop.getValue());
}
/**
* Helper method for saving a property to thread local for later use in
* {@link #dumpProperties(PrintStream)}.
*
* @param name Property name.
* @param val Property value.
* @return Property value.
*/
@Nullable private static <T> T saveProperty(String name, @Nullable T val) {
props.get().put(name, val != null ? val.toString() : null);
return val;
}
}