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