| #!/usr/bin/env bash |
| # |
| # 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. |
| # |
| |
| BINDIR=$(dirname "$0") |
| export PULSAR_HOME=`cd -P $BINDIR/..;pwd` |
| |
| DEFAULT_LOG_CONF=$PULSAR_HOME/conf/log4j2.yaml |
| |
| PULSAR_MEM=${PULSAR_MEM:-"-Xmx128m -XX:MaxDirectMemorySize=128m"} |
| |
| # Garbage collection options |
| PULSAR_GC=${PULSAR_GC:-"-XX:+UseG1GC -XX:MaxGCPauseMillis=10 -XX:+ParallelRefProcEnabled -XX:+UnlockExperimentalVMOptions -XX:+DoEscapeAnalysis -XX:G1NewSizePercent=50 -XX:+DisableExplicitGC -XX:-ResizePLAB"} |
| |
| # Garbage collection log. |
| IS_JAVA_8=`java -version 2>&1 |grep version|grep '"1\.8'` |
| # java version has space, use [[ -n $PARAM ]] to judge if variable exists |
| if [[ -n $IS_JAVA_8 ]]; then |
| PULSAR_GC_LOG=${PULSAR_GC_LOG:-"-Xloggc:logs/pulsar_gc_%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=20M"} |
| else |
| # After jdk 9, gc log param should config like this. Ignoring version less than jdk 8 |
| PULSAR_GC_LOG=${PULSAR_GC_LOG:-"-Xlog:gc:logs/pulsar_gc_%p.log:time,uptime:filecount=10,filesize=20M"} |
| fi |
| |
| # Extra options to be passed to the jvm |
| PULSAR_EXTRA_OPTS=${PULSAR_EXTRA_OPTS:-" -Dpulsar.allocator.exit_on_oom=true -Dio.netty.recycler.maxCapacityPerThread=4096"} |
| |
| # Check for the java to use |
| if [[ -z $JAVA_HOME ]]; then |
| JAVA=$(which java) |
| if [ $? != 0 ]; then |
| echo "Error: JAVA_HOME not set, and no java executable found in $PATH." 1>&2 |
| exit 1 |
| fi |
| else |
| JAVA=$JAVA_HOME/bin/java |
| fi |
| |
| if [ -z "$PULSAR_LOG_CONF" ]; then |
| PULSAR_LOG_CONF=$DEFAULT_LOG_CONF |
| fi |
| |
| add_maven_deps_to_classpath() { |
| MVN="mvn" |
| if [ "$MAVEN_HOME" != "" ]; then |
| MVN=${MAVEN_HOME}/bin/mvn |
| fi |
| |
| # Need to generate classpath from maven pom. This is costly so generate it |
| # and cache it. Save the file into our target dir so a mvn clean will get |
| # clean it up and force us create a new one. |
| f="${PULSAR_HOME}/distribution/server/target/classpath.txt" |
| if [ ! -f "${f}" ] |
| then |
| ( |
| cd "${PULSAR_HOME}" |
| ${MVN} -pl distribution/server generate-sources &> /dev/null |
| ) |
| fi |
| PULSAR_CLASSPATH=${CLASSPATH}:`cat "${f}"` |
| } |
| |
| if [ -d "$PULSAR_HOME/lib" ]; then |
| PULSAR_CLASSPATH="$PULSAR_CLASSPATH:$PULSAR_HOME/lib/*" |
| else |
| add_maven_deps_to_classpath |
| fi |
| |
| PULSAR_CLASSPATH="$PULSAR_JAR:$PULSAR_CLASSPATH:$PULSAR_EXTRA_CLASSPATH" |
| PULSAR_CLASSPATH="`dirname $PULSAR_LOG_CONF`:$PULSAR_CLASSPATH" |
| OPTS="$OPTS -Dlog4j.configurationFile=`basename $PULSAR_LOG_CONF`" |
| |
| # Allow Netty to use reflection access |
| OPTS="$OPTS -Dio.netty.tryReflectionSetAccessible=true" |
| |
| # Ensure we can read bigger content from ZK. (It might be |
| # rarely needed when trying to list many z-nodes under a |
| # directory) |
| OPTS="$OPTS -Djute.maxbuffer=10485760 -Djava.net.preferIPv4Stack=true" |
| |
| OPTS="-cp $PULSAR_CLASSPATH $OPTS" |
| |
| # we should exit on OOM for localrun especially when using ThreadRuntime |
| PULSAR_EXTRA_OPTS="$PULSAR_EXTRA_OPTS -XX:+ExitOnOutOfMemoryError" |
| |
| OPTS="$OPTS $PULSAR_EXTRA_OPTS $PULSAR_MEM $PULSAR_GC" |
| |
| # functions related variables |
| FUNCTIONS_HOME=$PULSAR_HOME/pulsar-functions |
| DEFAULT_JAVA_INSTANCE_JAR=$PULSAR_HOME/instances/java-instance.jar |
| JAVA_INSTANCE_JAR=${PULSAR_JAVA_INSTANCE_JAR:-"${DEFAULT_JAVA_INSTANCE_JAR}"} |
| DEFAULT_PY_INSTANCE_FILE=$PULSAR_HOME/instances/python-instance/python_instance_main.py |
| PY_INSTANCE_FILE=${PULSAR_PY_INSTANCE_FILE:-"${DEFAULT_PY_INSTANCE_FILE}"} |
| |
| # find the java instance location |
| if [ ! -f "${JAVA_INSTANCE_JAR}" ]; then |
| # didn't find a released jar, then search the built jar |
| BUILT_JAVA_INSTANCE_JAR="${FUNCTIONS_HOME}/runtime-all/target/java-instance.jar" |
| if [ -f "${BUILT_JAVA_INSTANCE_JAR}" ]; then |
| JAVA_INSTANCE_JAR=${BUILT_JAVA_INSTANCE_JAR} |
| else |
| echo "\nCouldn't find pulsar java instance jar."; |
| echo "Make sure you've run 'mvn package'\n"; |
| exit 1; |
| fi |
| fi |
| |
| # find the python instance location |
| if [ ! -f "${PY_INSTANCE_FILE}" ]; then |
| # didn't find a released python instance, then search the built python instance |
| BUILT_PY_INSTANCE_FILE="${FUNCTIONS_HOME}/instance/target/python-instance/python_instance_main.py" |
| if [ -f "${BUILT_PY_INSTANCE_FILE}" ]; then |
| PY_INSTANCE_FILE=${BUILT_PY_INSTANCE_FILE} |
| else |
| echo "\nCouldn't find pulsar python instance."; |
| echo "Make sure you've run 'mvn package'\n"; |
| exit 1; |
| fi |
| fi |
| |
| # functions |
| OPTS="$OPTS -Dpulsar.functions.java.instance.jar=${JAVA_INSTANCE_JAR}" |
| OPTS="$OPTS -Dpulsar.functions.python.instance.file=${PY_INSTANCE_FILE}" |
| |
| MAINCLASS="org.apache.pulsar.functions.LocalRunner" |
| |
| #Change to PULSAR_HOME to support relative paths |
| cd "$PULSAR_HOME" |
| |
| exec $JAVA $OPTS $MAINCLASS "$@" |