github.com/pingcap/tiflow@v0.0.0-20240520035814-5bf52d54e205/dm/tests/tiup/lib.sh (about)

     1  #!/bin/bash
     2  
     3  set -eux
     4  
     5  export TEST_DIR=/tmp/dm_test
     6  export TEST_NAME="upgrade-via-tiup"
     7  
     8  WORK_DIR=$TEST_DIR/$TEST_NAME
     9  mkdir -p $WORK_DIR
    10  
    11  TASK_NAME="upgrade_via_tiup"
    12  TASK_PESS_NAME="upgrade_via_tiup_pessimistic"
    13  TASK_OPTI_NAME="upgrade_via_tiup_optimistic"
    14  
    15  DB1=Sharding1
    16  DB2=sharding2
    17  # can't run upgrade test with upper case schema name in optimist mode
    18  DB3=opt_sharding1
    19  DB4=opt_sharding2
    20  DB5=pes_Sharding1
    21  DB6=pes_sharding2
    22  TBL1=T1
    23  TBL2=t2
    24  TBL3=T3
    25  TBL4=t4
    26  TBL5=t5
    27  TBL_LOWER1=t1
    28  TBL_LOWER3=t3
    29  PRE_VER=${PRE_VER:-v1.0.7}
    30  
    31  function exec_sql() {
    32  	echo $3 | mysql -h $1 -P $2
    33  }
    34  
    35  function run_sql_tidb_with_retry() {
    36  	rc=0
    37  	for ((k = 1; k < 11; k++)); do
    38  		# in retry scenario sometimes run_sql_tidb will fail because "table not exist", we should keep retrying so turn
    39  		# off the error option temporarily.
    40  		set +e
    41  		echo $1 | mysql -h tidb -P 4000 >"/tmp/res.txt"
    42  		set -e
    43  		if grep -Fq "$2" "/tmp/res.txt"; then
    44  			rc=1
    45  			break
    46  		fi
    47  		echo "run tidb sql failed $k-th time, retry later"
    48  		sleep 2
    49  	done
    50  	if [[ $rc = 0 ]]; then
    51  		echo "TEST FAILED: OUTPUT DOES NOT CONTAIN '$2'"
    52  		echo "____________________________________"
    53  		cat "/tmp/res.txt"
    54  		echo "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
    55  		exit 1
    56  	fi
    57  }
    58  
    59  function install_sync_diff() {
    60  	curl https://download.pingcap.org/tidb-enterprise-tools-nightly-linux-amd64.tar.gz | tar xz
    61  	mkdir -p bin
    62  	mv tidb-enterprise-tools-nightly-linux-amd64/bin/sync_diff_inspector bin/
    63  }
    64  
    65  function exec_full_stage() {
    66  	# drop previous data
    67  	exec_sql mysql1 3306 "DROP DATABASE IF EXISTS $DB1;"
    68  	exec_sql mariadb2 3306 "DROP DATABASE IF EXISTS $DB2;"
    69  	exec_sql mysql1 3306 "DROP DATABASE IF EXISTS $DB3;"
    70  	exec_sql mariadb2 3306 "DROP DATABASE IF EXISTS $DB4;"
    71  	exec_sql mysql1 3306 "DROP DATABASE IF EXISTS $DB5;"
    72  	exec_sql mariadb2 3306 "DROP DATABASE IF EXISTS $DB6;"
    73  	exec_sql tidb 4000 "DROP DATABASE IF EXISTS db_target;"
    74  	exec_sql tidb 4000 "DROP DATABASE IF EXISTS opt_db_target;"
    75  	exec_sql tidb 4000 "DROP DATABASE IF EXISTS pes_db_target;"
    76  	exec_sql tidb 4000 "DROP DATABASE IF EXISTS dm_meta;"
    77  
    78  	# # prepare full data
    79  	exec_sql mysql1 3306 "CREATE DATABASE $DB1;"
    80  	exec_sql mariadb2 3306 "CREATE DATABASE $DB2;"
    81  	exec_sql mysql1 3306 "CREATE TABLE $DB1.$TBL1 (c1 INT PRIMARY KEY, c2 TEXT);"
    82  	exec_sql mysql1 3306 "CREATE TABLE $DB1.$TBL2 (c1 INT PRIMARY KEY, c2 TEXT);"
    83  	exec_sql mariadb2 3306 "CREATE TABLE $DB2.$TBL2 (c1 INT PRIMARY KEY, c2 TEXT);"
    84  	exec_sql mariadb2 3306 "CREATE TABLE $DB2.$TBL3 (c1 INT PRIMARY KEY, c2 TEXT);"
    85  
    86  	exec_sql mysql1 3306 "INSERT INTO $DB1.$TBL1 (c1, c2) VALUES (1, '1');"
    87  	exec_sql mysql1 3306 "INSERT INTO $DB1.$TBL2 (c1, c2) VALUES (2, '2');"
    88  	exec_sql mariadb2 3306 "INSERT INTO $DB2.$TBL2 (c1, c2) VALUES (11, '11');"
    89  	exec_sql mariadb2 3306 "INSERT INTO $DB2.$TBL3 (c1, c2) VALUES (12, '12');"
    90  
    91  	# prepare optimsitic full data
    92  	exec_sql mysql1 3306 "CREATE DATABASE $DB3 CHARACTER SET UTF8MB4 COLLATE utf8mb4_bin;"
    93  	exec_sql mariadb2 3306 "CREATE DATABASE $DB4 CHARACTER SET UTF8MB4 COLLATE utf8mb4_bin;"
    94  	exec_sql mysql1 3306 "CREATE TABLE $DB3.$TBL_LOWER1 (c1 INT PRIMARY KEY, c2 TEXT);"
    95  	exec_sql mysql1 3306 "CREATE TABLE $DB3.$TBL2 (c1 INT PRIMARY KEY, c2 TEXT);"
    96  	exec_sql mariadb2 3306 "CREATE TABLE $DB4.$TBL2 (c1 INT PRIMARY KEY, c2 TEXT);"
    97  	exec_sql mariadb2 3306 "CREATE TABLE $DB4.$TBL_LOWER3 (c1 INT PRIMARY KEY, c2 TEXT);"
    98  
    99  	exec_sql mysql1 3306 "INSERT INTO $DB3.$TBL_LOWER1 (c1, c2) VALUES (1, '1');"
   100  	exec_sql mysql1 3306 "INSERT INTO $DB3.$TBL2 (c1, c2) VALUES (2, '2');"
   101  	exec_sql mariadb2 3306 "INSERT INTO $DB4.$TBL2 (c1, c2) VALUES (11, '11');"
   102  	exec_sql mariadb2 3306 "INSERT INTO $DB4.$TBL_LOWER3 (c1, c2) VALUES (12, '12');"
   103  
   104  	# prepare pessimistic full data
   105  	exec_sql mysql1 3306 "CREATE DATABASE $DB5;"
   106  	exec_sql mariadb2 3306 "CREATE DATABASE $DB6;"
   107  	exec_sql mysql1 3306 "CREATE TABLE $DB5.$TBL1 (c1 INT PRIMARY KEY, c2 TEXT);"
   108  	exec_sql mysql1 3306 "CREATE TABLE $DB5.$TBL2 (c1 INT PRIMARY KEY, c2 TEXT);"
   109  	exec_sql mariadb2 3306 "CREATE TABLE $DB6.$TBL2 (c1 INT PRIMARY KEY, c2 TEXT);"
   110  	exec_sql mariadb2 3306 "CREATE TABLE $DB6.$TBL3 (c1 INT PRIMARY KEY, c2 TEXT);"
   111  
   112  	exec_sql mysql1 3306 "INSERT INTO $DB5.$TBL1 (c1, c2) VALUES (1, '1');"
   113  	exec_sql mysql1 3306 "INSERT INTO $DB5.$TBL2 (c1, c2) VALUES (2, '2');"
   114  	exec_sql mariadb2 3306 "INSERT INTO $DB6.$TBL2 (c1, c2) VALUES (11, '11');"
   115  	exec_sql mariadb2 3306 "INSERT INTO $DB6.$TBL3 (c1, c2) VALUES (12, '12');"
   116  }
   117  
   118  function exec_incremental_stage1() {
   119  	# prepare incremental data
   120  	exec_sql mysql1 3306 "INSERT INTO $DB1.$TBL1 (c1, c2) VALUES (101, '101');"
   121  	exec_sql mysql1 3306 "INSERT INTO $DB1.$TBL2 (c1, c2) VALUES (102, '102');"
   122  	exec_sql mariadb2 3306 "INSERT INTO $DB2.$TBL2 (c1, c2) VALUES (111, '111');"
   123  	exec_sql mariadb2 3306 "INSERT INTO $DB2.$TBL3 (c1, c2) VALUES (112, '112');"
   124  
   125  	# prepare optimistic incremental data
   126  	exec_sql mysql1 3306 "INSERT INTO $DB3.$TBL_LOWER1 (c1, c2) VALUES (101, '101');"
   127  	exec_sql mysql1 3306 "INSERT INTO $DB3.$TBL2 (c1, c2) VALUES (102, '102');"
   128  	# v2.0.0 has bug with create/drop table
   129  	if [[ "$PRE_VER" != "v2.0.0" ]]; then
   130  		exec_sql mysql1 3306 "CREATE TABLE $DB3.$TBL5(c1 INT PRIMARY KEY, c2 TEXT);"
   131  		exec_sql mysql1 3306 "INSERT INTO $DB3.$TBL5 (c1, c2) VALUES (1000, 1000);"
   132  	fi
   133  	exec_sql mariadb2 3306 "INSERT INTO $DB4.$TBL2 (c1, c2) VALUES (111, '111');"
   134  	exec_sql mariadb2 3306 "INSERT INTO $DB4.$TBL_LOWER3 (c1, c2) VALUES (112, '112');"
   135  
   136  	if [[ "$PRE_VER" != "v2.0.0" ]]; then
   137  		exec_sql mariadb2 3306 "CREATE TABLE $DB4.$TBL4(c1 INT PRIMARY KEY, c2 TEXT);"
   138  		exec_sql mariadb2 3306 "INSERT INTO $DB4.$TBL4 (c1, c2) VALUES (115, '115');"
   139  		exec_sql mysql1 3306 "DROP TABLE $DB3.$TBL5;"
   140  	fi
   141  
   142  	# optimistic shard ddls
   143  	exec_sql mysql1 3306 "ALTER TABLE $DB3.$TBL_LOWER1 ADD COLUMN c3 INT;"
   144  	exec_sql mysql1 3306 "ALTER TABLE $DB3.$TBL2 ADD COLUMN c4 INT;"
   145  	exec_sql mariadb2 3306 "ALTER TABLE $DB4.$TBL2 ADD COLUMN c3 INT;"
   146  	exec_sql mariadb2 3306 "ALTER TABLE $DB4.$TBL_LOWER3 ADD COLUMN c4 INT;"
   147  
   148  	# prepare optimistic incremental data
   149  	exec_sql mysql1 3306 "INSERT INTO $DB3.$TBL_LOWER1 (c1, c2, c3) VALUES (103, '103', 103);"
   150  	exec_sql mysql1 3306 "INSERT INTO $DB3.$TBL2 (c1, c2, c4) VALUES (104, '104', 104);"
   151  	exec_sql mariadb2 3306 "INSERT INTO $DB4.$TBL2 (c1, c2, c3) VALUES (113, '113', 113);"
   152  	exec_sql mariadb2 3306 "INSERT INTO $DB4.$TBL_LOWER3 (c1, c2, c4) VALUES (114, '114', 114);"
   153  	if [[ "$PRE_VER" != "v2.0.0" ]]; then
   154  		exec_sql mariadb2 3306 "INSERT INTO $DB4.$TBL4 (c1, c2) VALUES (116, '116');"
   155  	fi
   156  
   157  	# prepare pessimistic incremental data
   158  	exec_sql mysql1 3306 "INSERT INTO $DB5.$TBL1 (c1, c2) VALUES (101, '101');"
   159  	exec_sql mysql1 3306 "INSERT INTO $DB5.$TBL2 (c1, c2) VALUES (102, '102');"
   160  	exec_sql mariadb2 3306 "INSERT INTO $DB6.$TBL2 (c1, c2) VALUES (111, '111');"
   161  	exec_sql mariadb2 3306 "INSERT INTO $DB6.$TBL3 (c1, c2) VALUES (112, '112');"
   162  
   163  	# pessimistic shard ddls
   164  	exec_sql mysql1 3306 "ALTER TABLE $DB5.$TBL1 ADD COLUMN c3 INT;"
   165  	exec_sql mysql1 3306 "ALTER TABLE $DB5.$TBL2 ADD COLUMN c3 INT;"
   166  
   167  	# prepare pessimistic incremental data
   168  	exec_sql mysql1 3306 "INSERT INTO $DB5.$TBL1 (c1, c2, c3) VALUES (103, '103', 103);"
   169  	exec_sql mysql1 3306 "INSERT INTO $DB5.$TBL2 (c1, c2, c3) VALUES (104, '104', 104);"
   170  	exec_sql mariadb2 3306 "INSERT INTO $DB6.$TBL2 (c1, c2) VALUES (113, '113');"
   171  	exec_sql mariadb2 3306 "INSERT INTO $DB6.$TBL3 (c1, c2) VALUES (114, '114');"
   172  }
   173  
   174  function exec_incremental_stage2() {
   175  	# prepare incremental data
   176  	exec_sql mysql1 3306 "INSERT INTO $DB1.$TBL1 (c1, c2) VALUES (201, '201');"
   177  	exec_sql mysql1 3306 "INSERT INTO $DB1.$TBL2 (c1, c2) VALUES (202, '202');"
   178  	exec_sql mariadb2 3306 "INSERT INTO $DB2.$TBL2 (c1, c2) VALUES (211, '211');"
   179  	exec_sql mariadb2 3306 "INSERT INTO $DB2.$TBL3 (c1, c2) VALUES (212, '212');"
   180  
   181  	# prepare optimistic incremental data
   182  	exec_sql mysql1 3306 "INSERT INTO $DB3.$TBL_LOWER1 (c1, c2, c3) VALUES (201, '201', 201);"
   183  	exec_sql mysql1 3306 "INSERT INTO $DB3.$TBL2 (c1, c2, c4) VALUES (202, '202', 202);"
   184  	exec_sql mariadb2 3306 "INSERT INTO $DB4.$TBL2 (c1, c2, c3) VALUES (211, '211', 211);"
   185  	exec_sql mariadb2 3306 "INSERT INTO $DB4.$TBL_LOWER3 (c1, c2, c4) VALUES (212, '212', 212);"
   186  
   187  	# optimistic shard ddls
   188  	exec_sql mysql1 3306 "ALTER TABLE $DB3.$TBL_LOWER1 ADD COLUMN c4 INT;"
   189  	exec_sql mysql1 3306 "ALTER TABLE $DB3.$TBL2 ADD COLUMN c3 INT AFTER c2;"
   190  	exec_sql mariadb2 3306 "ALTER TABLE $DB4.$TBL2 ADD COLUMN c4 INT;"
   191  	exec_sql mariadb2 3306 "ALTER TABLE $DB4.$TBL_LOWER3 ADD COLUMN c3 INT AFTER c2;"
   192  
   193  	if [[ "$PRE_VER" != "v2.0.0" ]]; then
   194  		exec_sql mariadb2 3306 "ALTER TABLE $DB4.$TBL4 ADD COLUMN c4 INT;"
   195  		exec_sql mariadb2 3306 "ALTER TABLE $DB4.$TBL4 ADD COLUMN c3 INT AFTER c2;"
   196  	fi
   197  
   198  	# prepare optimistic incremental data
   199  	exec_sql mysql1 3306 "INSERT INTO $DB3.$TBL_LOWER1 (c1, c2, c3, c4) VALUES (203, '203', 203, 203);"
   200  	exec_sql mysql1 3306 "INSERT INTO $DB3.$TBL2 (c1, c2, c3, c4) VALUES (204, '204', 204, 204);"
   201  	exec_sql mariadb2 3306 "INSERT INTO $DB4.$TBL2 (c1, c2, c3, c4) VALUES (213, '213', 213, 213);"
   202  	exec_sql mariadb2 3306 "INSERT INTO $DB4.$TBL_LOWER3 (c1, c2, c3, c4) VALUES (214, '214', 214, 214);"
   203  	if [[ "$PRE_VER" != "v2.0.0" ]]; then
   204  		exec_sql mariadb2 3306 "INSERT INTO $DB4.$TBL4 (c1, c2, c3, c4) VALUES (215, '215', 215, 215);"
   205  	fi
   206  
   207  	# prepare pessimistic incremental data
   208  	exec_sql mysql1 3306 "INSERT INTO $DB5.$TBL1 (c1, c2, c3) VALUES (201, '201', 201);"
   209  	exec_sql mysql1 3306 "INSERT INTO $DB5.$TBL2 (c1, c2, c3) VALUES (202, '202', 202);"
   210  	exec_sql mariadb2 3306 "INSERT INTO $DB6.$TBL2 (c1, c2) VALUES (211, '211');"
   211  	exec_sql mariadb2 3306 "INSERT INTO $DB6.$TBL3 (c1, c2) VALUES (212, '212');"
   212  
   213  	# pessimistic shard ddls
   214  	exec_sql mariadb2 3306 "ALTER TABLE $DB6.$TBL2 ADD COLUMN c3 INT;"
   215  	exec_sql mariadb2 3306 "ALTER TABLE $DB6.$TBL3 ADD COLUMN c3 INT;"
   216  
   217  	# prepare pessimistic incremental data
   218  	exec_sql mysql1 3306 "INSERT INTO $DB5.$TBL1 (c1, c2, c3) VALUES (203, '203', 203);"
   219  	exec_sql mysql1 3306 "INSERT INTO $DB5.$TBL2 (c1, c2, c3) VALUES (204, '204', 204);"
   220  	exec_sql mariadb2 3306 "INSERT INTO $DB6.$TBL2 (c1, c2, c3) VALUES (213, '213', 213);"
   221  	exec_sql mariadb2 3306 "INSERT INTO $DB6.$TBL3 (c1, c2, c3) VALUES (214, '214', 214);"
   222  }
   223  
   224  function exec_incremental_stage3() {
   225  	# prepare incremental data
   226  	exec_sql mysql1 3306 "INSERT INTO $DB1.$TBL1 (c1, c2) VALUES (301, '301');"
   227  	exec_sql mysql1 3306 "INSERT INTO $DB1.$TBL2 (c1, c2) VALUES (302, '302');"
   228  	exec_sql mariadb2 3306 "INSERT INTO $DB2.$TBL2 (c1, c2) VALUES (311, '311');"
   229  	exec_sql mariadb2 3306 "INSERT INTO $DB2.$TBL3 (c1, c2) VALUES (312, '312');"
   230  
   231  	# prepare optimistic incremental data
   232  	exec_sql mysql1 3306 "INSERT INTO $DB3.$TBL_LOWER1 (c1, c2, c3, c4) VALUES (301, '301', 301, 301);"
   233  	exec_sql mysql1 3306 "INSERT INTO $DB3.$TBL2 (c1, c2, c3, c4) VALUES (302, '302', 302, 302);"
   234  	exec_sql mariadb2 3306 "INSERT INTO $DB4.$TBL2 (c1, c2, c3, c4) VALUES (311, '311', 311, 311);"
   235  	exec_sql mariadb2 3306 "INSERT INTO $DB4.$TBL_LOWER3 (c1, c2, c3, c4) VALUES (312, '312', 312, 312);"
   236  	if [[ "$PRE_VER" != "v2.0.0" ]]; then
   237  		exec_sql mariadb2 3306 "INSERT INTO $DB4.$TBL4 (c1, c2, c3, c4) VALUES (313, '313', 313, 313);"
   238  	fi
   239  
   240  	# prepare pessimistic incremental data
   241  	exec_sql mysql1 3306 "INSERT INTO $DB5.$TBL1 (c1, c2, c3) VALUES (303, '303', 303);"
   242  	exec_sql mysql1 3306 "INSERT INTO $DB5.$TBL2 (c1, c2, c3) VALUES (304, '304', 304);"
   243  	exec_sql mariadb2 3306 "INSERT INTO $DB6.$TBL2 (c1, c2, c3) VALUES (313, '313', 313);"
   244  	exec_sql mariadb2 3306 "INSERT INTO $DB6.$TBL3 (c1, c2, c3) VALUES (314, '314', 314);"
   245  }
   246  
   247  function exec_incremental_stage4() {
   248  	# prepare incremental data
   249  	exec_sql mysql1 3306 "INSERT INTO $DB1.$TBL1 (c1, c2) VALUES (401, '401');"
   250  	exec_sql mysql1 3306 "INSERT INTO $DB1.$TBL2 (c1, c2) VALUES (402, '402');"
   251  	exec_sql mariadb2 3306 "INSERT INTO $DB2.$TBL2 (c1, c2) VALUES (411, '411');"
   252  	exec_sql mariadb2 3306 "INSERT INTO $DB2.$TBL3 (c1, c2) VALUES (412, '412');"
   253  
   254  	# prepare optimistic incremental data
   255  	exec_sql mysql1 3306 "INSERT INTO $DB3.$TBL_LOWER1 (c1, c2, c3, c4) VALUES (401, '401', 401, 401);"
   256  	exec_sql mysql1 3306 "INSERT INTO $DB3.$TBL2 (c1, c2, c3, c4) VALUES (402, '402', 402, 402);"
   257  	exec_sql mariadb2 3306 "INSERT INTO $DB4.$TBL2 (c1, c2, c3, c4) VALUES (411, '411', 411, 411);"
   258  	exec_sql mariadb2 3306 "INSERT INTO $DB4.$TBL_LOWER3 (c1, c2, c3, c4) VALUES (412, '412', 412, 412);"
   259  	if [[ "$PRE_VER" != "v2.0.0" ]]; then
   260  		exec_sql mariadb2 3306 "INSERT INTO $DB4.$TBL4 (c1, c2, c3, c4) VALUES (413, '413', 413, 413);"
   261  	fi
   262  
   263  	# prepare pessimistic incremental data
   264  	exec_sql mysql1 3306 "INSERT INTO $DB5.$TBL1 (c1, c2, c3) VALUES (403, '403', 403);"
   265  	exec_sql mysql1 3306 "INSERT INTO $DB5.$TBL2 (c1, c2, c3) VALUES (404, '404', 404);"
   266  	exec_sql mariadb2 3306 "INSERT INTO $DB6.$TBL2 (c1, c2, c3) VALUES (413, '413', 413);"
   267  	exec_sql mariadb2 3306 "INSERT INTO $DB6.$TBL3 (c1, c2, c3) VALUES (414, '414', 414);"
   268  }
   269  
   270  function patch_nightly_with_tiup_mirror() {
   271  	# clone packages for upgrade.
   272  	# FIXME: use nightly version of grafana and prometheus after https://github.com/pingcap/tiup/issues/1334 fixed.
   273  	tiup --version
   274  	tiup mirror clone tidb-dm-nightly-linux-amd64 --os=linux --arch=amd64 \
   275  		--alertmanager=v0.17.0 --grafana=v5.0.1 --prometheus=v5.0.1 \
   276  		--dm-master=$1 --dm-worker=$1 \
   277  		--tiup=v$(tiup --version | head -n1 | awk '{print $1}') --dm=v$(tiup --version | head -n1 | awk '{print $1}')
   278  
   279  	# change tiup mirror
   280  	tidb-dm-nightly-linux-amd64/local_install.sh
   281  
   282  	# publish nightly version
   283  	# binary files have already been built and packaged.
   284  	tiup mirror genkey
   285  	tiup mirror grant gmhdbjd --name gmhdbjd
   286  	mv tidb-dm-nightly-linux-amd64/keys/*-pingcap.json ./pingcap.json
   287  	tiup mirror publish dm-master nightly /tmp/dm-master-nightly-linux-amd64.tar.gz dm-master/dm-master --arch amd64 --os linux --desc="dm-master component of Data Migration Platform" -k pingcap.json
   288  	tiup mirror publish dm-worker nightly /tmp/dm-worker-nightly-linux-amd64.tar.gz dm-worker/dm-worker --arch amd64 --os linux --desc="dm-worker component of Data Migration Platform" -k pingcap.json
   289  	tiup mirror publish dmctl nightly /tmp/dmctl-nightly-linux-amd64.tar.gz dmctl/dmctl --arch amd64 --os linux --desc="dmctl component of Data Migration Platform"
   290  
   291  	tiup list
   292  }
   293  
   294  function run_dmctl_with_retry() {
   295  	dmctl_log="dmctl.log"
   296  	for ((k = 0; k < 10; k++)); do
   297  		tiup dmctl:$1 --master-addr=master1:8261 $2 >$dmctl_log 2>&1
   298  		all_matched=true
   299  		for ((i = 3; i < $#; i += 2)); do
   300  			j=$((i + 1))
   301  			value=${!i}
   302  			expected=${!j}
   303  			got=$(sed "s/$value/$value\n/g" $dmctl_log | grep -c "$value" || true)
   304  			if [ "$got" != "$expected" ]; then
   305  				all_matched=false
   306  				break
   307  			fi
   308  		done
   309  
   310  		if $all_matched; then
   311  			return 0
   312  		fi
   313  
   314  		sleep 2
   315  	done
   316  
   317  	cat $dmctl_log
   318  	exit 1
   319  }
   320  
   321  function ensure_start_relay() {
   322  	# manually enable relay for source1 after v2.0.2
   323  	if [[ "$PRE_VER" == "v2.0.0" ]] || [[ "$PRE_VER" == "v2.0.1" ]]; then
   324  		return
   325  	fi
   326  
   327  	dmctl_log="get-worker.txt"
   328  	# always use CUR_VER, because we might use tiup mirror in previous steps.
   329  	tiup dmctl:$CUR_VER --master-addr=master1:8261 operate-source show -s mysql-replica-01 >$dmctl_log 2>&1
   330  	worker=$(grep "worker" $dmctl_log | awk -F'"' '{ print $4 }')
   331  	if [[ "$PRE_VER" == "v2.0.2" ]] || [[ "$PRE_VER" == "v2.0.3" ]] || [[ "$PRE_VER" == "v2.0.4" ]] || [[ "$PRE_VER" == "v2.0.5" ]] || [[ "$PRE_VER" == "v2.0.6" ]] || [[ "$PRE_VER" == "v2.0.7" ]]; then
   332  		run_dmctl_with_retry $CUR_VER "start-relay -s mysql-replica-01 $worker" "\"result\": true" 1
   333  	else
   334  		run_dmctl_with_retry $CUR_VER "start-relay -s mysql-replica-01" "\"result\": true" 1
   335  	fi
   336  }
   337  
   338  function restart_relay() {
   339  	if [[ "$PRE_VER" == "v2.0.0" ]] || [[ "$PRE_VER" == "v2.0.1" ]]; then
   340  		return
   341  	fi
   342  
   343  	run_dmctl_with_retry $CUR_VER "stop-relay -s mysql-replica-01" "\"result\": true" 1
   344  	run_dmctl_with_retry $CUR_VER "query-status -s mysql-replica-01" "\"relayStatus\": null" 1
   345  	run_dmctl_with_retry $CUR_VER "start-relay -s mysql-replica-01" "\"result\": true" 1
   346  	run_dmctl_with_retry $CUR_VER "query-status -s mysql-replica-01" "relayCatchUpMaster" 1
   347  }