From: Andrei Elkin Date: June 14 2011 10:32am Subject: bzr commit into mysql-next-mr-wl5569 branch (andrei.elkin:3289) List-Archive: http://lists.mysql.com/commits/139187 Message-Id: <201106141032.p5EAWK3O000401@mysql1000.dsl.inet.fi> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1995742173==" --===============1995742173== 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/MERGE/mysql-next-mr-wl5569/ based on revid:andrei.elkin@stripped 3289 Andrei Elkin 2011-06-14 [merge] merge from trunk modified: mysql-test/suite/funcs_1/r/is_columns_mysql_embedded.result mysql-test/suite/funcs_1/r/is_statistics_mysql_embedded.result mysql-test/suite/funcs_1/r/is_table_constraints_mysql_embedded.result mysql-test/suite/funcs_1/r/is_tables_mysql_embedded.result sql/rpl_info.cc sql/rpl_info.h sql/rpl_mi.cc sql/rpl_mi.h sql/rpl_rli.cc sql/rpl_rli.h sql/rpl_rli_pdb.cc sql/rpl_rli_pdb.h sql/rpl_slave.cc === modified file 'mysql-test/suite/funcs_1/r/is_columns_mysql_embedded.result' --- a/mysql-test/suite/funcs_1/r/is_columns_mysql_embedded.result 2011-05-06 10:38:10 +0000 +++ b/mysql-test/suite/funcs_1/r/is_columns_mysql_embedded.result 2011-06-13 06:04:55 +0000 @@ -175,9 +175,23 @@ def mysql slave_relay_log_info Master_id def mysql slave_relay_log_info Master_log_name 5 NULL NO text 65535 65535 NULL NULL utf8 utf8_bin text The name of the master binary log file from which the events in the relay log file were read. def mysql slave_relay_log_info Master_log_pos 6 NULL NO bigint NULL NULL 20 0 NULL NULL bigint(20) unsigned The master log position of the last executed event. def mysql slave_relay_log_info Number_of_lines 2 NULL NO int NULL NULL 10 0 NULL NULL int(10) unsigned Number of lines in the file or rows in the table. Used to version table definitions. +def mysql slave_relay_log_info Number_of_workers 8 NULL NO int NULL NULL 10 0 NULL NULL int(10) unsigned def mysql slave_relay_log_info Relay_log_name 3 NULL NO text 65535 65535 NULL NULL utf8 utf8_bin text The name of the current relay log file. def mysql slave_relay_log_info Relay_log_pos 4 NULL NO bigint NULL NULL 20 0 NULL NULL bigint(20) unsigned The relay log position of the last executed event. def mysql slave_relay_log_info Sql_delay 7 NULL NO int NULL NULL 10 0 NULL NULL int(11) The number of seconds that the slave must lag behind the master. +def mysql slave_worker_info Checkpoint_group_bitmap 13 NULL NO blob 65535 65535 NULL NULL NULL NULL blob +def mysql slave_worker_info Checkpoint_group_size 12 NULL NO int NULL NULL 10 0 NULL NULL int(10) unsigned +def mysql slave_worker_info Checkpoint_master_log_name 9 NULL NO text 65535 65535 NULL NULL utf8 utf8_bin text +def mysql slave_worker_info Checkpoint_master_log_pos 10 NULL NO bigint NULL NULL 20 0 NULL NULL bigint(20) unsigned +def mysql slave_worker_info Checkpoint_relay_log_name 7 NULL NO text 65535 65535 NULL NULL utf8 utf8_bin text +def mysql slave_worker_info Checkpoint_relay_log_pos 8 NULL NO bigint NULL NULL 20 0 NULL NULL bigint(20) unsigned +def mysql slave_worker_info Checkpoint_seqno 11 NULL NO int NULL NULL 10 0 NULL NULL int(10) unsigned +def mysql slave_worker_info Master_id 1 NULL NO int NULL NULL 10 0 NULL NULL int(10) unsigned PRI +def mysql slave_worker_info Master_log_name 5 NULL NO text 65535 65535 NULL NULL utf8 utf8_bin text +def mysql slave_worker_info Master_log_pos 6 NULL NO bigint NULL NULL 20 0 NULL NULL bigint(20) unsigned +def mysql slave_worker_info Relay_log_name 3 NULL NO text 65535 65535 NULL NULL utf8 utf8_bin text +def mysql slave_worker_info Relay_log_pos 4 NULL NO bigint NULL NULL 20 0 NULL NULL bigint(20) unsigned +def mysql slave_worker_info Worker_id 2 NULL NO int NULL NULL 10 0 NULL NULL int(10) unsigned PRI def mysql slow_log db 7 NULL NO varchar 512 1536 NULL NULL utf8 utf8_general_ci varchar(512) def mysql slow_log insert_id 9 NULL NO int NULL NULL 10 0 NULL NULL int(11) def mysql slow_log last_insert_id 8 NULL NO int NULL NULL 10 0 NULL NULL int(11) @@ -501,6 +515,20 @@ NULL mysql slave_relay_log_info Relay_lo 1.0000 mysql slave_relay_log_info Master_log_name text 65535 65535 utf8 utf8_bin text NULL mysql slave_relay_log_info Master_log_pos bigint NULL NULL NULL NULL bigint(20) unsigned NULL mysql slave_relay_log_info Sql_delay int NULL NULL NULL NULL int(11) +NULL mysql slave_relay_log_info Number_of_workers int NULL NULL NULL NULL int(10) unsigned +NULL mysql slave_worker_info Master_id int NULL NULL NULL NULL int(10) unsigned +NULL mysql slave_worker_info Worker_id int NULL NULL NULL NULL int(10) unsigned +1.0000 mysql slave_worker_info Relay_log_name text 65535 65535 utf8 utf8_bin text +NULL mysql slave_worker_info Relay_log_pos bigint NULL NULL NULL NULL bigint(20) unsigned +1.0000 mysql slave_worker_info Master_log_name text 65535 65535 utf8 utf8_bin text +NULL mysql slave_worker_info Master_log_pos bigint NULL NULL NULL NULL bigint(20) unsigned +1.0000 mysql slave_worker_info Checkpoint_relay_log_name text 65535 65535 utf8 utf8_bin text +NULL mysql slave_worker_info Checkpoint_relay_log_pos bigint NULL NULL NULL NULL bigint(20) unsigned +1.0000 mysql slave_worker_info Checkpoint_master_log_name text 65535 65535 utf8 utf8_bin text +NULL mysql slave_worker_info Checkpoint_master_log_pos bigint NULL NULL NULL NULL bigint(20) unsigned +NULL mysql slave_worker_info Checkpoint_seqno int NULL NULL NULL NULL int(10) unsigned +NULL mysql slave_worker_info Checkpoint_group_size int NULL NULL NULL NULL int(10) unsigned +1.0000 mysql slave_worker_info Checkpoint_group_bitmap blob 65535 65535 NULL NULL blob NULL mysql slow_log start_time timestamp NULL NULL NULL NULL timestamp 1.0000 mysql slow_log user_host mediumtext 16777215 16777215 utf8 utf8_general_ci mediumtext NULL mysql slow_log query_time time NULL NULL NULL NULL time === modified file 'mysql-test/suite/funcs_1/r/is_statistics_mysql_embedded.result' --- a/mysql-test/suite/funcs_1/r/is_statistics_mysql_embedded.result 2011-03-18 11:20:23 +0000 +++ b/mysql-test/suite/funcs_1/r/is_statistics_mysql_embedded.result 2011-06-13 06:04:55 +0000 @@ -48,6 +48,8 @@ def mysql proxies_priv 0 mysql PRIMARY 4 def mysql servers 0 mysql PRIMARY 1 Server_name A #CARD# NULL NULL BTREE def mysql slave_master_info 0 mysql PRIMARY 1 Master_id A #CARD# NULL NULL BTREE def mysql slave_relay_log_info 0 mysql PRIMARY 1 Master_id A #CARD# NULL NULL BTREE +def mysql slave_worker_info 0 mysql PRIMARY 1 Master_id A #CARD# NULL NULL BTREE +def mysql slave_worker_info 0 mysql PRIMARY 2 Worker_id A #CARD# NULL NULL BTREE def mysql tables_priv 1 mysql Grantor 1 Grantor A #CARD# NULL NULL BTREE def mysql tables_priv 0 mysql PRIMARY 1 Host A #CARD# NULL NULL BTREE def mysql tables_priv 0 mysql PRIMARY 2 Db A #CARD# NULL NULL BTREE @@ -108,6 +110,8 @@ def mysql proxies_priv 0 mysql PRIMARY 4 def mysql servers 0 mysql PRIMARY 1 Server_name A #CARD# NULL NULL BTREE def mysql slave_master_info 0 mysql PRIMARY 1 Master_id A #CARD# NULL NULL BTREE def mysql slave_relay_log_info 0 mysql PRIMARY 1 Master_id A #CARD# NULL NULL BTREE +def mysql slave_worker_info 0 mysql PRIMARY 1 Master_id A #CARD# NULL NULL BTREE +def mysql slave_worker_info 0 mysql PRIMARY 2 Worker_id A #CARD# NULL NULL BTREE def mysql tables_priv 1 mysql Grantor 1 Grantor A #CARD# NULL NULL BTREE def mysql tables_priv 0 mysql PRIMARY 1 Host A #CARD# NULL NULL BTREE def mysql tables_priv 0 mysql PRIMARY 2 Db A #CARD# NULL NULL BTREE === modified file 'mysql-test/suite/funcs_1/r/is_table_constraints_mysql_embedded.result' --- a/mysql-test/suite/funcs_1/r/is_table_constraints_mysql_embedded.result 2011-03-18 11:20:23 +0000 +++ b/mysql-test/suite/funcs_1/r/is_table_constraints_mysql_embedded.result 2011-06-13 06:04:55 +0000 @@ -27,6 +27,7 @@ def mysql PRIMARY mysql proxies_priv PRI def mysql PRIMARY mysql servers PRIMARY KEY def mysql PRIMARY mysql slave_master_info PRIMARY KEY def mysql PRIMARY mysql slave_relay_log_info PRIMARY KEY +def mysql PRIMARY mysql slave_worker_info PRIMARY KEY def mysql PRIMARY mysql tables_priv PRIMARY KEY def mysql PRIMARY mysql time_zone PRIMARY KEY def mysql PRIMARY mysql time_zone_leap_second PRIMARY KEY @@ -59,6 +60,7 @@ def mysql PRIMARY mysql proxies_priv PRI def mysql PRIMARY mysql servers PRIMARY KEY def mysql PRIMARY mysql slave_master_info PRIMARY KEY def mysql PRIMARY mysql slave_relay_log_info PRIMARY KEY +def mysql PRIMARY mysql slave_worker_info PRIMARY KEY def mysql PRIMARY mysql tables_priv PRIMARY KEY def mysql PRIMARY mysql time_zone PRIMARY KEY def mysql PRIMARY mysql time_zone_leap_second PRIMARY KEY === modified file 'mysql-test/suite/funcs_1/r/is_tables_mysql_embedded.result' --- a/mysql-test/suite/funcs_1/r/is_tables_mysql_embedded.result 2011-03-18 11:20:23 +0000 +++ b/mysql-test/suite/funcs_1/r/is_tables_mysql_embedded.result 2011-06-13 06:04:55 +0000 @@ -428,6 +428,29 @@ user_comment Relay Log Information Separator ----------------------------------------------------- TABLE_CATALOG def TABLE_SCHEMA mysql +TABLE_NAME slave_worker_info +TABLE_TYPE BASE TABLE +ENGINE MyISAM +VERSION 10 +ROW_FORMAT Dynamic +TABLE_ROWS #TBLR# +AVG_ROW_LENGTH #ARL# +DATA_LENGTH #DL# +MAX_DATA_LENGTH #MDL# +INDEX_LENGTH #IL# +DATA_FREE #DF# +AUTO_INCREMENT NULL +CREATE_TIME #CRT# +UPDATE_TIME #UT# +CHECK_TIME #CT# +TABLE_COLLATION utf8_general_ci +CHECKSUM NULL +CREATE_OPTIONS #CO# +TABLE_COMMENT #TC# +user_comment Worker Information +Separator ----------------------------------------------------- +TABLE_CATALOG def +TABLE_SCHEMA mysql TABLE_NAME slow_log TABLE_TYPE BASE TABLE ENGINE CSV @@ -1042,6 +1065,29 @@ user_comment Relay Log Information Separator ----------------------------------------------------- TABLE_CATALOG def TABLE_SCHEMA mysql +TABLE_NAME slave_worker_info +TABLE_TYPE BASE TABLE +ENGINE MyISAM +VERSION 10 +ROW_FORMAT Dynamic +TABLE_ROWS #TBLR# +AVG_ROW_LENGTH #ARL# +DATA_LENGTH #DL# +MAX_DATA_LENGTH #MDL# +INDEX_LENGTH #IL# +DATA_FREE #DF# +AUTO_INCREMENT NULL +CREATE_TIME #CRT# +UPDATE_TIME #UT# +CHECK_TIME #CT# +TABLE_COLLATION utf8_general_ci +CHECKSUM NULL +CREATE_OPTIONS #CO# +TABLE_COMMENT #TC# +user_comment Worker Information +Separator ----------------------------------------------------- +TABLE_CATALOG def +TABLE_SCHEMA mysql TABLE_NAME slow_log TABLE_TYPE BASE TABLE ENGINE CSV === modified file 'sql/rpl_info.cc' --- a/sql/rpl_info.cc 2011-06-09 15:27:47 +0000 +++ b/sql/rpl_info.cc 2011-06-13 00:07:26 +0000 @@ -17,29 +17,44 @@ #include #include "rpl_info.h" -Rpl_info::Rpl_info(const char* type) +Rpl_info::Rpl_info(const char* type, const char* description) : Slave_reporting_capability(type), info_thd(0), uidx(0), nidx(0), inited(0), abort_slave(0), slave_running(0), slave_run_id(0), handler(0), rpl_info_type(INVALID_INFO_REPOSITORY) +#ifdef HAVE_PSI_INTERFACE + , mutex_info(0), cond_info(0), key_mutex_info(0), key_cond_info(0) +#endif { + register_mutexes(description); } Rpl_info::~Rpl_info() { delete []uidx; delete handler; -} -Rpl_info_coordinator::Rpl_info_coordinator(const char* type, const char* psf) - : Rpl_info(type), mutex_info(0), cond_info(0), key_mutex_info(0), - key_cond_info(0) -{ - register_mutexes(psf); + if (registered_mutexes) + { +#ifdef HAVE_PSI_INTERFACE + delete []key_mutex_info; + delete []key_cond_info; + delete []mutex_info; + delete []cond_info; +#endif + } + + mysql_mutex_destroy(&run_lock); + mysql_mutex_destroy(&data_lock); + mysql_mutex_destroy(&sleep_lock); + mysql_cond_destroy(&data_cond); + mysql_cond_destroy(&start_cond); + mysql_cond_destroy(&stop_cond); + mysql_cond_destroy(&sleep_cond); } -bool Rpl_info_coordinator::register_mutexes(const char* description) +bool Rpl_info::register_mutexes(const char* description) { #ifdef HAVE_PSI_INTERFACE const int NUMBER_MUTEX_INFO= 3; @@ -60,33 +75,32 @@ bool Rpl_info_coordinator::register_mute goto err; mutex_info[RUN_LOCK_IDX].m_key= (PSI_mutex_key *) &(key_mutex_info[RUN_LOCK_IDX]); - mutex_info[RUN_LOCK_IDX].m_name= "Rpl_info_coordinator::run_lock"; + mutex_info[RUN_LOCK_IDX].m_name= "Rpl_info::run_lock"; mutex_info[RUN_LOCK_IDX].m_flags= 0; mutex_info[DATA_LOCK_IDX].m_key= (PSI_mutex_key *) &(key_mutex_info[DATA_LOCK_IDX]); - mutex_info[DATA_LOCK_IDX].m_name= "Rpl_info_coordinator::data_lock"; + mutex_info[DATA_LOCK_IDX].m_name= "Rpl_info::data_lock"; mutex_info[DATA_LOCK_IDX].m_flags= 0; mutex_info[SLEEP_LOCK_IDX].m_key= (PSI_mutex_key *) &(key_mutex_info[SLEEP_LOCK_IDX]); - mutex_info[SLEEP_LOCK_IDX].m_name= "Rpl_info_coordinator::sleep_lock"; + mutex_info[SLEEP_LOCK_IDX].m_name= "Rpl_info::sleep_lock"; mutex_info[SLEEP_LOCK_IDX].m_flags= 0; cond_info[DATA_COND_IDX].m_key= (PSI_cond_key *) &(key_cond_info[DATA_COND_IDX]); - cond_info[DATA_COND_IDX].m_name= "Rpl_info_coordinator::data_cond"; + cond_info[DATA_COND_IDX].m_name= "Rpl_info::data_cond"; cond_info[DATA_COND_IDX].m_flags= 0; cond_info[START_COND_IDX].m_key= (PSI_cond_key *) &(key_cond_info[START_COND_IDX]); - cond_info[START_COND_IDX].m_name= "Rpl_info_coordinator::start_cond"; + cond_info[START_COND_IDX].m_name= "Rpl_info::start_cond"; cond_info[START_COND_IDX].m_flags= 0; cond_info[STOP_COND_IDX].m_key= (PSI_cond_key *) &(key_cond_info[STOP_COND_IDX]); - cond_info[STOP_COND_IDX].m_name= "Rpl_info_coordinator::stop_cond"; + cond_info[STOP_COND_IDX].m_name= "Rpl_info::stop_cond"; cond_info[STOP_COND_IDX].m_flags= 0; cond_info[SLEEP_COND_IDX].m_key= (PSI_cond_key *) &(key_cond_info[SLEEP_COND_IDX]); - cond_info[SLEEP_COND_IDX].m_name= "Rpl_info_coordinator::sleep_cond"; + cond_info[SLEEP_COND_IDX].m_name= "Rpl_info::sleep_cond"; cond_info[SLEEP_COND_IDX].m_flags= 0; if (PSI_server) { PSI_server->register_mutex(description, mutex_info, NUMBER_MUTEX_INFO); - PSI_server->register_cond(description, cond_info, NUMBER_COND_INFO); } @@ -104,11 +118,9 @@ bool Rpl_info_coordinator::register_mute mysql_cond_init(key_cond_info[SLEEP_COND_IDX], &sleep_cond, NULL); registered_mutexes= TRUE; -#endif return (FALSE); -#ifdef HAVE_PSI_INTERFACE err: delete []key_mutex_info; delete []key_cond_info; @@ -121,39 +133,18 @@ err: cond_info= NULL; return (TRUE); -#endif -} +#else + mysql_mutex_init(NULL, &run_lock, MY_MUTEX_INIT_FAST); + mysql_mutex_init(NULL, &data_lock, MY_MUTEX_INIT_FAST); + mysql_mutex_init(NULL, &sleep_lock, MY_MUTEX_INIT_FAST); + + mysql_cond_init(NULL, &data_cond, NULL); + mysql_cond_init(NULL, &start_cond, NULL); + mysql_cond_init(NULL, &stop_cond, NULL); + mysql_cond_init(NULL, &sleep_cond, NULL); -Rpl_info_coordinator::~Rpl_info_coordinator() -{ - DBUG_ENTER("Rpl_info_coordinator::~Rpl_info_coordinator"); + registered_mutexes= TRUE; -#ifdef HAVE_PSI_INTERFACE - if (registered_mutexes) - { - mysql_mutex_destroy(&run_lock); - mysql_mutex_destroy(&data_lock); - mysql_mutex_destroy(&sleep_lock); - mysql_cond_destroy(&data_cond); - mysql_cond_destroy(&start_cond); - mysql_cond_destroy(&stop_cond); - mysql_cond_destroy(&sleep_cond); - - delete []key_mutex_info; - delete []key_cond_info; - delete []mutex_info; - delete []cond_info; - } + return (FALSE); #endif - - DBUG_VOID_RETURN; -} - -Rpl_info_worker::Rpl_info_worker(const char* type, const char* pfs) - : Rpl_info(type) -{ -} - -Rpl_info_worker::~Rpl_info_worker() -{ } === modified file 'sql/rpl_info.h' --- a/sql/rpl_info.h 2011-06-09 15:27:47 +0000 +++ b/sql/rpl_info.h 2011-06-13 00:07:26 +0000 @@ -46,6 +46,31 @@ public: volatile uint slave_running; volatile ulong slave_run_id; + /* + standard lock acquisition order to avoid deadlocks: + run_lock, data_lock, relay_log.LOCK_log, relay_log.LOCK_index + run_lock, sleep_lock + */ + mysql_mutex_t data_lock, run_lock, sleep_lock; + + /* + start_cond is broadcast when SQL thread is started + stop_cond - when stopped + data_cond - when data protected by data_lock changes + sleep_cond - when killed + */ + mysql_cond_t data_cond, start_cond, stop_cond, sleep_cond; + +#ifndef DBUG_OFF + int events_until_exit; +#endif + + /** + Identifies if mutexes and condition variables were successfuly + created and registered. + */ + bool registered_mutexes; + /** Defines the type of the repository that is used. @@ -129,48 +154,6 @@ protected: Rpl_info_handler *handler; uint rpl_info_type; - Rpl_info(const char *type); - -private: - virtual bool read_info(Rpl_info_handler *from)= 0; - virtual bool write_info(Rpl_info_handler *to)= 0; - - Rpl_info(const Rpl_info& info); - Rpl_info& operator=(const Rpl_info& info); -}; - -class Rpl_info_coordinator: public Rpl_info -{ -public: - /* - standard lock acquisition order to avoid deadlocks: - run_lock, data_lock, relay_log.LOCK_log, relay_log.LOCK_index - run_lock, sleep_lock - */ - mysql_mutex_t data_lock, run_lock, sleep_lock; - - /* - start_cond is broadcast when SQL thread is started - stop_cond - when stopped - data_cond - when data protected by data_lock changes - sleep_cond - when killed - */ - mysql_cond_t data_cond, start_cond, stop_cond, sleep_cond; - -#ifndef DBUG_OFF - int events_until_exit; -#endif - - Rpl_info_coordinator(const char* type, const char* pfs); - virtual ~Rpl_info_coordinator(); - - /** - Identifies if mutexes and condition variables were successfuly - created and registered. - */ - bool registered_mutexes; - -protected: /** Registers mutexes and condition variables in the performance schema. @@ -182,6 +165,8 @@ protected: */ bool register_mutexes(const char* description); + Rpl_info(const char *type, const char* description); + private: #ifdef HAVE_PSI_INTERFACE PSI_mutex_info *mutex_info; @@ -190,19 +175,10 @@ private: PSI_cond_key *key_cond_info; #endif - Rpl_info_coordinator& operator=(const Rpl_info_coordinator& info); - Rpl_info_coordinator(const Rpl_info_coordinator& info); -}; - -class Rpl_info_worker: public Rpl_info -{ -public: - - Rpl_info_worker(const char* type, const char* pfs); - virtual ~Rpl_info_worker(); + virtual bool read_info(Rpl_info_handler *from)= 0; + virtual bool write_info(Rpl_info_handler *to)= 0; -private: - Rpl_info_worker& operator=(const Rpl_info_worker& info); - Rpl_info_worker(const Rpl_info_worker& info); + Rpl_info(const Rpl_info& info); + Rpl_info& operator=(const Rpl_info& info); }; #endif /* RPL_INFO_H */ === modified file 'sql/rpl_mi.cc' --- a/sql/rpl_mi.cc 2011-06-09 15:27:47 +0000 +++ b/sql/rpl_mi.cc 2011-06-13 00:07:26 +0000 @@ -77,7 +77,7 @@ const char *info_mi_fields []= }; Master_info::Master_info() - :Rpl_info_coordinator("I/O", "IO-Thread"), + :Rpl_info("I/O", "IO-Thread"), ssl(0), ssl_verify_server_cert(0), port(MYSQL_PORT), connect_retry(DEFAULT_CONNECT_RETRY), clock_diff_with_master(0), heartbeat_period(0), === modified file 'sql/rpl_mi.h' --- a/sql/rpl_mi.h 2011-06-09 15:27:47 +0000 +++ b/sql/rpl_mi.h 2011-06-13 00:07:26 +0000 @@ -61,7 +61,7 @@ class Rpl_info_factory; *****************************************************************************/ -class Master_info : public Rpl_info_coordinator +class Master_info : public Rpl_info { friend class Rpl_info_factory; === modified file 'sql/rpl_rli.cc' --- a/sql/rpl_rli.cc 2011-06-14 10:01:21 +0000 +++ b/sql/rpl_rli.cc 2011-06-14 10:32:06 +0000 @@ -47,7 +47,7 @@ const char* info_rli_fields[]= "number_of_workers" }; -// ALFRANIO +#ifdef HAVE_PSI_INTERFACE static PSI_mutex_info *worker_mutexes= NULL; static PSI_cond_info *worker_conds= NULL; @@ -57,9 +57,10 @@ PSI_mutex_key key_mutex_mts_temp_tables_ PSI_cond_key *key_cond_slave_parallel_worker= NULL; PSI_cond_key key_cond_slave_parallel_pend_jobs; +#endif Relay_log_info::Relay_log_info(bool is_slave_recovery) - :Rpl_info_coordinator("SQL", "SQL-Thread"), checkpoint_thd(0), checkpoint_running(0), + :Rpl_info("SQL", "SQL-Thread"), checkpoint_thd(0), checkpoint_running(0), replicate_same_server_id(::replicate_same_server_id), cur_log_fd(-1), relay_log(&sync_relaylog_period), is_relay_log_recovery(is_slave_recovery), @@ -106,8 +107,6 @@ Relay_log_info::Relay_log_info(bool is_s */ void Relay_log_info::init_workers(ulong n) { - uint wi= 0; - /* Parallel slave parameters initialization is done regardless whether the feature is or going to be active or not. @@ -115,11 +114,15 @@ void Relay_log_info::init_workers(ulong trans_jobs= stmt_jobs= pending_jobs= wait_jobs= 0; mts_wqs_underrun_cnt= mts_wqs_overfill_cnt= 0; + my_init_dynamic_array(&workers, sizeof(Slave_worker *), slave_parallel_workers, 4); + my_atomic_rwlock_init(&slave_open_temp_tables_lock); + +#ifdef HAVE_PSI_INTERFACE key_mutex_slave_parallel_worker= new PSI_mutex_key[slave_parallel_workers]; key_cond_slave_parallel_worker= new PSI_cond_key[slave_parallel_workers]; worker_mutexes= new PSI_mutex_info[slave_parallel_workers]; worker_conds= new PSI_cond_info[slave_parallel_workers]; - for (wi= 0; wi < slave_parallel_workers; wi++) + for (uint wi= 0; wi < slave_parallel_workers; wi++) { worker_mutexes[wi].m_key= (PSI_mutex_key *) &(key_mutex_slave_parallel_worker[wi]); worker_mutexes[wi].m_name= "Slave_worker::jobs_lock"; @@ -137,11 +140,14 @@ void Relay_log_info::init_workers(ulong } mysql_mutex_init(key_mutex_slave_parallel_pend_jobs, &pending_jobs_lock, MY_MUTEX_INIT_FAST); - mysql_cond_init(key_cond_slave_parallel_pend_jobs, &pending_jobs_cond, NULL); mysql_mutex_init(key_mutex_mts_temp_tables_lock, &mts_temp_tables_lock, MY_MUTEX_INIT_FAST); - my_init_dynamic_array(&workers, sizeof(Slave_worker *), slave_parallel_workers, 4); - my_atomic_rwlock_init(&slave_open_temp_tables_lock); + mysql_cond_init(key_cond_slave_parallel_pend_jobs, &pending_jobs_cond, NULL); +#else + mysql_mutex_init(NULL, &pending_jobs_lock, MY_MUTEX_INIT_FAST); + mysql_mutex_init(NULL, &mts_temp_tables_lock, MY_MUTEX_INIT_FAST); + mysql_cond_init(NULL, &pending_jobs_cond, NULL); +#endif } /** === modified file 'sql/rpl_rli.h' --- a/sql/rpl_rli.h 2011-06-14 09:27:38 +0000 +++ b/sql/rpl_rli.h 2011-06-14 10:32:06 +0000 @@ -103,7 +103,7 @@ transactional or non-transactional is us To correctly recovery from failures, one should combine transactional system tables along with the --relay-log-recovery. *******************************************************************************/ -class Relay_log_info : public Rpl_info_coordinator +class Relay_log_info : public Rpl_info { friend class Rpl_info_factory; @@ -758,5 +758,11 @@ inline bool mts_is_worker(THD *thd) { return thd->system_thread == SYSTEM_THREAD_SLAVE_WORKER; } +#ifdef HAVE_PSI_INTERFACE +extern PSI_mutex_key *key_mutex_slave_parallel_worker; +extern PSI_mutex_key key_mutex_slave_parallel_pend_jobs; +extern PSI_cond_key *key_cond_slave_parallel_worker; +extern PSI_cond_key key_cond_slave_parallel_pend_jobs; +#endif #endif /* RPL_RLI_H */ === modified file 'sql/rpl_rli_pdb.cc' --- a/sql/rpl_rli_pdb.cc 2011-06-14 09:27:38 +0000 +++ b/sql/rpl_rli_pdb.cc 2011-06-14 10:32:06 +0000 @@ -250,8 +250,11 @@ bool Slave_worker::commit_positions(Log_ static HASH mapping_db_to_worker; static bool inited_hash_workers= FALSE; +#ifdef HAVE_PSI_INTERFACE PSI_mutex_key key_mutex_slave_worker_hash; PSI_cond_key key_cond_slave_worker_hash; +#endif + static mysql_mutex_t slave_worker_hash_lock; static mysql_cond_t slave_worker_hash_cond; @@ -296,9 +299,15 @@ bool init_hash_workers(ulong slave_paral { DBUG_ENTER("init_hash_workers"); +#ifdef HAVE_PSI_INTERFACE mysql_mutex_init(key_mutex_slave_worker_hash, &slave_worker_hash_lock, MY_MUTEX_INIT_FAST); mysql_cond_init(key_cond_slave_worker_hash, &slave_worker_hash_cond, NULL); +#else + mysql_mutex_init(NULL, &slave_worker_hash_lock, + MY_MUTEX_INIT_FAST); + mysql_cond_init(NULL, &slave_worker_hash_cond, NULL); +#endif inited_hash_workers= (my_hash_init(&mapping_db_to_worker, &my_charset_bin, === modified file 'sql/rpl_rli_pdb.h' --- a/sql/rpl_rli_pdb.h 2011-06-10 08:04:00 +0000 +++ b/sql/rpl_rli_pdb.h 2011-06-13 00:07:26 +0000 @@ -269,11 +269,6 @@ public: volatile bool checkpoint_notified; // Coord sets and resets, W can read ulong bitmap_shifted; // shift the last bitmap at receiving new CP bool wq_overrun_set; // W monitors its queue usage to incr/decr rli->mts_wqs_overrun - /* - We need to make this a dynamic field. /Alfranio - */ - char partitions[FN_REFLEN]; - // todo: remove char checkpoint_relay_log_name[FN_REFLEN]; ulonglong checkpoint_relay_log_pos; @@ -315,10 +310,4 @@ private: TABLE* mts_move_temp_table_to_entry(TABLE*, THD*, db_worker_hash_entry*); TABLE* mts_move_temp_tables_to_thd(THD*, TABLE*); - -extern PSI_mutex_key *key_mutex_slave_parallel_worker; -extern PSI_mutex_key key_mutex_slave_parallel_pend_jobs; - -extern PSI_cond_key *key_cond_slave_parallel_worker; -extern PSI_cond_key key_cond_slave_parallel_pend_jobs; #endif === modified file 'sql/rpl_slave.cc' --- a/sql/rpl_slave.cc 2011-06-14 10:01:21 +0000 +++ b/sql/rpl_slave.cc 2011-06-14 10:32:06 +0000 @@ -404,11 +404,6 @@ int init_info(Master_info* mi, bool igno thread is being started and the relay log info if either the SLAVE_SQL thread is being started or was not initialized as it is required by the SLAVE_IO thread. - - In a multi-master envinroment, we need to make sure that both master - info and relay log info are prepared to handle events from all - masters. In such case, we need to execute the code below for each - master and correctly set the key_info_idx. /Alfranio */ necessary_to_configure= mi->check_info(); if (!(ignore_if_no_info && necessary_to_configure)) @@ -440,11 +435,6 @@ void end_info(Master_info* mi) /* The previous implementation was not acquiring locks. We do the same here. However, this is quite strange. - - In a multi-master envinroment, we need to make sure that both master - info and relay log info are prepared to handle events from all - masters. In such case, we need to execute the code below for each - master and correctly set the key_info_idx. /Alfranio */ mi->end_info(); mi->rli->end_info(); @@ -472,12 +462,6 @@ int remove_info(Master_info* mi) mi->rli->clear_until_condition(); mi->rli->clear_sql_delay(); - /* - In a multi-master envinroment, we need to make sure that both master - info and relay log info are prepared to handle events from all - masters. In such case, we need to execute the code below for each - master and correctly set the key_info_idx. /Alfranio - */ mi->end_info(); mi->rli->end_info(); @@ -536,12 +520,6 @@ int flush_master_info(Master_info* mi, b mysql_mutex_lock(log_lock); - /* - In a multi-master envinroment, we need to make sure that both master - info and relay log info are prepared to handle events from all - masters. In such case, we need to execute the code below for each - master and correctly set the key_info_idx. /Alfranio - */ int err= (mi->rli->flush_current_log() || mi->flush_info(force)); @@ -718,11 +696,6 @@ int terminate_slave_threads(Master_info* /* Flushes the master info regardles of the sync_master_info option. - - In a multi-master envinroment, we need to make sure that both master - info and relay log info are prepared to handle events from all - masters. In such case, we need to execute the code below for each - master and correctly set the key_info_idx. /Alfranio */ if (mi->flush_info(TRUE)) DBUG_RETURN(ER_ERROR_DURING_FLUSH_LOGS); @@ -3819,7 +3792,6 @@ bool mts_recovery_groups(Relay_log_info Slave_job_group job_file; IO_CACHE log; File file; - MY_STAT s; LOG_POS_COORD cp= { @@ -3883,9 +3855,7 @@ bool mts_recovery_groups(Relay_log_info goto err; } - DBUG_ASSERT(my_stat(log_name, &s, MYF(0))); // TODO: Alfranio, why my_stat? my_b_seek(&log, (my_off_t) rli->get_group_relay_log_pos()); - bitmap_clear_all(groups); rli->mts_recovery_group_cnt= 0; for (uint it_job= 0; it_job < above_lwm_jobs.elements; it_job++) @@ -4125,9 +4095,14 @@ int slave_start_single_worker(Relay_log_ w->wq_overrun_set= FALSE; set_dynamic(&rli->workers, (uchar*) &w, i); +#ifdef HAVE_PSI_INTERFACE mysql_mutex_init(key_mutex_slave_parallel_worker[i], &w->jobs_lock, MY_MUTEX_INIT_FAST); mysql_cond_init(key_cond_slave_parallel_worker[i], &w->jobs_cond, NULL); +#else + mysql_mutex_init(NULL, &w->jobs_lock, MY_MUTEX_INIT_FAST); + mysql_cond_init(NULL, &w->jobs_cond, NULL); +#endif w->curr_group_seen_begin= FALSE; if (pthread_create(&th, &connection_attrib, handle_slave_worker, @@ -6993,13 +6968,10 @@ bool change_master(THD* thd, Master_info in-memory value at restart (thus causing errors, as the old relay log does not exist anymore). - In a multi-master envinroment, we need to make sure that both master - info and relay log info are prepared to handle events from all - masters. In such case, we need to execute the code below for each - master and correctly set the key_info_idx. /Alfranio + Notice that there are not writes to the rli table as slave is not + running. */ - - DBUG_ASSERT(!mi->rli->slave_running); // none writes in rli table + DBUG_ASSERT(!mi->rli->slave_running); ret= mi->rli->flush_info(TRUE); mysql_cond_broadcast(&mi->data_cond); mysql_mutex_unlock(&mi->rli->data_lock); --===============1995742173== 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/MERGE/mysql-\ # next-mr-wl5569/ # testament_sha1: c565c678b15bc976095a5eeb4efdb385f27396cd # timestamp: 2011-06-14 13:32:19 +0300 # source_branch: file:///home/andrei/MySQL/BZR/2a-23May/mysql-trunk/ # base_revision_id: andrei.elkin@stripped\ # xmhcom29wjqpvoym # # Begin bundle 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 --===============1995742173==--