#!/bin/sh

set -eu

source ./utils.sh
source ./common_tests/tikv_config_list.sh

TIKV_ADDR="127.0.0.1:20150"
TIKV_STATUS_ADDR="127.0.0.1:20151"
TIKV_DIR="${TEST_DIR}/${TEST_NAME}/tikv"
PD_DIR="${TEST_DIR}/${TEST_NAME}/pd"

start_pd "$PD_CONFIG" "$PD_DIR"
PD_SERVER_PID=$!

start_tikv "$TIKV_ADDR" "$TIKV_STATUS_ADDR" "$PD_ADDR" "$TIKV_DIR" "$TIKV_CONFIG"
TIKV_SERVER_PID=$!

echo "normal update"
LEN=${#TIKV_DYNAMIC_CONFIG[*]}
i=0
until [ ! $i -lt $LEN ]; do
    echo "--pd $PD_ADDR component set $TIKV_ADDR ${TIKV_DYNAMIC_CONFIG[$i]} ${TIKV_CONFIG_VALUE[$i]}" | ${PD_CTL_BIN}
    sleep 0.5

    MATCH=\(\?\<\=\"${TIKV_CONFIG_VALIDATE[$i]}\"\:\)\[\^\,\}\]\+
    CONF=$(curl $TIKV_STATUS_ADDR/config -s | grep -Po ''${MATCH}'' | sed 's/\"//g')
    echo ${TIKV_CONFIG_VALUE[$i]} $CONF
    if [ $CONF != ${TIKV_CONFIG_VALUE[$i]} ]; then
        echo "${TEST_NAME} failed!"
        echo "Config ${TIKV_DYNAMIC_CONFIG[$i]} did not update"
        print_log "$PD_DIR" "$TIKV_DIR"
        exit 1
    fi
    i=$(expr $i + 1)
done

echo "change to invalid config"
echo "--pd $PD_ADDR component set $TIKV_ADDR raftstore.raft-log-gc-threshold 0" | ${PD_CTL_BIN}
sleep 0.5

NEW=$(curl $TIKV_STATUS_ADDR/config -s | grep -Po '(?<="raft-log-gc-threshold":)[^,]+')
# config should not change
if [ $NEW -ne 60 ]; then
    echo "${TEST_NAME} failed!"
    echo "Config raftstore.raft-log-gc-threshold change even update is invalid"
    print_log "$PD_DIR" "$TIKV_DIR"
    exit 1
fi

# TODO: test more non-dynamic config
echo "update not support config"
# #[config(skip)] config
echo "--pd $PD_ADDR component set $TIKV_ADDR pd.retry-log-every 1000" | ${PD_CTL_BIN}
sleep 0.5

NEW=$(curl $TIKV_STATUS_ADDR/config -s | grep -Po '(?<="retry-log-every":)[^,]+')
# config should not change
if [ $NEW == 1000 ]; then
    echo "${TEST_NAME} failed!"
    echo "Config pd.retry-log-every not support update"
    print_log "$PD_DIR" "$TIKV_DIR"
    exit 1
fi

echo "restart"
kill -1 ${TIKV_SERVER_PID}
sleep 2
start_tikv "$TIKV_ADDR" "$TIKV_STATUS_ADDR" "$PD_ADDR" "$TIKV_DIR" "$TIKV_CONFIG"
TIKV_SERVER_PID=$!

NEW=$(curl $TIKV_STATUS_ADDR/config -s | grep -Po '(?<="retry-log-every":)[^,]+')
# config should be update
if [ $NEW -ne 1000 ]; then
    echo "${TEST_NAME} failed!"
    echo "Config pd.retry-log-every should be 1000 after restart, got ${NEW}"
    print_log "$PD_LOG" "$TIKV_DIR"
    exit 1
else
    echo "${TEST_NAME} passed!"
fi

kill -9 ${TIKV_SERVER_PID} || true
kill -9 ${PD_SERVER_PID} || true
