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

set -euo pipefail
. $IMPALA_HOME/bin/report_build_error.sh
setup_report_build_error

CLUSTER_BIN=${IMPALA_HOME}/testdata/bin
HBASE_JAAS_CLIENT=${HBASE_CONF_DIR}/hbase-jaas-client.conf
HBASE_JAAS_SERVER=${HBASE_CONF_DIR}/hbase-jaas-server.conf
HBASE_LOGDIR=${IMPALA_CLUSTER_LOGS_DIR}/hbase

# Kill and clean data for a clean start.
${CLUSTER_BIN}/kill-hbase.sh > /dev/null 2>&1

# Gives HBase startup the proper environment
cat > ${HBASE_CONF_DIR}/hbase-env.sh <<EOF
#
# This file is auto-generated by run-hbase.sh.  Do not edit.
#
export JAVA_HOME=${JAVA_HOME}
export HBASE_LOG_DIR=${HBASE_LOGDIR}
export HBASE_PID_DIR=${HBASE_LOGDIR}
export HBASE_CLASSPATH=${HADOOP_CLASSPATH}
export HBASE_HEAPSIZE=1g
EOF

# Put zookeeper things in the logs/cluster/zoo directory.
# (See hbase.zookeeper.property.dataDir in hbase-site.xml)
rm -rf ${IMPALA_CLUSTER_LOGS_DIR}/zoo
mkdir -p ${IMPALA_CLUSTER_LOGS_DIR}/zoo
mkdir -p ${HBASE_LOGDIR}

if ${CLUSTER_DIR}/admin is_kerberized; then
  #
  # Making a kerberized cluster... set some more environment
  # variables and other magic.
  #
  . ${MINIKDC_ENV}

  if [ ! -f "${HBASE_JAAS_CLIENT}" ]; then
    echo "Can't find ${HBASE_JAAS_CLIENT}"
    exit 1
  fi

  if [ ! -f "${HBASE_JAAS_SERVER}" ]; then
    echo "Can't find ${HBASE_JAAS_SERVER}"
    exit 1
  fi

  # Catch the case where the /hbase directory is not owned by the
  # hbase user.  This can happen when the cluster was formed without
  # kerberos and then remade with "create-test-configuration.sh -k".
  if HBASE_LS_OUTPUT=`hadoop fs -ls -d /hbase 2>&1`; then
    if echo ${HBASE_LS_OUTPUT} | tail -n 1 | grep -q -v " hbase "; then
      # /hbase not owned by 'hbase'.  Failure.
      echo "The HDFS /hbase directory is not owned by \"hbase\"."
      echo "This can happen if the cluster was created with kerberos,"
      echo "and then switched to kerberos without a reformat."
    fi
  fi

  # These ultimately become args to java when it starts up hbase
  K1="-Djava.security.krb5.conf=${KRB5_CONFIG}"
  K2="${JAVA_KRB5_DEBUG}"
  K3="-Djava.security.auth.login.config=${HBASE_JAAS_CLIENT}"
  K4="-Djava.security.auth.login.config=${HBASE_JAAS_SERVER}"

  # Add some kerberos things...
  cat >> ${HBASE_CONF_DIR}/hbase-env.sh <<EOF
export HBASE_OPTS="${K1} ${K2} ${K3}"
export HBASE_MANAGES_ZK=true
export HBASE_ZOOKEEPER_OPTS="${K1} ${K2} ${K4}"
export HBASE_MASTER_OPTS="${K1} ${K2} ${K4}"
export HBASE_REGIONSERVER_OPTS="${K1} ${K2} ${K4}"
EOF
fi

: ${HBASE_START_RETRY_ATTEMPTS=5}

# `rm -f` hbase startup output capture so that `tee -a` below appends
# only for the lifetime of this script
rm -f ${HBASE_LOGDIR}/hbase-startup.out ${HBASE_LOGDIR}/hbase-rs-startup.out

for ((i=1; i <= HBASE_START_RETRY_ATTEMPTS; ++i)); do
  echo "HBase start attempt: ${i}/${HBASE_START_RETRY_ATTEMPTS}"

  echo "Killing any HBase processes possibly lingering from previous start attempts"
  ${IMPALA_HOME}/testdata/bin/kill-hbase.sh
  if ((i > 1)); then
    HBASE_WAIT_AFTER_KILL=$((${i} * 2))
    echo "Waiting ${HBASE_WAIT_AFTER_KILL} seconds before trying again..."
    sleep ${HBASE_WAIT_AFTER_KILL}
  fi

  if ((i < HBASE_START_RETRY_ATTEMPTS)); then
    # Here, we don't want errexit to take effect, so we use if blocks to control the flow.
    if ! ${HBASE_HOME}/bin/start-hbase.sh 2>&1 | tee -a ${HBASE_LOGDIR}/hbase-startup.out
    then
      echo "HBase Master startup failed"
      continue
    fi
    if ! ${HBASE_HOME}/bin/local-regionservers.sh start 2 3 2>&1 | \
        tee -a ${HBASE_LOGDIR}/hbase-rs-startup.out
    then
      echo "HBase regionserver startup failed"
      continue
    fi
    if ! ${CLUSTER_BIN}/check-hbase-nodes.py; then
      echo "HBase nodes did not come online"
      continue
    fi
    # If we made it to here, HBase started up correctly so we can stop the retry logic.
    break
  else
    # In the last iteration, it's fine for errexit to do its thing.
    ${HBASE_HOME}/bin/start-hbase.sh 2>&1 | tee -a ${HBASE_LOGDIR}/hbase-startup.out
    ${HBASE_HOME}/bin/local-regionservers.sh start 2 3 2>&1 | \
        tee -a ${HBASE_LOGDIR}/hbase-rs-startup.out
    ${CLUSTER_BIN}/check-hbase-nodes.py
  fi

done
echo "HBase startup scripts succeeded"
