#!/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.
#
#

#===========================================================================================
# Java 环境设置
#===========================================================================================
error_exit ()
{
    echo "ERROR: $1 !!"
    exit 1
}


check_java_version ()
{
  _java=$1
  _version=$2
  version=$("$_java" -version 2>&1 | awk -F '"' '/version/ {print $2}' | grep -o '^[0-9.]\+')
  flag="true"
  if [[ $(echo "$version < $_version" | bc) -eq 1 ]]; then
      flag="false"
  fi

  if [[ $("$_java" -version 2>&1) != *"64-Bit"* ]]; then
      flag="false"
  fi

  echo $flag
}

check_java_opts ()
{
  export IFS=" "
  flag="true"
  count=0
  for opt in $1; do
    if [[ $opt == *"-Xms"* ]]; then
        xms=`echo $opt | tr -d -c 0-9`
        if [[ $xms -lt 4 ]]; then
            flag="false"
        fi
        (( count++ ))
    fi
    if [[ $opt == *"-Xmx"* ]]; then
        xmx=`echo $opt | tr -d -c 0-9`
        if [[ $xmx -lt 4 ]]; then
            flag="false"
        fi
        (( count++ ))
    fi
  done
  if [[ $count -lt 2 ]]; then
      flag="false"
  fi
  echo $flag
}

[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
[ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"

export JAVA_HOME
export JAVA="$JAVA_HOME/bin/java"
export BASE_DIR=$(dirname $0)/..
export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH}
export LANG=en_US.UTF-8


#===========================================================================================
# JVM Parameters Configuration
#===========================================================================================

JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -XX:PermSize=128m -XX:MaxPermSize=320m"
JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:SurvivorRatio=8 -XX:+DisableExplicitGC"
JAVA_OPT="${JAVA_OPT} -verbose:gc"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT="${JAVA_OPT} -XX:+AlwaysPreTouch"
JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=10g"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages -XX:-UseBiasedLocking"
if [[ $(check_java_version "$JAVA" "9") == "false" ]]; then
  JAVA_OPT="${JAVA_OPT} -Xloggc:/dev/shm/mq_gc_%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy"
  JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m"
  JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${BASE_DIR}/lib:${JAVA_HOME}/jre/lib/ext"
  JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"
else
  JAVA_OPT="${JAVA_OPT} -Xlog:gc:/dev/shm/mq_gc_%p.log -Xlog:gc*"
  JAVA_OPT="${JAVA_OPT} -cp $(find "${BASE_DIR}/lib" -name '*.jar' | sed ':a;N;s/\n/:/;ba;'):${CLASSPATH}"
fi
JAVA_OPT="${JAVA_OPT} -DisSyncFlush=false"

#===========================================================================================
# Log Configuration for auth module.
#===========================================================================================
JAVA_OPT="${JAVA_OPT} -Dons.api.loggingCharset=UTF-8"
JAVA_OPT="${JAVA_OPT} -Dons.api.loggingLevel=INFO"

#===========================================================================================
# SSL Configuration
#===========================================================================================
JAVA_OPT="${JAVA_OPT} -Dtls.server.mode=disabled"
JAVA_OPT="${JAVA_OPT} -Dtls.private.key.encrypted=false"
JAVA_OPT="${JAVA_OPT} -Djdk.tls.rejectClientInitiatedRenegotiation=true"

if [[ $(check_java_opts "$JAVA_OPT") == "false" ]]; then
    error_exit "Too small heap mem size or Xms/Xms/Xmn are missing, we need Xms >= 4g, Xmx >= 4g and Xmn >= 2g."
fi

if [[ $(check_java_version "$JAVA" "1.7") == "false" ]]; then
    error_exit "Java version is too low, we need java(x64) 1.7+!"
fi

numactl --interleave=all pwd > /dev/null 2>&1
if [ $? -eq 0 ]
then
    exec numactl --interleave=all $JAVA ${JAVA_OPT} $@
else
    exec $JAVA ${JAVA_OPT} $@
fi
