github.com/pingcap/tiflow@v0.0.0-20240520035814-5bf52d54e205/dm/tests/_utils/run_dm_ctl_with_rematch (about) 1 #!/bin/bash 2 # tools to run dmctl from command line 3 # parameter 1: work directory 4 # parameter 2: master-addr port 5 # parameter 3: command 6 # parameter 4...: check output content and count 7 8 workdir=$1 9 master_addr=$2 10 cmd=$3 11 12 shift 3 13 14 PWD=$(pwd) 15 binary=$PWD/bin/dmctl.test 16 ts=$(date +"%s") 17 dmctl_log=$workdir/dmctl.$ts.log 18 pid=$$ 19 20 echo "dmctl test cmd: \"$cmd\"" 21 22 all_matched=true 23 for ((k = 0; k < 10; k++)); do 24 echo "$cmd" | $binary -test.coverprofile="$TEST_DIR/cov.$TEST_NAME.dmctl.$ts.$pid.out" DEVEL --master-addr=$master_addr >$dmctl_log 2>&1 25 all_matched=true 26 for ((i = 1; i < $#; i += 2)); do 27 j=$((i + 1)) 28 value=${!i} 29 expected=${!j} 30 # Count total number of value's occurrences in log file. value can be a regular expression with newline. 31 # See https://stackoverflow.com/questions/1251999/how-can-i-replace-a-newline-n-using-sed. 32 got=$(grep -Pzo "$value" "$dmctl_log" | sed ":a;N;\$!ba;s/\n//g" | sed 's/\x00/\n/g' | wc -l) 33 if [ "$got" != "$expected" ]; then 34 echo "command: $cmd $value count: $got != expected: $expected, failed the $k-th time, will retry again" 35 all_matched=false 36 break 37 fi 38 done 39 40 if $all_matched; then 41 exit 0 42 fi 43 44 sleep 2 45 done 46 47 cat $dmctl_log 48 exit 1