From: Andrei Elkin Date: April 8 2011 8:45am Subject: bzr commit into mysql-next-mr-wl5569 branch (andrei.elkin:3275) List-Archive: http://lists.mysql.com/commits/135098 Message-Id: <201104080845.p388jxqM010882@mysql1000.dsl.inet.fi> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1124488385==" --===============1124488385== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/andrei/MySQL/BZR/2a-23May/WL/mysql-next-mr-wl5569-no-dbug-benchmarking/ based on revid:andrei.elkin@stripped 3275 Andrei Elkin 2011-04-08 [merge] merge modified: mysql-test/extra/rpl_tests/rpl_parallel_load.test mysql-test/suite/rpl/r/rpl_parallel.result mysql-test/suite/rpl/r/rpl_sequential.result mysql-test/suite/rpl/t/rpl_parallel-slave.opt sql/log_event.cc sql/rpl_rli.cc sql/rpl_rli.h sql/rpl_slave.cc === modified file 'mysql-test/extra/rpl_tests/rpl_parallel_load.test' --- a/mysql-test/extra/rpl_tests/rpl_parallel_load.test 2011-04-03 10:07:30 +0000 +++ b/mysql-test/extra/rpl_tests/rpl_parallel_load.test 2011-04-06 12:51:58 +0000 @@ -1,8 +1,8 @@ # # This is a load generator to call from rpl_parallel and rpl_sequential tests -# # +# # load volume parameter # @@ -260,26 +260,26 @@ select time_to_sec(@m_1) - time_to_sec(@ time_to_sec(@s_1) - time_to_sec(@s_0) as 'delta_s' into outfile 'delta.out'; -# let $i = $databases + 1; -# while($i) -# { -# let $i1 = $i; -# dec $i1; - -# let $diff_tables=master:test$i1.v_tm_nk, slave:test$i1.v_tm_nk; -# source include/diff_tables.inc; - -# let $diff_tables=master:test$i1.v_ti_nk, slave:test$i1.v_ti_nk; -# source include/diff_tables.inc; +let $i = $databases + 1; +while($i) +{ + let $i1 = $i; + dec $i1; + + let $diff_tables=master:test$i1.v_tm_nk, slave:test$i1.v_tm_nk; + source include/diff_tables.inc; + + let $diff_tables=master:test$i1.v_ti_nk, slave:test$i1.v_ti_nk; + source include/diff_tables.inc; -# let $diff_tables=master:test$i1.v_tm_wk, slave:test$i1.v_tm_wk; -# source include/diff_tables.inc; + let $diff_tables=master:test$i1.v_tm_wk, slave:test$i1.v_tm_wk; + source include/diff_tables.inc; -# let $diff_tables=master:test$i1.v_ti_wk, slave:test$i1.v_ti_wk; -# source include/diff_tables.inc; + let $diff_tables=master:test$i1.v_ti_wk, slave:test$i1.v_ti_wk; + source include/diff_tables.inc; -# dec $i; -# } + dec $i; +} --enable_result_log --enable_query_log === modified file 'mysql-test/suite/rpl/r/rpl_parallel.result' --- a/mysql-test/suite/rpl/r/rpl_parallel.result 2011-04-03 10:07:30 +0000 +++ b/mysql-test/suite/rpl/r/rpl_parallel.result 2011-04-05 16:26:37 +0000 @@ -12,5 +12,69 @@ select ts from test0.benchmark where sta select ts from test0.benchmark where state like 'slave ends load' into @s_1; select time_to_sec(@m_1) - time_to_sec(@m_0) as 'delta_m', time_to_sec(@s_1) - time_to_sec(@s_0) as 'delta_s' into outfile 'delta.out'; +include/diff_tables.inc [master:test15.v_tm_nk, slave:test15.v_tm_nk] +include/diff_tables.inc [master:test15.v_ti_nk, slave:test15.v_ti_nk] +include/diff_tables.inc [master:test15.v_tm_wk, slave:test15.v_tm_wk] +include/diff_tables.inc [master:test15.v_ti_wk, slave:test15.v_ti_wk] +include/diff_tables.inc [master:test14.v_tm_nk, slave:test14.v_tm_nk] +include/diff_tables.inc [master:test14.v_ti_nk, slave:test14.v_ti_nk] +include/diff_tables.inc [master:test14.v_tm_wk, slave:test14.v_tm_wk] +include/diff_tables.inc [master:test14.v_ti_wk, slave:test14.v_ti_wk] +include/diff_tables.inc [master:test13.v_tm_nk, slave:test13.v_tm_nk] +include/diff_tables.inc [master:test13.v_ti_nk, slave:test13.v_ti_nk] +include/diff_tables.inc [master:test13.v_tm_wk, slave:test13.v_tm_wk] +include/diff_tables.inc [master:test13.v_ti_wk, slave:test13.v_ti_wk] +include/diff_tables.inc [master:test12.v_tm_nk, slave:test12.v_tm_nk] +include/diff_tables.inc [master:test12.v_ti_nk, slave:test12.v_ti_nk] +include/diff_tables.inc [master:test12.v_tm_wk, slave:test12.v_tm_wk] +include/diff_tables.inc [master:test12.v_ti_wk, slave:test12.v_ti_wk] +include/diff_tables.inc [master:test11.v_tm_nk, slave:test11.v_tm_nk] +include/diff_tables.inc [master:test11.v_ti_nk, slave:test11.v_ti_nk] +include/diff_tables.inc [master:test11.v_tm_wk, slave:test11.v_tm_wk] +include/diff_tables.inc [master:test11.v_ti_wk, slave:test11.v_ti_wk] +include/diff_tables.inc [master:test10.v_tm_nk, slave:test10.v_tm_nk] +include/diff_tables.inc [master:test10.v_ti_nk, slave:test10.v_ti_nk] +include/diff_tables.inc [master:test10.v_tm_wk, slave:test10.v_tm_wk] +include/diff_tables.inc [master:test10.v_ti_wk, slave:test10.v_ti_wk] +include/diff_tables.inc [master:test9.v_tm_nk, slave:test9.v_tm_nk] +include/diff_tables.inc [master:test9.v_ti_nk, slave:test9.v_ti_nk] +include/diff_tables.inc [master:test9.v_tm_wk, slave:test9.v_tm_wk] +include/diff_tables.inc [master:test9.v_ti_wk, slave:test9.v_ti_wk] +include/diff_tables.inc [master:test8.v_tm_nk, slave:test8.v_tm_nk] +include/diff_tables.inc [master:test8.v_ti_nk, slave:test8.v_ti_nk] +include/diff_tables.inc [master:test8.v_tm_wk, slave:test8.v_tm_wk] +include/diff_tables.inc [master:test8.v_ti_wk, slave:test8.v_ti_wk] +include/diff_tables.inc [master:test7.v_tm_nk, slave:test7.v_tm_nk] +include/diff_tables.inc [master:test7.v_ti_nk, slave:test7.v_ti_nk] +include/diff_tables.inc [master:test7.v_tm_wk, slave:test7.v_tm_wk] +include/diff_tables.inc [master:test7.v_ti_wk, slave:test7.v_ti_wk] +include/diff_tables.inc [master:test6.v_tm_nk, slave:test6.v_tm_nk] +include/diff_tables.inc [master:test6.v_ti_nk, slave:test6.v_ti_nk] +include/diff_tables.inc [master:test6.v_tm_wk, slave:test6.v_tm_wk] +include/diff_tables.inc [master:test6.v_ti_wk, slave:test6.v_ti_wk] +include/diff_tables.inc [master:test5.v_tm_nk, slave:test5.v_tm_nk] +include/diff_tables.inc [master:test5.v_ti_nk, slave:test5.v_ti_nk] +include/diff_tables.inc [master:test5.v_tm_wk, slave:test5.v_tm_wk] +include/diff_tables.inc [master:test5.v_ti_wk, slave:test5.v_ti_wk] +include/diff_tables.inc [master:test4.v_tm_nk, slave:test4.v_tm_nk] +include/diff_tables.inc [master:test4.v_ti_nk, slave:test4.v_ti_nk] +include/diff_tables.inc [master:test4.v_tm_wk, slave:test4.v_tm_wk] +include/diff_tables.inc [master:test4.v_ti_wk, slave:test4.v_ti_wk] +include/diff_tables.inc [master:test3.v_tm_nk, slave:test3.v_tm_nk] +include/diff_tables.inc [master:test3.v_ti_nk, slave:test3.v_ti_nk] +include/diff_tables.inc [master:test3.v_tm_wk, slave:test3.v_tm_wk] +include/diff_tables.inc [master:test3.v_ti_wk, slave:test3.v_ti_wk] +include/diff_tables.inc [master:test2.v_tm_nk, slave:test2.v_tm_nk] +include/diff_tables.inc [master:test2.v_ti_nk, slave:test2.v_ti_nk] +include/diff_tables.inc [master:test2.v_tm_wk, slave:test2.v_tm_wk] +include/diff_tables.inc [master:test2.v_ti_wk, slave:test2.v_ti_wk] +include/diff_tables.inc [master:test1.v_tm_nk, slave:test1.v_tm_nk] +include/diff_tables.inc [master:test1.v_ti_nk, slave:test1.v_ti_nk] +include/diff_tables.inc [master:test1.v_tm_wk, slave:test1.v_tm_wk] +include/diff_tables.inc [master:test1.v_ti_wk, slave:test1.v_ti_wk] +include/diff_tables.inc [master:test0.v_tm_nk, slave:test0.v_tm_nk] +include/diff_tables.inc [master:test0.v_ti_nk, slave:test0.v_ti_nk] +include/diff_tables.inc [master:test0.v_tm_wk, slave:test0.v_tm_wk] +include/diff_tables.inc [master:test0.v_ti_wk, slave:test0.v_ti_wk] set @@global.mts_exp_slave_local_timestamp= @save.mts_exp_slave_local_timestamp; include/rpl_end.inc === modified file 'mysql-test/suite/rpl/r/rpl_sequential.result' --- a/mysql-test/suite/rpl/r/rpl_sequential.result 2011-04-03 10:07:30 +0000 +++ b/mysql-test/suite/rpl/r/rpl_sequential.result 2011-04-06 12:51:58 +0000 @@ -16,5 +16,69 @@ select ts from test0.benchmark where sta select ts from test0.benchmark where state like 'slave ends load' into @s_1; select time_to_sec(@m_1) - time_to_sec(@m_0) as 'delta_m', time_to_sec(@s_1) - time_to_sec(@s_0) as 'delta_s' into outfile 'delta.out'; +include/diff_tables.inc [master:test15.v_tm_nk, slave:test15.v_tm_nk] +include/diff_tables.inc [master:test15.v_ti_nk, slave:test15.v_ti_nk] +include/diff_tables.inc [master:test15.v_tm_wk, slave:test15.v_tm_wk] +include/diff_tables.inc [master:test15.v_ti_wk, slave:test15.v_ti_wk] +include/diff_tables.inc [master:test14.v_tm_nk, slave:test14.v_tm_nk] +include/diff_tables.inc [master:test14.v_ti_nk, slave:test14.v_ti_nk] +include/diff_tables.inc [master:test14.v_tm_wk, slave:test14.v_tm_wk] +include/diff_tables.inc [master:test14.v_ti_wk, slave:test14.v_ti_wk] +include/diff_tables.inc [master:test13.v_tm_nk, slave:test13.v_tm_nk] +include/diff_tables.inc [master:test13.v_ti_nk, slave:test13.v_ti_nk] +include/diff_tables.inc [master:test13.v_tm_wk, slave:test13.v_tm_wk] +include/diff_tables.inc [master:test13.v_ti_wk, slave:test13.v_ti_wk] +include/diff_tables.inc [master:test12.v_tm_nk, slave:test12.v_tm_nk] +include/diff_tables.inc [master:test12.v_ti_nk, slave:test12.v_ti_nk] +include/diff_tables.inc [master:test12.v_tm_wk, slave:test12.v_tm_wk] +include/diff_tables.inc [master:test12.v_ti_wk, slave:test12.v_ti_wk] +include/diff_tables.inc [master:test11.v_tm_nk, slave:test11.v_tm_nk] +include/diff_tables.inc [master:test11.v_ti_nk, slave:test11.v_ti_nk] +include/diff_tables.inc [master:test11.v_tm_wk, slave:test11.v_tm_wk] +include/diff_tables.inc [master:test11.v_ti_wk, slave:test11.v_ti_wk] +include/diff_tables.inc [master:test10.v_tm_nk, slave:test10.v_tm_nk] +include/diff_tables.inc [master:test10.v_ti_nk, slave:test10.v_ti_nk] +include/diff_tables.inc [master:test10.v_tm_wk, slave:test10.v_tm_wk] +include/diff_tables.inc [master:test10.v_ti_wk, slave:test10.v_ti_wk] +include/diff_tables.inc [master:test9.v_tm_nk, slave:test9.v_tm_nk] +include/diff_tables.inc [master:test9.v_ti_nk, slave:test9.v_ti_nk] +include/diff_tables.inc [master:test9.v_tm_wk, slave:test9.v_tm_wk] +include/diff_tables.inc [master:test9.v_ti_wk, slave:test9.v_ti_wk] +include/diff_tables.inc [master:test8.v_tm_nk, slave:test8.v_tm_nk] +include/diff_tables.inc [master:test8.v_ti_nk, slave:test8.v_ti_nk] +include/diff_tables.inc [master:test8.v_tm_wk, slave:test8.v_tm_wk] +include/diff_tables.inc [master:test8.v_ti_wk, slave:test8.v_ti_wk] +include/diff_tables.inc [master:test7.v_tm_nk, slave:test7.v_tm_nk] +include/diff_tables.inc [master:test7.v_ti_nk, slave:test7.v_ti_nk] +include/diff_tables.inc [master:test7.v_tm_wk, slave:test7.v_tm_wk] +include/diff_tables.inc [master:test7.v_ti_wk, slave:test7.v_ti_wk] +include/diff_tables.inc [master:test6.v_tm_nk, slave:test6.v_tm_nk] +include/diff_tables.inc [master:test6.v_ti_nk, slave:test6.v_ti_nk] +include/diff_tables.inc [master:test6.v_tm_wk, slave:test6.v_tm_wk] +include/diff_tables.inc [master:test6.v_ti_wk, slave:test6.v_ti_wk] +include/diff_tables.inc [master:test5.v_tm_nk, slave:test5.v_tm_nk] +include/diff_tables.inc [master:test5.v_ti_nk, slave:test5.v_ti_nk] +include/diff_tables.inc [master:test5.v_tm_wk, slave:test5.v_tm_wk] +include/diff_tables.inc [master:test5.v_ti_wk, slave:test5.v_ti_wk] +include/diff_tables.inc [master:test4.v_tm_nk, slave:test4.v_tm_nk] +include/diff_tables.inc [master:test4.v_ti_nk, slave:test4.v_ti_nk] +include/diff_tables.inc [master:test4.v_tm_wk, slave:test4.v_tm_wk] +include/diff_tables.inc [master:test4.v_ti_wk, slave:test4.v_ti_wk] +include/diff_tables.inc [master:test3.v_tm_nk, slave:test3.v_tm_nk] +include/diff_tables.inc [master:test3.v_ti_nk, slave:test3.v_ti_nk] +include/diff_tables.inc [master:test3.v_tm_wk, slave:test3.v_tm_wk] +include/diff_tables.inc [master:test3.v_ti_wk, slave:test3.v_ti_wk] +include/diff_tables.inc [master:test2.v_tm_nk, slave:test2.v_tm_nk] +include/diff_tables.inc [master:test2.v_ti_nk, slave:test2.v_ti_nk] +include/diff_tables.inc [master:test2.v_tm_wk, slave:test2.v_tm_wk] +include/diff_tables.inc [master:test2.v_ti_wk, slave:test2.v_ti_wk] +include/diff_tables.inc [master:test1.v_tm_nk, slave:test1.v_tm_nk] +include/diff_tables.inc [master:test1.v_ti_nk, slave:test1.v_ti_nk] +include/diff_tables.inc [master:test1.v_tm_wk, slave:test1.v_tm_wk] +include/diff_tables.inc [master:test1.v_ti_wk, slave:test1.v_ti_wk] +include/diff_tables.inc [master:test0.v_tm_nk, slave:test0.v_tm_nk] +include/diff_tables.inc [master:test0.v_ti_nk, slave:test0.v_ti_nk] +include/diff_tables.inc [master:test0.v_tm_wk, slave:test0.v_tm_wk] +include/diff_tables.inc [master:test0.v_ti_wk, slave:test0.v_ti_wk] set @@global.mts_exp_slave_local_timestamp= @save.mts_exp_slave_local_timestamp; include/rpl_end.inc === modified file 'mysql-test/suite/rpl/t/rpl_parallel-slave.opt' --- a/mysql-test/suite/rpl/t/rpl_parallel-slave.opt 2011-04-03 10:09:35 +0000 +++ b/mysql-test/suite/rpl/t/rpl_parallel-slave.opt 2011-04-08 08:45:45 +0000 @@ -1 +1,2 @@ --log-warnings=0 --slave-transaction-retries=0 + === modified file 'sql/log_event.cc' --- a/sql/log_event.cc 2011-03-30 14:11:24 +0000 +++ b/sql/log_event.cc 2011-04-06 12:51:58 +0000 @@ -2714,7 +2714,7 @@ void append_item_to_jobs(slave_job_item sprintf(wait_info, info_format, new_pend_size); rli->mts_wqs_oversize= TRUE; - rli->wait_jobs++; + rli->wait_jobs++; // waiting due to the total size old_msg= thd->enter_cond(&rli->pending_jobs_cond, &rli->pending_jobs_lock, wait_info); mysql_cond_wait(&rli->pending_jobs_cond, &rli->pending_jobs_lock); @@ -2741,6 +2741,7 @@ void append_item_to_jobs(slave_job_item // todo: experiment with weight to get a good approximation formula ulong nap_weight= rli->mts_wqs_overrun + 1; my_sleep(nap_weight * rli->mts_coordinator_basic_nap); + rli->mts_wqs_underrun_cnt++; } ret= -1; @@ -2761,6 +2762,7 @@ void append_item_to_jobs(slave_job_item old_msg= thd->enter_cond(&w->jobs_cond, &w->jobs_lock, wait_info); w->jobs.overfill= TRUE; w->jobs.waited_overfill++; + rli->mts_wqs_overfill_cnt++; mysql_cond_wait(&w->jobs_cond, &w->jobs_lock); thd->exit_cond(old_msg); @@ -3066,6 +3068,7 @@ int slave_worker_exec_job(Slave_worker * if (w->jobs.len == w->jobs.s - 1 && w->jobs.overfill == TRUE) { w->jobs.overfill= FALSE; + // todo: w->hungry_cnt++; mysql_cond_signal(&w->jobs_cond); } mysql_mutex_unlock(&w->jobs_lock); @@ -3081,8 +3084,7 @@ int slave_worker_exec_job(Slave_worker * if ((rli->mts_worker_underrun_level * w->jobs.s) / 100 > w->jobs.len) { rli-> mts_wqs_underrun_w_id= w->id; - // todo: - // w->underrun_cnt++; + // todo: w->underrun_cnt++; } else if (rli->mts_wqs_underrun_w_id == w->id) { rli->mts_wqs_underrun_w_id= (ulong) -1; @@ -3093,8 +3095,7 @@ int slave_worker_exec_job(Slave_worker * { rli->mts_wqs_overrun++; w->wq_overrun_set= TRUE; - // todo: - // w->underrun_cnt++; + // todo: w->underrun_cnt++; } else if (w->wq_overrun_set == TRUE) { === modified file 'sql/rpl_rli.cc' --- a/sql/rpl_rli.cc 2011-02-27 17:35:25 +0000 +++ b/sql/rpl_rli.cc 2011-04-06 12:51:58 +0000 @@ -107,6 +107,7 @@ void Relay_log_info::init_workers(ulong whether the feature is or going to be active or not. */ trans_jobs= stmt_jobs= pending_jobs= wait_jobs= 0; + mts_wqs_underrun_cnt= mts_wqs_overfill_cnt= 0; key_mutex_slave_parallel_worker= new PSI_mutex_key[slave_parallel_workers]; key_cond_slave_parallel_worker= new PSI_cond_key[slave_parallel_workers]; === modified file 'sql/rpl_rli.h' --- a/sql/rpl_rli.h 2011-02-27 17:35:25 +0000 +++ b/sql/rpl_rli.h 2011-04-06 12:51:58 +0000 @@ -436,7 +436,7 @@ public: */ DYNAMIC_ARRAY workers; // number's is determined by global slave_parallel_workers volatile ulong pending_jobs; - ulong trans_jobs, wait_jobs, stmt_jobs; // live time is one trans, statement (ndb epoch) + ulong trans_jobs, wait_jobs, stmt_jobs; // wait_jobs - waiting times due to the total size mysql_mutex_t pending_jobs_lock; mysql_cond_t pending_jobs_cond; ulong mts_slave_worker_queue_len_max; @@ -451,6 +451,8 @@ public: bool curr_group_isolated; // Trans is exec:d by Worker but in exclusive env volatile ulong mts_wqs_underrun_w_id; // Id of a Worker whose queue is getting empty volatile long mts_wqs_overrun; // W to incr and decr + ulong mts_wqs_underrun_cnt; // Coord goes to sleep when senses Workers are content + ulong mts_wqs_overfill_cnt; // Coord waits if a W's queue is full long mts_worker_underrun_level; // percent of WQ size at which Worker claims hungry ulong mts_coordinator_basic_nap; // C sleeps to avoid WQs overrun Slave_worker* get_current_worker() const; === modified file 'sql/rpl_slave.cc' --- a/sql/rpl_slave.cc 2011-03-30 14:11:24 +0000 +++ b/sql/rpl_slave.cc 2011-04-06 12:51:58 +0000 @@ -3784,6 +3784,12 @@ pthread_handler_t handle_slave_worker(vo mysql_mutex_lock(&w->jobs_lock); w->jobs.len= rli->mts_slave_worker_queue_len_max + 1; + sql_print_information("Worker %lu statistics: " + "events processed = %lu " + "hungry waits = %lu " + "priv queue overfills = %llu " + ,w->id, w->stmt_jobs, w->wait_jobs, w->jobs.waited_overfill); + mysql_cond_signal(&w->jobs_cond); // famous last goodbye mysql_mutex_unlock(&w->jobs_lock); @@ -4437,6 +4443,13 @@ void slave_stop_workers(Relay_log_info * delete w; } + sql_print_information("MTS coordinator statistics: " + "events processed = %lu " + "waits due a Worker queue full = %lu " + "waits due the total size = %lu " + "sleeps when Workers occupied = %lu " + ,rli->stmt_jobs, rli->mts_wqs_overfill_cnt, rli->wait_jobs, rli->mts_wqs_underrun_cnt); + DBUG_ASSERT(rli->pending_jobs == 0); DBUG_ASSERT(rli->mts_pending_jobs_size == 0); --===============1124488385== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/andrei.elkin@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: andrei.elkin@stripped # target_branch: file:///home/andrei/MySQL/BZR/2a-23May/WL/mysql-next-\ # mr-wl5569-no-dbug-benchmarking/ # testament_sha1: 9c67e93bccbd8fad0cce28803109b17c7fed1c49 # timestamp: 2011-04-08 11:45:59 +0300 # source_branch: file:///home/andrei/MySQL/BZR/2a-23May/WL/mysql-next-\ # mr-wl5569/ # base_revision_id: andrei.elkin@stripped\ # wokracxyu4dkdh7d # # Begin bundle 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 2DW9x/8XckU4UJD3a4ET --===============1124488385==--