ACCUMULO-1652 allow user-specified command to be used when OOM errors occur
Project: http://git-wip-us.apache.org/repos/asf/accumulo/repo Commit: http://git-wip-us.apache.org/repos/asf/accumulo/commit/62425ba0 Tree: http://git-wip-us.apache.org/repos/asf/accumulo/tree/62425ba0 Diff: http://git-wip-us.apache.org/repos/asf/accumulo/diff/62425ba0 Branch: refs/heads/master Commit: 62425ba015b886a50622d16c57827bc6d973255f Parents: b154523 0ae34d4 Author: Eric Newton <[email protected]> Authored: Wed Sep 11 12:46:31 2013 -0400 Committer: Eric Newton <[email protected]> Committed: Wed Sep 11 12:46:31 2013 -0400 ---------------------------------------------------------------------- bin/accumulo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/accumulo/blob/62425ba0/bin/accumulo ---------------------------------------------------------------------- diff --cc bin/accumulo index d96c474,6642818..4ffed5c --- a/bin/accumulo +++ b/bin/accumulo @@@ -15,114 -15,119 +15,114 @@@ # See the License for the specific language governing permissions and # limitations under the License. -# The main Accumulo command script. -# -# Environment variables parameters: -# -# JAVA_HOME The java implenetation to use. -# ACCUMULO_CONF_DIR Location where accumulo-env.sh, accumulo-site.xml and friends will be read from -# ACCUMULO_LOG_DIR Directory for accmulo daemon logs. defaults to $ACCUMULO_HOME/logs -# ACCUMULO_VERSION This Accumulo's version number -# HADOOP_HOME The home diretcory for HADOOP. Defaults to bin/hadoop's parent. -# -# Java jvm paramters: (-Xmx et al) -# -# ACCUMULO_TSERVER_OPTS -# ACCUMULO_MASTER_OPTS -# ACCUMULO_GC_OPTS -# ACCUMULO_MONITOR_OPTS -# ACCUMULO_LOGGER_OPTS -# ACCUMULO_GENERAL_OPTS -# ACCUMULO_OTHER_OPTS -# -# Environment variables overriden by config.sh -# -# ACCUMULO_HOME Always the parent dir of bin/accumulo - -bin=`dirname "$0"` -bin=`cd "$bin"; pwd` +# Start: Resolve Script Directory +SOURCE="${BASH_SOURCE[0]}" +while [ -h "${SOURCE}" ]; do # resolve $SOURCE until the file is no longer a symlink + bin="$( cd -P "$( dirname "${SOURCE}" )" && pwd )" + SOURCE="$(readlink "${SOURCE}")" + [[ "${SOURCE}" != /* ]] && SOURCE="${bin}/${SOURCE}" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located +done +bin="$( cd -P "$( dirname "${SOURCE}" )" && pwd )" +script=$( basename "${SOURCE}" ) +# Stop: Resolve Script Directory -. "$bin"/config.sh +. "${bin}"/config.sh -if [ -z "$JAVA_HOME" -o ! -d "$JAVA_HOME" ]; then - echo "JAVA_HOME is not set. Please make sure it's set globally or in conf/accumulo-env.sh" - exit 1 -fi -if [ -z "$HADOOP_HOME" -o ! -d "$HADOOP_HOME" ]; then - echo "HADOOP_HOME is not set. Please make sure it's set globally or in conf/accumulo-env.sh" - exit 1 -fi -if [ -z "$ZOOKEEPER_HOME" -o ! -d "$ZOOKEEPER_HOME" ]; then - echo "ZOOKEEPER_HOME is not set. Please make sure it's set globally or in conf/accumulo-env.sh" - exit 1 -fi - -#Export the variables just in case they are not exported -#This makes them available to java -export JAVA_HOME=$JAVA_HOME -export HADOOP_HOME=$HADOOP_HOME -export ZOOKEEPER_HOME=$ZOOKEEPER_HOME - -START_JAR=$ACCUMULO_HOME/lib/accumulo-start-$ACCUMULO_VERSION.jar -COMMONS_JCI_JARS=$ACCUMULO_HOME/lib/commons-jci-core-1.0.jar:$ACCUMULO_HOME/lib/commons-jci-fam-1.0.jar:$ACCUMULO_HOME/lib/log4j-1.2.16.jar:$ACCUMULO_HOME/lib/commons-logging-1.0.4.jar:$ACCUMULO_HOME/lib/commons-logging-api-1.0.4.jar -START_CLASSES_DIR=$ACCUMULO_HOME/src/start/target/classes +START_JAR="${ACCUMULO_HOME}/lib/accumulo-start.jar" +# +# Resolve a program to its installation directory +# locationByProgram() { - # find the program - RESULT=`which $1` - # strip the program name from the path - RESULT=`dirname ${RESULT}` - # strip /bin from the path - RESULT=`dirname ${RESULT}` - echo ${RESULT} + RESULT=$( which "$1" ) + if [[ "$?" != 0 && -z "${RESULT}" ]]; then + echo "Cannot find '$1' and '$2' is not set in $ACCUMULO_CONF_DIR/accumulo-env.sh" + exit 1 + fi + while [ -h "${RESULT}" ]; do # resolve $RESULT until the file is no longer a symlink + DIR="$( cd -P "$( dirname "$RESULT" )" && pwd )" + RESULT="$(readlink "${RESULT}")" + [[ "${RESULT}" != /* ]] && RESULT="${DIR}/${RESULT}" # if $RESULT was a relative symlink, we need to resolve it relative to the path where the symlink file was located + done + # find the relative home directory + RESULT=$(dirname "${RESULT}") + echo "Auto-set ${2} to '${RESULT}'. To suppress this message, set ${2} in conf/accumulo-env.sh" + eval "${2}=${RESULT}" } -test -n "$JAVA_HOME" || export JAVA_HOME=`locationByProgram java` -test -n "$HADOOP_HOME" || export HADOOP_HOME=`locationByProgram hadoop` -test -n "$ZOOKEEPER_HOME" || export ZOOKEEPER_HOME=`locationByProgram zkCli.sh` - +test -z "${JAVA_HOME}" && locationByProgram java JAVA_HOME +test -z "${HADOOP_PREFIX}" && locationByProgram hadoop HADOOP_PREFIX +test -z "${ZOOKEEPER_HOME}" && locationByProgram zkCli.sh ZOOKEEPER_HOME DEFAULT_GENERAL_JAVA_OPTS="" -BIG=6g -MED=3g -SMALL=512m -if ! "$JAVA_HOME/bin/java" -Xms10g -Xmx10g >/dev/null 2>&1 ; then - BIG=3g - MED=1g - SMALL=256m -fi - -test -n "$ACCUMULO_TSERVER_OPTS" || export ACCUMULO_TSERVER_OPTS="-Xmx$BIG -Xms$BIG " -test -n "$ACCUMULO_MASTER_OPTS" || export ACCUMULO_MASTER_OPTS="-Xmx$MED -Xms$MED " -test -n "$ACCUMULO_GC_OPTS" || export ACCUMULO_GC_OPTS="-Xmx$SMALL -Xms$SMALL " -test -n "$ACCUMULO_MONITOR_OPTS" || export ACCUMULO_MONITOR_OPTS="-Xmx$MED -Xms$SMALL " -test -n "$ACCUMULO_LOGGER_OPTS" || export ACCUMULO_LOGGER_OPTS="-Xmx$MED -Xms$SMALL " -test -n "$ACCUMULO_GENERAL_OPTS" || export ACCUMULO_GENERAL_OPTS="$DEFAULT_GENERAL_JAVA_OPTS" -test -n "$ACCUMULO_OTHER_OPTS" || export ACCUMULO_OTHER_OPTS="-Xmx$MED -Xms$SMALL " +# # ACCUMULO_XTRAJARS is where all of the commandline -add items go into for reading by accumulo. +# if [ "$1" = "-add" ] ; then - export ACCUMULO_XTRAJARS=$2 - shift 2 + export ACCUMULO_XTRAJARS="$2" + shift 2 else - export ACCUMULO_XTRAJARS="" + export ACCUMULO_XTRAJARS="" fi -if [ "$1" = "master" ] ; then - export ACCUMULO_OPTS="${ACCUMULO_GENERAL_OPTS} ${ACCUMULO_MASTER_OPTS}" -elif [ "$1" = "gc" ] ; then - export ACCUMULO_OPTS="${ACCUMULO_GENERAL_OPTS} ${ACCUMULO_GC_OPTS}" -elif [ "$1" = "tserver" ] ; then - export ACCUMULO_OPTS="${ACCUMULO_GENERAL_OPTS} ${ACCUMULO_TSERVER_OPTS}" -elif [ "$1" = "monitor" ] ; then - export ACCUMULO_OPTS="${ACCUMULO_GENERAL_OPTS} ${ACCUMULO_MONITOR_OPTS}" -elif [ "$1" = "logger" ] ; then - export ACCUMULO_OPTS="${ACCUMULO_GENERAL_OPTS} ${ACCUMULO_LOGGER_OPTS}" -else - export ACCUMULO_OPTS="${ACCUMULO_GENERAL_OPTS} ${ACCUMULO_OTHER_OPTS}" +# +# Add appropriate options for process type +# +case "$1" in +master) export ACCUMULO_OPTS="${ACCUMULO_GENERAL_OPTS} ${ACCUMULO_MASTER_OPTS}" ;; +gc) export ACCUMULO_OPTS="${ACCUMULO_GENERAL_OPTS} ${ACCUMULO_GC_OPTS}" ;; +tserver) export ACCUMULO_OPTS="${ACCUMULO_GENERAL_OPTS} ${ACCUMULO_TSERVER_OPTS}" ;; +monitor) export ACCUMULO_OPTS="${ACCUMULO_GENERAL_OPTS} ${ACCUMULO_MONITOR_OPTS}" ;; +logger) export ACCUMULO_OPTS="${ACCUMULO_GENERAL_OPTS} ${ACCUMULO_LOGGER_OPTS}" ;; +*) export ACCUMULO_OPTS="${ACCUMULO_GENERAL_OPTS} ${ACCUMULO_OTHER_OPTS}" ;; +esac + +XML_FILES="${ACCUMULO_CONF_DIR}" +LOG4J_JAR=$(find "${HADOOP_PREFIX}/lib" "${HADOOP_PREFIX}"/share/hadoop/common/lib -name 'log4j*.jar' -print 2>/dev/null | head -1) +CLASSPATH="${XML_FILES}:${START_JAR}:${LOG4J_JAR}" + +if [ -z "${JAVA_HOME}" -o ! -d "${JAVA_HOME}" ]; then + echo "JAVA_HOME is not set or is not a directory. Please make sure it's set globally or in conf/accumulo-env.sh" + exit 1 +fi +if [ -z "${HADOOP_PREFIX}" -o ! -d "${HADOOP_PREFIX}" ]; then + echo "HADOOP_PREFIX is not set or is not a directory. Please make sure it's set globally or in conf/accumulo-env.sh" + exit 1 +fi +if [ -z "${ZOOKEEPER_HOME}" -o ! -d "${ZOOKEEPER_HOME}" ]; then + echo "ZOOKEEPER_HOME is not set or is not a directory. Please make sure it's set globally or in conf/accumulo-env.sh" + exit 1 +fi +if [ -z "${ACCUMULO_LOG_DIR}" ]; then + echo "ACCUMULO_LOG_DIR is not set. Please make sure it's set globally or in conf/accumulo-env.sh" + exit 1 fi -XML_FILES=${ACCUMULO_CONF_DIR} -CLASSPATH=${XML_FILES}:${START_JAR}:${COMMONS_JCI_JARS} - -JAVA=$JAVA_HOME/bin/java -PLATFORM="`$JAVA -cp $CLASSPATH org.apache.accumulo.start.Platform`" +if [ ! -d "${ACCUMULO_LOG_DIR}" ]; then + mkdir -p "$ACCUMULO_LOG_DIR" +fi +# Export the variables just in case they are not exported +# This makes them available to java +export JAVA_HOME HADOOP_PREFIX ZOOKEEPER_HOME + +JAVA="${JAVA_HOME}/bin/java" +PLATFORM=$( "${JAVA}" -cp "${CLASSPATH}" org.apache.accumulo.start.Platform ) +# hadoop 1.0, 1.1 +LIB_PATH="${HADOOP_PREFIX}/lib/native/${PLATFORM}" +if [ ! -d "${LIB_PATH}" ]; then + # hadoop-2.0 + LIB_PATH="${HADOOP_PREFIX}/lib/native" +fi +# # app isn't used anywhere, but it makes the process easier to spot when ps/top/snmp truncate the command line - exec $JAVA "-Dapp=$1" $ACCUMULO_OPTS -classpath "${CLASSPATH}" -XX:OnOutOfMemoryError="kill -9 %p" \ -exec $JAVA "-Dapp=$1" -classpath $CLASSPATH $ACCUMULO_OPTS -XX:OnOutOfMemoryError="${ACCUMULO_KILL_CMD:-kill -9 %p}" -Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl -Djava.library.path="$HADOOP_HOME/lib/native/$PLATFORM" -Dorg.apache.accumulo.core.home.dir="$ACCUMULO_HOME" -Dhadoop.home.dir="$HADOOP_HOME" -Dzookeeper.home.dir="$ZOOKEEPER_HOME" org.apache.accumulo.start.Main "$@" ++exec $JAVA "-Dapp=$1" $ACCUMULO_OPTS -classpath "${CLASSPATH}" -XX:OnOutOfMemoryError="${ACCUMULO_KILL_CMD:-kill -9 %p}" \ + -Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl \ + -Djava.library.path="${LIB_PATH}" \ + -Dorg.apache.accumulo.core.home.dir="${ACCUMULO_HOME}" \ + -Dhadoop.home.dir="${HADOOP_PREFIX}" \ + -Dzookeeper.home.dir="${ZOOKEEPER_HOME}" \ + org.apache.accumulo.start.Main \ + "$@"
