morningman commented on code in PR #16733: URL: https://github.com/apache/doris/pull/16733#discussion_r1107000991
########## docker/runtime/broker/resource/init_broker.sh: ########## @@ -16,95 +16,178 @@ # specific language governing permissions and limitations # under the License. -FE_SERVERS="" -BROKER_ADDR="" +set -eo pipefail +shopt -s nullglob -ARGS=$(getopt -o -h: --long fe_servers:,broker_addr: -n "$0" -- "$@") +DORIS_HOME="/opt/apache-doris" -eval set -- "${ARGS}" +# Obtain necessary and basic information to complete initialization -while [[ -n "$1" ]]; do - case "$1" in - --fe_servers) - FE_SERVERS=$2 - shift - ;; - --broker_addr) - BROKER_ADDR=$2 - shift - ;; - --) ;; +# logging functions +# usage: doris_[note|warn|error] $log_meg +# ie: doris_warn "task may BROKER risky!" +# out: 2023-01-08T19:08:16+08:00 [Warn] [Entrypoint]: task may BROKER risky! +doris_log() { + local type="$1" + shift + # accept argument string or stdin + local text="$*" + if [ "$#" -eq 0 ]; then text="$(cat)"; fi + local dt="$(date -Iseconds)" + printf '%s [%s] [Entrypoint]: %s\n' "$dt" "$type" "$text" +} +doris_note() { + doris_log Note "$@" +} +doris_warn() { + doris_log Warn "$@" >&2 +} +doris_error() { + doris_log ERROR "$@" >&2 + exit 1 +} - *) - echo "Error option $1" - break - ;; - esac - shift -done - -#echo FE_SERVERS = $FE_SERVERS -echo "DEBUG >>>>>> FE_SERVERS=[${FE_SERVERS}]" -echo "DEBUG >>>>>> BROKER_ADDR=[${BROKER_ADDR}]" +# check to see if this file is BROKERing run or sourced from another script +_is_sourced() { + [ "${#FUNCNAME[@]}" -ge 2 ] && + [ "${FUNCNAME[0]}" = '_is_sourced' ] && + [ "${FUNCNAME[1]}" = 'source' ] +} -feIpArray=() -feEditLogPortArray=() +# Check the variables required for startup +docker_required_variables_env() { + if [[ $FE_SERVERS =~ ^.+:[1-2]{0,1}[0-9]{0,1}[0-9]{1}(\.[1-2]{0,1}[0-9]{0,1}[0-9]{1}){3}:[1-6]{0,1}[0-9]{1,4}(,.+:[1-2]{0,1}[0-9]{0,1}[0-9]{1}(\.[1-2]{0,1}[0-9]{0,1}[0-9]{1}){3}:[1-6]{0,1}[0-9]{1,4})*$ ]]; then + doris_warn "FE_SERVERS" $FE_SERVERS + else + doris_error "FE_SERVERS rule error!example: \$FE_NAME:\$FE_HOST_IP:\$FE_EDIT_LOG_PORT[,\$FE_NAME:\$FE_HOST_IP:\$FE_EDIT_LOG_PORT]..." + fi + if [[ $BROKER_ADDR =~ ^[a-zA-Z0-9]+:[1-2]{0,1}[0-9]{0,1}[0-9]{1}(\.[1-2]{0,1}[0-9]{0,1}[0-9]{1}){3}:[1-6]{0,1}[0-9]{1,4}$ ]]; then + doris_warn "BROKER_ADDR" $BROKER_ADDR + else + doris_error "BROKER_ADDR rule error!example: \$BROKER_NAME:\$BROKER_HOST_IP:\$BROKER_IPC_PORT" + fi +} -IFS="," -# shellcheck disable=SC2206 -feServerArray=(${FE_SERVERS}) - -for i in "${!feServerArray[@]}"; do - val=${feServerArray[i]} +get_doris_broker_args() { + local feServerArray=($(echo "${FE_SERVERS}" | awk '{gsub (/,/," "); print $0}')) + for i in "${feServerArray[@]}"; do + val=${i} val=${val// /} tmpFeId=$(echo "${val}" | awk -F ':' '{ sub(/fe/, ""); sub(/ /, ""); print$1}') tmpFeIp=$(echo "${val}" | awk -F ':' '{ sub(/ /, ""); print$2}') tmpFeEditLogPort=$(echo "${val}" | awk -F ':' '{ sub(/ /, ""); print$3}') - feIpArray[tmpFeId]=${tmpFeIp} - feEditLogPortArray[tmpFeId]=${tmpFeEditLogPort} -done + check_arg "tmpFeIp" $tmpFeIp + feIpArray[$tmpFeId]=${tmpFeIp} + check_arg "tmpFeEditLogPort" $tmpFeEditLogPort + feEditLogPortArray[$tmpFeId]=${tmpFeEditLogPort} + done -broker_name=$(echo "${BROKER_ADDR}" | awk -F ':' '{ sub(/ /, ""); print$1}') -broker_ip=$(echo "${BROKER_ADDR}" | awk -F ':' '{ sub(/ /, ""); print$2}') -broker_ipc_port=$(echo "${BROKER_ADDR}" | awk -F ':' '{ sub(/ /, ""); print$3}') + declare -g MASTER_FE_IP BROKER_HOST_IP BROKER_IPC_PORT BROKER_NAME + MASTER_FE_IP=${feIpArray[1]} + check_arg "MASTER_FE_IP" $MASTER_FE_IP + BROKER_NAME=$(echo "${BROKER_ADDR}" | awk -F ':' '{ sub(/ /, ""); print$1}') + check_arg "BROKER_NAME" $BROKER_NAME + BROKER_HOST_IP=$(echo "${BROKER_ADDR}" | awk -F ':' '{ sub(/ /, ""); print$2}') + check_arg "BROKER_HOST_IP" $BROKER_HOST_IP + BROKER_IPC_PORT=$(echo "${BROKER_ADDR}" | awk -F ':' '{ sub(/ /, ""); print$3}') + check_arg "BROKER_IPC_PORT" $BROKER_IPC_PORT -echo "DEBUG >>>>>> feIpArray = ${feIpArray[*]}" -echo "DEBUG >>>>>> feEditLogPortArray = ${feEditLogPortArray[*]}" -echo "DEBUG >>>>>> masterFe = ${feIpArray[1]}:${feEditLogPortArray[1]}" -echo "DEBUG >>>>>> broker_addr = ${broker_ip}:${broker_ipc_port}" + doris_note "feIpArray = ${feIpArray[*]}" + doris_note "feEditLogPortArray = ${feEditLogPortArray[*]}" + doris_note "masterFe = ${feIpArray[1]}:${feEditLogPortArray[1]}" + doris_note "brokerAddr = ${BROKER_NAME}:${BROKER_HOST_IP}:${BROKER_IPC_PORT}" + # wait fe start + check_broker_status true +} -dropMySQL="/usr/bin/mysql -uroot -P9030 -h${feIpArray[1]} -e \"alter system drop broker ${broker_name} '${broker_ip}:${broker_ipc_port}'\"" -echo "DEBUG >>>>>> dropMySQL = ${dropMySQL}" -eval "${dropMySQL}" && echo "DEBUG >>>>>> drop history registe SUCCESS!" || echo "DEBUG >>>>>> drop history registe FAILED!" +# Execute sql script, passed via stdin +# usage: docker_process_sql sql_script +docker_process_sql() { + set +e + mysql -uroot -P9030 -h${MASTER_FE_IP} --comments "$@" 2>/dev/null +} -# register broker to FE through mysql -registerMySQL="/usr/bin/mysql -uroot -P9030 -h${feIpArray[1]} -e \"alter system add broker ${broker_name} '${broker_ip}:${broker_ipc_port}'\"" -echo "DEBUG >>>>>> registerMySQL = ${registerMySQL}" -eval "${registerMySQL}" && echo "DEBUG >>>>>> mysql register is SUCCESS!" || echo "DEBUG >>>>>> mysql register is FAILED!" +# register broker +register_broker_to_fe() { + set +e + # check fe status + local is_fe_start=false + for i in {1..300}; do + if [[ $(( $i % 20 )) == 1 ]]; then + doris_note "Register BROKER to FE is failed. retry." + fi + docker_process_sql <<<"alter system add broker ${BROKER_NAME} '${BROKER_HOST_IP}:${BROKER_IPC_PORT}'" + register_broker_status=$? + if [[ $register_broker_status == 0 ]]; then + doris_note "BROKER successfully registered to FE!" + is_fe_start=true + break + else + check_broker_status + if [ -n "$BROKER_ALREADY_EXISTS" ]; then + doris_warn "Same backend already exists! No need to register again!" + break + fi + if [[ $(( $i % 20 )) == 1 ]]; then + doris_warn "BROKER failed registered to FE!" + fi + fi + sleep 1 + done + if ! [[ $is_fe_start ]]; then + doris_error "Failed to register BROKER to FE!Tried 30 times!MayBe FE Start Failed!" + fi +} -# start broker -registerShell="/opt/apache-doris/broker/bin/start_broker.sh &" -echo "DEBUG >>>>>> registerShell = ${registerShell}" -eval "${registerShell}" && echo "DEBUG >>>>>> start_broker SUCCESS!" || echo "DEBUG >>>>>> start_broker FAILED!" +# Check whether the passed parameters are empty to avoid subsequent task execution failures. At the same time, +# enumeration checks can BROKER added, such as checking whether a certain parameter appears repeatedly, etc. +check_arg() { + if [ -z $2 ]; then + doris_error "$1 is null!" + fi +} -for ((i = 0; i <= 20; i++)); do - sleep 10 - ## check broker register status - echo "DEBUG >>>>>> run commnad mysql -uroot -P9030 -h${feIpArray[1]} -e \"show proc '/brokers'\" | grep \" ${broker_ip} \" | grep \" ${broker_ipc_port} \" | grep \" true \"" - mysql -uroot -P9030 -h"${feIpArray[1]}" -e "show proc '/brokers'" | grep "[[:space:]]${broker_ip}[[:space:]]" | grep "[[:space:]]${broker_ipc_port}[[:space:]]" | grep "[[:space:]]true[[:space:]]" +# 这里可用 docker_process_sql() 函数封装,为了方便调试,暂未封装 Review Comment: use english -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org