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! >>>>>>"