#!/bin/sh

set -eu

source ./utils.sh

TIKV_DIR="${TEST_DIR}/${TEST_NAME}"
TIKV_DIR1="${TIKV_DIR}/tikv1"
TIKV_ADDR1="127.0.0.1:20191"
TIKV_STATUS_ADDR1="127.0.0.1:20201"
TIKV_DIR2="${TIKV_DIR}/tikv2"
TIKV_ADDR2="127.0.0.1:20192"
TIKV_STATUS_ADDR2="127.0.0.1:20202"
TIKV_DIR3="${TIKV_DIR}/tikv3"
TIKV_ADDR3="127.0.0.1:20193"
TIKV_STATUS_ADDR3="127.0.0.1:20203"
PD_DIR="${TEST_DIR}/${TEST_NAME}/pd"

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

start_tikv "$TIKV_ADDR1" "$TIKV_STATUS_ADDR1" "$PD_ADDR" "$TIKV_DIR1" "$TIKV_CONFIG"
SERVER_PID1=$!

start_tikv "$TIKV_ADDR2" "$TIKV_STATUS_ADDR2" "$PD_ADDR" "$TIKV_DIR2" "$TIKV_CONFIG"
SERVER_PID2=$!

echo "update tikv1's local config"
echo "--pd $PD_ADDR component set $TIKV_ADDR1 raftstore.raft-log-gc-threshold 60" | ${PD_CTL_BIN}
sleep 0.5

CONF1=$(curl $TIKV_STATUS_ADDR1/config -s | grep -Po '(?<="raft-log-gc-threshold":)[^,]+')
CONF2=$(curl $TIKV_STATUS_ADDR2/config -s | grep -Po '(?<="raft-log-gc-threshold":)[^,]+')

# only tikv1's config updated
if [[ $CONF1 -ne 60 || $CONF2 -eq 60 ]]; then
    echo "${TEST_NAME} failed!"
    echo "Only tikv1's config should be updated, tikv1: $CONF1 tikv2: $CONF2"
    exit 1
fi

echo "update global config"
echo "--pd $PD_ADDR component set tikv raftstore.raft-log-gc-threshold 65" | ${PD_CTL_BIN}
sleep 0.5

CONF1=$(curl $TIKV_STATUS_ADDR1/config -s | grep -Po '(?<="raft-log-gc-threshold":)[^,]+')
CONF2=$(curl $TIKV_STATUS_ADDR2/config -s | grep -Po '(?<="raft-log-gc-threshold":)[^,]+')

# both config updated
if [[ $CONF1 -ne 65 || $CONF2 -ne 65 ]]; then
    echo "${TEST_NAME} failed!"
    echo "Both config of tikv1 and tikv2 should updated, tikv1: $CONF1 tikv2: $CONF2"
    exit 1
fi

# start a new instance
start_tikv "$TIKV_ADDR3" "$TIKV_STATUS_ADDR3" "$PD_ADDR" "$TIKV_DIR3" "$TIKV_CONFIG"
SERVER_PID3=$!

CONF3=$(curl $TIKV_STATUS_ADDR3/config -s | grep -Po '(?<="raft-log-gc-threshold":)[^,]+')

# new instance should also use the global config
if [ $CONF3 -ne 65 ]; then
    echo "${TEST_NAME} failed!"
    echo "New instance should use the global config, but get $CONF3"
    exit 1
fi

echo "update local config"
echo "--pd $PD_ADDR component set $TIKV_ADDR3 raftstore.raft-log-gc-threshold 100" | ${PD_CTL_BIN}
sleep 0.5
CONF4=$(curl $TIKV_STATUS_ADDR3/config -s | grep -Po '(?<="raft-log-gc-threshold":)[^,]+')

echo "update global config"
echo "--pd $PD_ADDR component set tikv raftstore.raft-log-gc-threshold 200" | ${PD_CTL_BIN}
sleep 0.5
CONF5=$(curl $TIKV_STATUS_ADDR3/config -s | grep -Po '(?<="raft-log-gc-threshold":)[^,]+')

echo "update local config"
echo "--pd $PD_ADDR component set $TIKV_ADDR3 raftstore.raft-log-gc-threshold 300" | ${PD_CTL_BIN}
sleep 0.5
CONF6=$(curl $TIKV_STATUS_ADDR3/config -s | grep -Po '(?<="raft-log-gc-threshold":)[^,]+')

# config should be overwrite by last update
if [[ $CONF4 -ne 100 || $CONF5 -ne 200 || $CONF6 -ne 300 ]]; then
    echo "${TEST_NAME} failed!"
    echo "Config should be overwrite by last update: $CONF4 == 100, $CONF5 == 200, $CONF6 == 300"
    exit 1
else
    echo "${TEST_NAME} passed!"
fi

kill -9 ${SERVER_PID1} || true
kill -9 ${SERVER_PID2} || true
kill -9 ${SERVER_PID3} || true
kill -9 ${PD_SERVER_PID} || true
