github.com/pingcap/tiflow@v0.0.0-20240520035814-5bf52d54e205/dm/tests/dmctl_basic/run.sh (about) 1 #!/bin/bash 2 3 set -eu 4 5 cur=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) 6 source $cur/../_utils/test_prepare 7 WORK_DIR=$TEST_DIR/$TEST_NAME 8 TASK_CONF=$cur/conf/dm-task.yaml 9 TASK_NAME="test" 10 MYSQL1_CONF=$cur/conf/source1.yaml 11 SQL_RESULT_FILE="$TEST_DIR/sql_res.$TEST_NAME.txt" 12 13 # used to coverage wrong usage of dmctl command 14 function usage_and_arg_test() { 15 echo "check_task_wrong_arg" 16 check_task_wrong_arg 17 check_task_wrong_config_file 18 19 echo "pause_relay_wrong_arg" 20 pause_relay_wrong_arg 21 pause_relay_without_worker 22 23 echo "resume_relay_wrong_arg" 24 resume_relay_wrong_arg 25 resume_relay_wihout_worker 26 27 echo "pause_task_wrong_arg" 28 pause_task_wrong_arg 29 30 echo "resume_task_wrong_arg" 31 resume_task_wrong_arg 32 33 echo "query_status_wrong_arg" 34 query_status_wrong_arg 35 query_status_wrong_params 36 37 echo "start_task_wrong_arg" 38 start_task_wrong_arg 39 start_task_wrong_config_file 40 41 echo "stop_task_wrong_arg" 42 stop_task_wrong_arg 43 44 echo "show_ddl_locks_wrong_arg" 45 show_ddl_locks_wrong_arg 46 47 # echo "update_relay_wrong_arg" 48 # update_relay_wrong_arg 49 # update_relay_wrong_config_file 50 # update_relay_should_specify_one_dm_worker $MYSQL1_CONF 51 52 # echo "update_task_wrong_arg" 53 # update_task_wrong_arg 54 # update_task_wrong_config_file 55 56 # echo "update_master_config_wrong_arg" 57 # update_master_config_wrong_arg 58 # update_master_config_wrong_config_file 59 # 60 echo "purge_relay_wrong_arg" 61 purge_relay_wrong_arg 62 purge_relay_without_worker 63 purge_relay_filename_with_multi_workers 64 65 echo "operate_source_empty_arg" 66 operate_source_empty_arg 67 operate_source_wrong_config_file 68 operate_source_invalid_op $MYSQL1_CONF 69 operate_source_stop_not_created_config $MYSQL1_CONF 70 71 echo "transfer_source_empty_arg" 72 transfer_source_empty_arg 73 transfer_source_less_arg 74 transfer_source_more_arg 75 76 echo "start_relay_empty_arg" 77 start_relay_empty_arg 78 start_relay_wrong_arg 79 80 echo "stop_relay_empty_arg" 81 stop_relay_empty_arg 82 stop_relay_wrong_arg 83 } 84 85 function recover_max_binlog_size() { 86 run_sql "set @@global.max_binlog_size = $1" $MYSQL_PORT1 $MYSQL_PASSWORD1 87 run_sql "set @@global.max_binlog_size = $2" $MYSQL_PORT2 $MYSQL_PASSWORD2 88 } 89 90 function test_operate_task_bound_to_a_source() { 91 echo "############################################################" 92 echo "test case for operate tasks bound to a source" 93 echo "############################################################" 94 # 95 # both foo-task and bar-task have 2 sources 96 # 97 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "start-task $cur/conf/foo-task.yaml" "\"result\": true" 3 98 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "start-task $cur/conf/bar-task.yaml" "\"result\": true" 3 99 100 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "pause-task -s xxx" "haven't been added" 1 101 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "resume-task -s xxx" "haven't been added" 1 102 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "stop-task -s xxx" "haven't been added" 1 103 104 # batch pause mysql-replica-01 105 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "pause-task -s mysql-replica-01" "\"result\": true" 5 106 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "query-status -s mysql-replica-01" "\"stage\": \"Paused\"" 2 107 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "query-status -s mysql-replica-02" "\"stage\": \"Running\"" 2 108 # batch pause mysql-replica-02 109 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "pause-task -s mysql-replica-02" "\"result\": true" 5 110 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "query-status -s mysql-replica-01" "\"stage\": \"Paused\"" 2 111 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "query-status -s mysql-replica-02" "\"stage\": \"Paused\"" 2 112 113 # batch resume mysql-replica-01 114 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "resume-task -s mysql-replica-01" "\"result\": true" 5 115 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "query-status -s mysql-replica-01" "\"stage\": \"Running\"" 2 116 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "query-status -s mysql-replica-02" "\"stage\": \"Paused\"" 2 117 # batch resume mysql-replica-02 118 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "resume-task -s mysql-replica-02" "\"result\": true" 5 119 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "query-status -s mysql-replica-01" "\"stage\": \"Running\"" 2 120 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "query-status -s mysql-replica-02" "\"stage\": \"Running\"" 2 121 # stop 122 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "stop-task -s mysql-replica-01" "\"result\": true" 5 123 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "query-status -s mysql-replica-01" "\"stage\": " 0 124 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "query-status -s mysql-replica-02" "\"stage\": \"Running\"" 2 125 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "stop-task -s mysql-replica-02" "\"result\": true" 5 126 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "query-status -s mysql-replica-01" "\"stage\": " 0 127 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "query-status -s mysql-replica-02" "\"stage\": " 0 128 129 # 130 # bar-task has 2 sources, baz-task has 1 sources 131 # 132 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "start-task $cur/conf/bar-task.yaml" "\"result\": true" 3 133 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "start-task $cur/conf/baz-task.yaml" "\"result\": true" 2 134 135 # batch pause mysql-replica-01 136 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "pause-task -s mysql-replica-01" "\"result\": true" 5 137 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "query-status -s mysql-replica-01" "\"stage\": \"Paused\"" 2 138 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "query-status -s mysql-replica-02" "\"stage\": \"Running\"" 1 139 # batch pause mysql-replica-02 140 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "pause-task -s mysql-replica-02" "\"result\": true" 3 141 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "query-status -s mysql-replica-01" "\"stage\": \"Paused\"" 2 142 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "query-status -s mysql-replica-02" "\"stage\": \"Paused\"" 1 143 144 # batch resume mysql-replica-01 145 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "resume-task -s mysql-replica-01" "\"result\": true" 5 146 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "query-status -s mysql-replica-01" "\"stage\": \"Running\"" 2 147 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "query-status -s mysql-replica-02" "\"stage\": \"Paused\"" 1 148 # batch resume mysql-replica-02 149 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "resume-task -s mysql-replica-02" "\"result\": true" 3 150 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "query-status -s mysql-replica-01" "\"stage\": \"Running\"" 2 151 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "query-status -s mysql-replica-02" "\"stage\": \"Running\"" 1 152 # stop 153 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "stop-task -s mysql-replica-01" "\"result\": true" 5 154 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "query-status -s mysql-replica-01" "\"stage\": " 0 155 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "query-status -s mysql-replica-02" "\"stage\": \"Running\"" 1 156 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "stop-task -s mysql-replica-02" "\"result\": true" 3 157 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "query-status -s mysql-replica-01" "\"stage\": " 0 158 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "query-status -s mysql-replica-02" "\"stage\": " 0 159 } 160 161 function run() { 162 inject_points=( 163 "github.com/pingcap/tiflow/dm/relay/SetHeartbeatInterval=return(1)" 164 ) 165 export GO_FAILPOINTS="$(join_string \; ${inject_points[@]})" 166 167 run_sql "show variables like 'max_binlog_size'\G" $MYSQL_PORT1 $MYSQL_PASSWORD1 168 max_binlog_size1=$(tail -n 1 "$TEST_DIR/sql_res.$TEST_NAME.txt" | awk '{print $NF}') 169 run_sql "show variables like 'max_binlog_size'\G" $MYSQL_PORT2 $MYSQL_PASSWORD2 170 max_binlog_size2=$(tail -n 1 "$TEST_DIR/sql_res.$TEST_NAME.txt" | awk '{print $NF}') 171 run_sql "set @@global.max_binlog_size = 12288" $MYSQL_PORT1 $MYSQL_PASSWORD1 172 run_sql "set @@global.max_binlog_size = 12288" $MYSQL_PORT2 $MYSQL_PASSWORD2 173 trap "recover_max_binlog_size $max_binlog_size1 $max_binlog_size2" EXIT 174 175 run_sql_file $cur/data/db1.prepare.sql $MYSQL_HOST1 $MYSQL_PORT1 $MYSQL_PASSWORD1 176 run_sql_file $cur/data/db2.prepare.sql $MYSQL_HOST2 $MYSQL_PORT2 $MYSQL_PASSWORD2 177 178 cd $cur 179 for file in "check_list"/*; do 180 source $file 181 done 182 cd - 183 184 mkdir -p $WORK_DIR/master $WORK_DIR/worker1 $WORK_DIR/worker2 185 dm_master_conf="$WORK_DIR/master/dm-master.toml" 186 dm_worker1_conf="$WORK_DIR/worker1/dm-worker.toml" 187 dm_worker2_conf="$WORK_DIR/worker2/dm-worker.toml" 188 cp $cur/conf/dm-worker1.toml $dm_worker1_conf 189 cp $cur/conf/dm-worker2.toml $dm_worker2_conf 190 cp $cur/conf/dm-master.toml $dm_master_conf 191 192 # start dmctl when master have not started 193 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" "any command" \ 194 "can't connect to 127.0.0.1:8261" 1 \ 195 "Please check your network connection\." 1 196 run_dm_ctl_cmd_mode $WORK_DIR "127.0.0.1:$MASTER_PORT" "any command" \ 197 "unknown command \"any\" for \"dmctl\"" 1 \ 198 "Run 'dmctl --help' for usage\." 1 199 200 mkdir -p $WORK_DIR/master 201 cp $cur/conf/key.txt $WORK_DIR/master/ 202 export DM_MASTER_EXTRA_ARG="--secret-key-path $WORK_DIR/master/key.txt" 203 run_dm_master $WORK_DIR/master $MASTER_PORT $dm_master_conf 204 export DM_MASTER_EXTRA_ARG="" 205 check_rpc_alive $cur/../bin/check_master_online 127.0.0.1:$MASTER_PORT 206 # only one master, check it should be leader and etcd metrics works 207 check_metric $MASTER_PORT 'etcd_server_has_leader' 3 0 2 208 209 usage_and_arg_test 210 211 # operate mysql config to worker 212 cp $cur/conf/source1.yaml $WORK_DIR/source1.yaml 213 cp $cur/conf/source2.yaml $WORK_DIR/source2.yaml 214 sed -i "/relay-binlog-name/i\relay-dir: $WORK_DIR/worker1/relay_log" $WORK_DIR/source1.yaml 215 sed -i "/relay-binlog-name/i\relay-dir: $WORK_DIR/worker2/relay_log" $WORK_DIR/source2.yaml 216 217 dmctl_operate_source create $WORK_DIR/source1.yaml $SOURCE_ID1 218 dmctl_operate_source create $WORK_DIR/source2.yaml $SOURCE_ID2 219 220 # test stop source will not check connectivity to upstream 221 cp $cur/conf/source1.yaml $WORK_DIR/source1-wrong.yaml 222 sed '/password/d' $WORK_DIR/source1-wrong.yaml 223 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" \ 224 "operate-source stop $WORK_DIR/source1-wrong.yaml $SOURCE_ID2" \ 225 "\"result\": true" 3 226 227 # ensure source1 is bound to worker1 228 dmctl_operate_source create $WORK_DIR/source1.yaml $SOURCE_ID1 229 run_dm_worker $WORK_DIR/worker1 $WORKER1_PORT $dm_worker1_conf 230 check_rpc_alive $cur/../bin/check_worker_online 127.0.0.1:$WORKER1_PORT 231 232 dmctl_operate_source create $WORK_DIR/source2.yaml $SOURCE_ID2 233 234 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" \ 235 "operate-source show" \ 236 "\"result\": true" 3 \ 237 'msg": "source is added but there is no free worker to bound"' 1 \ 238 '"worker": "worker1"' 1 239 240 run_dm_worker $WORK_DIR/worker2 $WORKER2_PORT $dm_worker2_conf 241 check_rpc_alive $cur/../bin/check_worker_online 127.0.0.1:$WORKER2_PORT 242 243 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" \ 244 "operate-source show" \ 245 "\"result\": true" 3 \ 246 '"worker": "worker1"' 1 \ 247 '"worker": "worker2"' 1 248 249 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" \ 250 "operate-source show -s $SOURCE_ID1" \ 251 "\"result\": true" 2 \ 252 '"worker": "worker1"' 1 253 254 test_operate_task_bound_to_a_source 255 256 transfer_source_valid $SOURCE_ID1 worker1 # transfer to self 257 transfer_source_invalid $SOURCE_ID1 worker2 258 259 # test for start relay 260 echo "kill worker2" 261 kill_process worker2 262 check_port_offline $WORKER2_PORT 20 263 264 stop_relay_on_offline_worker 265 start_relay_on_offline_worker 266 267 echo "restart worker2" 268 run_dm_worker $WORK_DIR/worker2 $WORKER2_PORT $dm_worker2_conf 269 check_rpc_alive $cur/../bin/check_worker_online 127.0.0.1:$WORKER2_PORT 270 271 start_relay_success 272 start_relay_diff_worker_fail 273 start_relay_without_worker_name_fail 274 stop_relay_without_worker_name_fail 275 276 echo "pause_relay_success" 277 pause_relay_success 278 query_status_stopped_relay 279 # pause twice won't receive an error now 280 # pause_relay_fail 281 resume_relay_success 282 query_status_with_no_tasks 283 284 echo "dmctl_check_task" 285 check_task_pass $TASK_CONF 286 check_task_wrong_no_source_meta $cur/conf/dm-task7.yaml 287 check_task_wrong_start_time_format $cur/conf/dm-task3.yaml 288 check_task_no_source_meta_but_start_time $cur/conf/dm-task7.yaml 289 check_task_not_pass $cur/conf/dm-task2.yaml 290 check_task_error_count $cur/conf/dm-task3.yaml 291 check_task_not_pass_with_message $cur/conf/dm-task5.yaml "please use \`shard-mode\` only." 292 start_task_not_pass_with_message $cur/conf/dm-task5.yaml "please use \`shard-mode\` only." 293 check_task_not_pass_with_message $cur/conf/dm-task6.yaml "please use \`shard-mode\` only." 294 start_task_not_pass_with_message $cur/conf/dm-task6.yaml "please use \`shard-mode\` only." 295 296 echo "check_task_optimistic" 297 check_task_pass $cur/conf/dm-task4.yaml 298 299 echo "check_task_only_warning" 300 check_task_only_warning $cur/conf/only_warning.yaml 301 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" \ 302 "start-task $cur/conf/only_warning.yaml" \ 303 "\"state\": \"warn\"" 1 304 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" \ 305 "stop-task $cur/conf/only_warning.yaml" \ 306 "\"result\": true" 2 307 308 echo "check task with empty unit config" 309 check_task_empty_config $cur/conf/empty-unit-task.yaml 310 echo "start task with empty unit config" 311 start_task_empty_config $cur/conf/empty-unit-task.yaml 312 313 cp $cur/conf/dm-task.yaml $WORK_DIR/dm-task-error-database-config.yaml 314 sed -i "s/password: \"\"/password: \"wrond password\"/g" $WORK_DIR/dm-task-error-database-config.yaml 315 check_task_error_database_config $WORK_DIR/dm-task-error-database-config.yaml 316 317 echo "dmctl_start_task" 318 start_task_wrong_start_time_format $cur/conf/dm-task3.yaml 319 start_task_wrong_no_source_meta $cur/conf/dm-task7.yaml 320 # start no source meta task with start time 321 start_task_no_source_meta_but_start_time $cur/conf/dm-task7.yaml 322 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" \ 323 "stop-task test_incremental_no_source_meta" \ 324 "\"result\": true" 3 325 run_sql_tidb "DROP DATABASE if exists dmctl;" 326 # start task 327 dmctl_start_task 328 check_sync_diff $WORK_DIR $cur/conf/diff_config.toml 329 run_dm_ctl $WORK_DIR "127.0.0.1:$MASTER_PORT" \ 330 "query-status -s $SOURCE_ID1,$SOURCE_ID2" \ 331 "\"result\": true" 3 \ 332 "\"source\": \"$SOURCE_ID1\"" 1 \ 333 "\"source\": \"$SOURCE_ID2\"" 1 \ 334 "\"stage\": \"Running\"" 4 335 # test whether put --master-addr to the end works 336 run_dm_ctl_cmd_mode $WORK_DIR "127.0.0.1:$MASTER_PORT" \ 337 "query-status -s $SOURCE_ID1,$SOURCE_ID2" \ 338 "\"result\": true" 3 \ 339 "\"source\": \"$SOURCE_ID1\"" 1 \ 340 "\"source\": \"$SOURCE_ID2\"" 1 \ 341 "\"stage\": \"Running\"" 4 342 # update_task_not_paused $TASK_CONF 343 344 # stop relay because get_config_to_file will stop source 345 stop_relay_fail 346 stop_relay_success 347 348 # stop worker to test query-status works well when no worker 349 kill_process dmctl_basic/worker1 350 check_port_offline $WORKER1_PORT 20 351 kill_process dmctl_basic/worker2 352 check_port_offline $WORKER2_PORT 20 353 354 query_status_with_offline_worker 355 356 # start worker again 357 run_dm_worker $WORK_DIR/worker1 $WORKER1_PORT $dm_worker1_conf 358 check_rpc_alive $cur/../bin/check_worker_online 127.0.0.1:$WORKER1_PORT 359 360 run_dm_worker $WORK_DIR/worker2 $WORKER2_PORT $dm_worker2_conf 361 check_rpc_alive $cur/../bin/check_worker_online 127.0.0.1:$WORKER2_PORT 362 363 echo "config" 364 config_wrong_arg 365 config_to_file 366 367 # retry to wait for recovered from etcd ready 368 run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ 369 "query-status test" \ 370 "\"stage\": \"Running\"" 2 371 run_dm_ctl_cmd_mode $WORK_DIR "127.0.0.1:$MASTER_PORT" \ 372 "query-status test" \ 373 "\"stage\": \"Running\"" 2 374 375 echo "show_ddl_locks_no_locks" 376 show_ddl_locks_no_locks $TASK_NAME 377 query_status_with_tasks 378 pause_task_success $TASK_NAME 379 query_status_paused_tasks 380 381 echo "dmctl master_addr" 382 dmctl_multiple_addrs 383 dmctl_unwrap_schema 384 dmctl_wrong_addrs 385 dmctl_no_addr 386 387 # echo "update_task_worker_not_found" 388 # update_task_worker_not_found $TASK_CONF 127.0.0.1:9999 389 # update_task_success_single_worker $TASK_CONF $SOURCE_ID1 390 # update_task_success $TASK_CONF 391 392 start_relay_without_worker_name_success 393 start_relay_with_worker_name_fail 394 stop_relay_with_worker_name_fail 395 stop_relay_with_worker_name_success 396 397 start_relay_success 398 399 run_sql_file $cur/data/db1.increment.sql $MYSQL_HOST1 $MYSQL_PORT1 $MYSQL_PASSWORD1 400 run_sql_file $cur/data/db2.increment.sql $MYSQL_HOST2 $MYSQL_PORT2 $MYSQL_PASSWORD2 401 resume_task_success $TASK_NAME 402 query_status_running_tasks 403 check_sync_diff $WORK_DIR $cur/conf/diff_config.toml 20 404 405 # test use task file instead of task name 406 pause_task_success "$cur/conf/dm-task.yaml" 407 resume_task_success "$cur/conf/dm-task.yaml" 408 409 # update_relay_success $cur/conf/source1.yaml $SOURCE_ID1 410 # update_relay_success $cur/conf/source2.yaml $SOURCE_ID2 411 # check worker config backup file is correct 412 [ -f $WORK_DIR/worker1/dm-worker-config.bak ] && cmp $WORK_DIR/worker1/dm-worker-config.bak $cur/conf/dm-worker1.toml 413 [ -f $WORK_DIR/worker2/dm-worker-config.bak ] && cmp $WORK_DIR/worker2/dm-worker-config.bak $cur/conf/dm-worker2.toml 414 # check worker config has been changed 415 md5_new_worker1=$(md5sum $dm_worker1_conf | awk '{print $1}') 416 md5_new_worker2=$(md5sum $dm_worker2_conf | awk '{print $1}') 417 md5_old_worker1=$(md5sum $cur/conf/dm-worker1.toml | awk '{print $1}') 418 md5_old_worker2=$(md5sum $cur/conf/dm-worker2.toml | awk '{print $1}') 419 [ "$md5_new_worker1" != "$md5_old_worker1" ] 420 [ "$md5_new_worker2" != "$md5_old_worker2" ] 421 422 # update_master_config_success $dm_master_conf 423 # cmp $dm_master_conf $cur/conf/dm-master.toml 424 425 # TODO: The ddl sharding part for DM-HA still has some problem. This should be uncommented when it's fixed. 426 # run_sql_file $cur/data/db1.increment2.sql $MYSQL_HOST1 $MYSQL_PORT1 $MYSQL_PASSWORD1 427 # set +e 428 # i=0 429 # while [ $i -lt 10 ] 430 # do 431 # show_ddl_locks_with_locks "$TASK_NAME-\`dmctl\`.\`t_target\`" "ALTER TABLE \`dmctl\`.\`t_target\` DROP COLUMN \`d\`" 432 # ((i++)) 433 # if [ "$?" != 0 ]; then 434 # echo "wait 1s and check for the $i-th time" 435 # sleep 1 436 # else 437 # break 438 # fi 439 # done 440 # set -e 441 # if [ $i -ge 10 ]; then 442 # echo "show_ddl_locks_with_locks check timeout" 443 # exit 1 444 # fi 445 # run_sql_file $cur/data/db2.increment2.sql $MYSQL_HOST2 $MYSQL_PORT2 $MYSQL_PASSWORD2 446 # check_sync_diff $WORK_DIR $cur/conf/diff_config.toml 10 447 # show_ddl_locks_no_locks $TASK_NAME 448 449 # make sure every shard table in source 1 has be forwarded to newer binlog, so older relay log could be purged 450 run_sql_source1 "flush logs" 451 run_sql_source1 "create table dmctl.flush_trigger (c int primary key);" 452 run_sql_source1 "update dmctl.t_1 set d = '' where id = 13" 453 run_sql_source1 "update dmctl.t_2 set d = '' where id = 12" 454 455 # ensure syncer unit has resumed, read latest binlog files and updated ActiveRelayLog 456 check_sync_diff $WORK_DIR $cur/conf/diff_config.toml 457 458 server_uuid=$(tail -n 1 $WORK_DIR/worker1/relay_log/server-uuid.index) 459 run_sql_source1 "show binary logs\G" 460 max_binlog_name=$(grep Log_name "$SQL_RESULT_FILE" | tail -n 1 | awk -F":" '{print $NF}') 461 binlog_count=$(grep Log_name "$SQL_RESULT_FILE" | wc -l) 462 relay_log_count=$(($(ls $WORK_DIR/worker1/relay_log/$server_uuid | wc -l) - 1)) 463 [ "$binlog_count" -eq "$relay_log_count" ] 464 [ "$relay_log_count" -ne 1 ] 465 purge_relay_success $max_binlog_name $SOURCE_ID1 466 new_relay_log_count=$(($(ls $WORK_DIR/worker1/relay_log/$server_uuid | wc -l) - 1)) 467 [ "$new_relay_log_count" -eq 1 ] 468 469 # not be skipped by source configure's sql-pattern because binlog-filter's table name 470 run_sql_source1 "alter table dmctl.t_1 add column aaa int" 471 # skipped by binlog-filter's table name 472 # ps: maybe original reason is to test the task config's filter is prior than source's 473 # ps: but due to binlog-filter's logic, the unmatched table name will be skipped directly. 474 run_sql_source1 "alter table dmctl.t_2 add column aaa int" 475 # skipped by sql-pattern 476 run_sql_source2 "alter table dmctl.t_1 add column aaa int" 477 # skipped by sql-pattern 478 run_sql_source2 "alter table dmctl.t_2 add column aaa int" 479 480 # all t_1 synced, all t_2 unsynced 481 run_sql_source1 "alter table dmctl.t_2 add column bbb int" 482 run_sql_source2 "alter table dmctl.t_2 add column bbb int" 483 484 run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ 485 "query-status test" \ 486 "detect inconsistent DDL sequence" 2 487 488 run_dm_ctl_plain $WORK_DIR "127.0.0.1:$MASTER_PORT" \ 489 "encrypt abc" 490 val=$(cat $WORK_DIR/dmctl-plain.log | head -n 1) 491 echo "encrypt value: $val" 492 ciphertext_len=$(echo $val | awk '{print length($0)}') 493 if [ $ciphertext_len -ne 28 ]; then 494 echo "ciphertext length is not right" 495 exit 1 496 fi 497 498 # start a master without secret-key, encrypt should fail 499 cleanup_process 500 # previous logic will override $dm_master_conf, so we need to copy it again 501 cp $cur/conf/dm-master.toml $dm_master_conf 502 run_dm_master $WORK_DIR/master $MASTER_PORT $dm_master_conf 503 check_rpc_alive $cur/../bin/check_master_online 127.0.0.1:$MASTER_PORT 504 run_dm_ctl_cmd_mode $WORK_DIR "127.0.0.1:$MASTER_PORT" \ 505 "encrypt a" \ 506 "secret key is not initialized" 1 507 } 508 509 cleanup_data dmctl 510 # also cleanup dm processes in case of last run failed 511 cleanup_process 512 run 513 cleanup_process 514 515 echo "[$(date)] <<<<<< test case $TEST_NAME success! >>>>>>"