From 80fd25c08eb30c73d4b21cb4f7dd764260d04a34 Mon Sep 17 00:00:00 2001 From: haydenmarchant Date: Tue, 24 Jun 2014 04:29:45 -0700 Subject: [PATCH] ACCUMULO-2944 Fixes harded coded Sun JVM in config and env ACCUMULO-2944 Addressing the issue raised in JIRA 2944, this is ensuring that Accumulo will be correctly configured for any Java vendor. A new question is being asked in the bootstrap_config.sh for Java vendor. This is then used to set GC settings, exclude/include JAXP implementation in ACCUMULO_OPTS. Also, default NRG provider is being injected as system property on command line since IBM JVM does not have SUN registered as default provider. --- assemble/bin/accumulo | 1 - assemble/bin/bootstrap_config.sh | 148 +++++++++++------- assemble/conf/templates/accumulo-env.sh | 3 +- .../impl/MiniAccumuloClusterImpl.java | 9 +- 4 files changed, 101 insertions(+), 60 deletions(-) diff --git a/assemble/bin/accumulo b/assemble/bin/accumulo index bdd742d7aee..a4b5617155d 100755 --- a/assemble/bin/accumulo +++ b/assemble/bin/accumulo @@ -163,7 +163,6 @@ exec $JAVA "-Dapp=$1" \ -classpath "${CLASSPATH}" \ -XX:OnOutOfMemoryError="${ACCUMULO_KILL_CMD:-kill -9 %p}" \ -XX:-OmitStackTraceInFastThrow \ - -Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl \ -Dorg.apache.accumulo.core.home.dir="${ACCUMULO_HOME}" \ -Dhadoop.home.dir="${HADOOP_PREFIX}" \ -Dzookeeper.home.dir="${ZOOKEEPER_HOME}" \ diff --git a/assemble/bin/bootstrap_config.sh b/assemble/bin/bootstrap_config.sh index fb643daf2f9..f82c2a649b4 100755 --- a/assemble/bin/bootstrap_config.sh +++ b/assemble/bin/bootstrap_config.sh @@ -25,6 +25,7 @@ where options include (long options not available on all platforms): -j, --jvm Configure to use the jvm -o, --overwrite Overwrite the default config directory -v, --version Specify the Apache Hadoop version supported versions: '1' '2' + -x --vendor Specify the vendor of the Java Virtual Machine in which Accumulo will run: 'Sun', 'OpenJDK', 'IBM' & 'Other' -h, --help Print this help message EOF } @@ -57,9 +58,9 @@ BASE_DIR= #Execute getopt if [[ $(uname -s) == "Linux" ]]; then - args=$(getopt -o "b:d:s:njov:h" -l "basedir:,dir:,size:,native,jvm,overwrite,version:,help" -q -- "$@") + args=$(getopt -o "b:d:s:njov:x:h" -l "basedir:,dir:,size:,native,jvm,overwrite,version:,vendor:,help" -q -- "$@") else # Darwin, BSD - args=$(getopt b:d:s:njov:h $*) + args=$(getopt b:d:s:njov:x:h $*) fi #Bad arguments @@ -93,6 +94,9 @@ do -v|--version) HADOOP_VERSION=$2; shift shift;; + -x|--vendor) + JVM_VENDOR=$2; shift + shift;; -h|--help) usage exit 0 @@ -123,6 +127,86 @@ while [[ "${OVERWRITE}" = "0" ]]; do done echo "Coppying configuration files to: ${CONF_DIR}" +if [[ -z "${SIZE}" ]]; then + echo "Choose the heap configuration:" + select DIRNAME in 1GB 2GB 3GB 512MB; do + echo "Using '${DIRNAME}' configuration" + SIZE=${DIRNAME} + break + done +elif [[ "${SIZE}" != "1GB" && "${SIZE}" != "2GB" && "${SIZE}" != "3GB" && "${SIZE}" != "512MB" ]]; then + echo "Invalid memory size" + echo "Supported sizes: '1GB' '2GB' '3GB' '512MB'" + exit 1 +fi + +if [[ -z "${TYPE}" ]]; then + echo + echo "Choose the Accumulo memory-map type:" + select TYPENAME in Java Native; do + if [[ "${TYPENAME}" == "Native" ]]; then + TYPE="native" + echo "Don't forget to build the native libraries using the bin/build_native_library.sh script" + elif [[ "${TYPENAME}" == "Java" ]]; then + TYPE="jvm" + fi + echo "Using '${TYPE}' configuration" + echo + break + done +fi + +if [[ -z "${HADOOP_VERSION}" ]]; then + echo + echo "Choose the Apache Hadoop version:" + select HADOOP in 'HADOOP 1' 'HADOOP 2' ; do + if [ "${HADOOP}" == "HADOOP 2" ]; then + HADOOP_VERSION="2" + elif [ "${HADOOP}" == "HADOOP 1" ]; then + HADOOP_VERSION="1" + fi + echo "Using Apache Hadoop version '${HADOOP_VERSION}' configuration" + echo + break + done +elif [[ "${HADOOP_VERSION}" != "1" && "${HADOOP_VERSION}" != "2" ]]; then + echo "Invalid Apache Hadoop version" + echo "Supported Apache Hadoop versions: '1' '2'" + exit 1 +fi + +for var in SIZE TYPE HADOOP_VERSION; do + if [[ -z ${!var} ]]; then + echo "Invalid $var configuration" + exit 1 + fi +done + +if [[ -z "${JVM_VENDOR}" ]]; then + echo + echo "Choose Java vendor:" + select SEL_JVM_VENDOR in Sun OpenJDK IBM Other; do + echo "Using configuration for ${SEL_JVM_VENDOR} JVM" + JVM_VENDOR=${SEL_JVM_VENDOR} + echo + break + done +fi + +if [[ "${JVM_VENDOR}" == "IBM" ]] ; then + GC_NEWSIZE_PREFIX="-Xmns" + GC_MAXNEWSIZE_PREFIX="-Xmnx" + GC_POLICY_ARGS="-Xgcpolicy:gencon" + JAXP_DOCUMENT_BUILDER_FACTORY_ARGS="" + RNG_PROVIDER_OVERRIDE_ARGS="-Dcrypto.secure.rng.provider=IBMJCE" +else + GC_NEWSIZE_PREFIX="-XX:NewSize=" + GC_MAXNEWSIZE_PREFIX="-XX:MaxNewSize=" + GC_POLICY_ARGS="-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75" + JAXP_DOCUMENT_BUILDER_FACTORY_ARGS="-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl" + RNG_PROVIDER_OVERRIDE_ARGS="" +fi + #Native 1GB native_1GB_tServer="-Xmx128m -Xms128m" _1GB_master="-Xmx128m -Xms128m" @@ -152,7 +236,7 @@ _2GB_sortBufferSize="50M" _2GB_waLogMaxSize="512M" #Native 3GB -native_3GB_tServer="-Xmx1g -Xms1g -XX:NewSize=500m -XX:MaxNewSize=500m" +native_3GB_tServer="-Xmx1g -Xms1g ${GC_NEWSIZE_PREFIX}500m ${GC_MAXNEWSIZE_PREFIX}500m" _3GB_master="-Xmx1g -Xms1g" _3GB_monitor="-Xmx1g -Xms256m" _3GB_gc="-Xmx256m -Xms256m" @@ -190,7 +274,7 @@ jvm_2GB_tServer="-Xmx768m -Xms768m" jvm_2GB_nativeEnabled="false" #JVM 3GB -jvm_3GB_tServer="-Xmx2g -Xms2g -XX:NewSize=1G -XX:MaxNewSize=1G" +jvm_3GB_tServer="-Xmx2g -Xms2g ${GC_NEWSIZE_PREFIX}1G ${GC_MAXNEWSIZE_PREFIX}1G" jvm_3GB_nativeEnabled="false" @@ -200,60 +284,7 @@ jvm_512MB_tServer="-Xmx128m -Xms128m" jvm_512MB_nativeEnabled="false" -if [[ -z "${SIZE}" ]]; then - echo "Choose the heap configuration:" - select DIRNAME in 1GB 2GB 3GB 512MB; do - echo "Using '${DIRNAME}' configuration" - SIZE=${DIRNAME} - break - done -elif [[ "${SIZE}" != "1GB" && "${SIZE}" != "2GB" && "${SIZE}" != "3GB" && "${SIZE}" != "512MB" ]]; then - echo "Invalid memory size" - echo "Supported sizes: '1GB' '2GB' '3GB' '512MB'" - exit 1 -fi - -if [[ -z "${TYPE}" ]]; then - echo - echo "Choose the Accumulo memory-map type:" - select TYPENAME in Java Native; do - if [[ "${TYPENAME}" == "Native" ]]; then - TYPE="native" - echo "Don't forget to build the native libraries using the bin/build_native_library.sh script" - elif [[ "${TYPENAME}" == "Java" ]]; then - TYPE="jvm" - fi - echo "Using '${TYPE}' configuration" - echo - break - done -fi - -if [[ -z "${HADOOP_VERSION}" ]]; then - echo - echo "Choose the Apache Hadoop version:" - select HADOOP in 'HADOOP 1' 'HADOOP 2' ; do - if [ "${HADOOP}" == "HADOOP 2" ]; then - HADOOP_VERSION="2" - elif [ "${HADOOP}" == "HADOOP 1" ]; then - HADOOP_VERSION="1" - fi - echo "Using Apache Hadoop version '${HADOOP_VERSION}' configuration" - echo - break - done -elif [[ "${HADOOP_VERSION}" != "1" && "${HADOOP_VERSION}" != "2" ]]; then - echo "Invalid Apache Hadoop version" - echo "Supported Apache Hadoop versions: '1' '2'" - exit 1 -fi -for var in SIZE TYPE HADOOP_VERSION; do - if [[ -z ${!var} ]]; then - echo "Invalid $var configuration" - exit 1 - fi -done TSERVER="${TYPE}_${SIZE}_tServer" MASTER="_${SIZE}_master" @@ -281,6 +312,9 @@ sed -e "s/\${tServerHigh_tServerLow}/${!TSERVER}/" \ -e "s/\${monitorHigh_monitorLow}/${!MONITOR}/" \ -e "s/\${gcHigh_gcLow}/${!GC}/" \ -e "s/\${otherHigh_otherLow}/${!OTHER}/" \ + -e "s/\${gcPolicy}/$GC_POLICY_ARGS/" \ + -e "s/\${jaxpDocBuilderFactory}/$JAXP_DOCUMENT_BUILDER_FACTORY_ARGS/" \ + -e "s/\${randomNumGeneratorProviderOverride}/$RNG_PROVIDER_OVERRIDE_ARGS/" \ ${TEMPLATE_CONF_DIR}/$ACCUMULO_ENV > ${CONF_DIR}/$ACCUMULO_ENV #Configure accumulo-site.xml diff --git a/assemble/conf/templates/accumulo-env.sh b/assemble/conf/templates/accumulo-env.sh index e136a3f41a8..137ee7d8a8a 100644 --- a/assemble/conf/templates/accumulo-env.sh +++ b/assemble/conf/templates/accumulo-env.sh @@ -51,10 +51,11 @@ test -z "$ACCUMULO_TSERVER_OPTS" && export ACCUMULO_TSERVER_OPTS="${POLICY} ${tS test -z "$ACCUMULO_MASTER_OPTS" && export ACCUMULO_MASTER_OPTS="${POLICY} ${masterHigh_masterLow}" test -z "$ACCUMULO_MONITOR_OPTS" && export ACCUMULO_MONITOR_OPTS="${POLICY} ${monitorHigh_monitorLow}" test -z "$ACCUMULO_GC_OPTS" && export ACCUMULO_GC_OPTS="${gcHigh_gcLow}" -test -z "$ACCUMULO_GENERAL_OPTS" && export ACCUMULO_GENERAL_OPTS="-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -Djava.net.preferIPv4Stack=true" +test -z "$ACCUMULO_GENERAL_OPTS" && export ACCUMULO_GENERAL_OPTS="${gcPolicy} -Djava.net.preferIPv4Stack=true ${jaxpDocBuilderFactory} ${randomNumGeneratorProviderOverride}" test -z "$ACCUMULO_OTHER_OPTS" && export ACCUMULO_OTHER_OPTS="${otherHigh_otherLow}" # what do when the JVM runs out of heap memory export ACCUMULO_KILL_CMD='kill -9 %p' +export GC_POLICY_ARGS="${gcPolicy}" ### Optionally look for hadoop and accumulo native libraries for your ### platform in additional directories. (Use DYLD_LIBRARY_PATH on Mac OS X.) diff --git a/minicluster/src/main/java/org/apache/accumulo/minicluster/impl/MiniAccumuloClusterImpl.java b/minicluster/src/main/java/org/apache/accumulo/minicluster/impl/MiniAccumuloClusterImpl.java index 977968ec3da..8195324a2d5 100644 --- a/minicluster/src/main/java/org/apache/accumulo/minicluster/impl/MiniAccumuloClusterImpl.java +++ b/minicluster/src/main/java/org/apache/accumulo/minicluster/impl/MiniAccumuloClusterImpl.java @@ -259,7 +259,14 @@ private Process _exec(Class clazz, List extraJvmOpts, String... args) for (Entry sysProp : config.getSystemProperties().entrySet()) { argList.add(String.format("-D%s=%s", sysProp.getKey(), sysProp.getValue())); } - argList.addAll(Arrays.asList("-XX:+UseConcMarkSweepGC", "-XX:CMSInitiatingOccupancyFraction=75", "-Dapple.awt.UIElement=true", Main.class.getName(), className)); + + String gcPolicyArgs = System.getenv("GC_POLICY_ARGS"); + if (gcPolicyArgs == null) { + gcPolicyArgs = "-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75"; + } + String[] gcPolicyArgsArr = gcPolicyArgs.split("\\s+"); + argList.addAll(Arrays.asList(gcPolicyArgsArr)); + argList.addAll(Arrays.asList("-Dapple.awt.UIElement=true", Main.class.getName(), className)); argList.addAll(Arrays.asList(args)); ProcessBuilder builder = new ProcessBuilder(argList);