From: Andrei Elkin Date: December 14 2010 2:46pm Subject: bzr commit into mysql-next-mr-wl5569 branch (andrei.elkin:3246) List-Archive: http://lists.mysql.com/commits/126780 Message-Id: <201012141446.oBEEka3Y007601@mysql1000.dsl.inet.fi> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0707103684==" --===============0707103684== 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/ based on revid:andrei.elkin@stripped 3246 Andrei Elkin 2010-12-14 [merge] merge from wl5569 repo added: mysql-test/suite/sys_vars/r/mts_checkpoint_period_basic.result mysql-test/suite/sys_vars/t/mts_checkpoint_period_basic.test modified: mysql-test/extra/rpl_tests/rpl_crash_safe.inc mysql-test/r/mysqld--help-notwin.result mysql-test/r/mysqld--help-win.result mysql-test/suite/rpl/r/rpl_mixed_crash_safe.result mysql-test/suite/rpl/r/rpl_row_crash_safe.result mysql-test/suite/rpl/r/rpl_stm_crash_safe.result mysql-test/suite/rpl/t/rpl_mixed_crash_safe-slave.opt mysql-test/suite/rpl/t/rpl_row_crash_safe-slave.opt mysql-test/suite/rpl/t/rpl_stm_crash_safe-slave.opt mysql-test/suite/sys_vars/r/all_vars.result scripts/mysql_install_db.pl.in scripts/mysql_install_db.sh sql/lock.cc sql/mysqld.cc sql/mysqld.h sql/rpl_info.cc sql/rpl_info.h sql/rpl_info_factory.cc sql/rpl_info_table.cc sql/rpl_info_table.h sql/rpl_info_table_access.cc sql/rpl_rli.cc sql/rpl_slave.cc sql/sql_parse.cc === modified file 'mysql-test/extra/rpl_tests/rpl_crash_safe.inc' --- a/mysql-test/extra/rpl_tests/rpl_crash_safe.inc 2010-10-27 11:50:22 +0000 +++ b/mysql-test/extra/rpl_tests/rpl_crash_safe.inc 2010-12-13 21:16:31 +0000 @@ -11,8 +11,6 @@ if (`SELECT HEX(@commands) = HEX('config { --sync_slave_with_master SHOW CREATE TABLE mysql.slave_relay_log_info; - ALTER TABLE mysql.slave_relay_log_info ENGINE= Innodb; - SHOW CREATE TABLE mysql.slave_relay_log_info; connection master; --source extra/rpl_tests/rpl_mixing_engines.inc === modified file 'mysql-test/r/mysqld--help-notwin.result' --- a/mysql-test/r/mysqld--help-notwin.result 2010-12-14 08:57:16 +0000 +++ b/mysql-test/r/mysqld--help-notwin.result 2010-12-14 14:46:20 +0000 @@ -271,6 +271,8 @@ The following options may be given as th If set to 1 table names are stored in lowercase on disk and table names will be case-insensitive. Should be set to 2 if you are using a case insensitive file system + --master-info-engine=name + The storage engine for the master info repository --master-info-file=name The location and name of the file that remembers the master and where the I/O replication thread is in the @@ -538,6 +540,8 @@ The following options may be given as th --relay-log=name The location and name to use for relay logs --relay-log-index=name File that holds the names for relay log files. + --relay-log-info-engine=name + The storage engine for the relay info repository --relay-log-info-file=name The location and name of the file that remembers where the SQL replication thread is in the relay logs @@ -772,6 +776,8 @@ The following options may be given as th -V, --version Output version information and exit. --wait-timeout=# The number of seconds the server waits for activity on a connection before closing it + --worker-info-engine=name + The storage engine for the worker info repository --worker-info-repository=name Defines the type of the repository for the worker information. @@ -863,6 +869,7 @@ log-warnings 1 long-query-time 10 low-priority-updates FALSE lower-case-table-names 1 +master-info-engine (No default value) master-info-file master.info master-info-repository FILE master-retry-count 86400 @@ -956,6 +963,7 @@ read-only FALSE read-rnd-buffer-size 262144 relay-log (No default value) relay-log-index (No default value) +relay-log-info-engine (No default value) relay-log-info-file relay-log.info relay-log-info-repository FILE relay-log-purge TRUE @@ -1011,6 +1019,7 @@ transaction-prealloc-size 4096 updatable-views-with-limit YES verbose TRUE wait-timeout 28800 +worker-info-engine (No default value) worker-info-repository FILE To see what values a running MySQL server is using, type === modified file 'mysql-test/r/mysqld--help-win.result' --- a/mysql-test/r/mysqld--help-win.result 2010-12-13 14:52:50 +0000 +++ b/mysql-test/r/mysqld--help-win.result 2010-12-14 12:51:30 +0000 @@ -270,6 +270,8 @@ The following options may be given as th If set to 1 table names are stored in lowercase on disk and table names will be case-insensitive. Should be set to 2 if you are using a case insensitive file system + --master-info-engine=name + The storage engine for the master info repository --master-info-file=name The location and name of the file that remembers the master and where the I/O replication thread is in the @@ -529,6 +531,8 @@ The following options may be given as th --relay-log=name The location and name to use for relay logs --relay-log-index=name File that holds the names for relay log files. + --relay-log-info-engine=name + The storage engine for the relay info repository --relay-log-info-file=name The location and name of the file that remembers where the SQL replication thread is in the relay logs @@ -776,6 +780,8 @@ The following options may be given as th -V, --version Output version information and exit. --wait-timeout=# The number of seconds the server waits for activity on a connection before closing it + --worker-info-engine=name + The storage engine for the worker info repository --worker-info-repository=name Defines the type of the repository for the worker information. @@ -866,6 +872,7 @@ log-warnings 1 long-query-time 10 low-priority-updates FALSE lower-case-table-names 1 +master-info-engine (No default value) master-info-file master.info master-info-repository FILE master-retry-count 86400 @@ -957,6 +964,7 @@ read-only FALSE read-rnd-buffer-size 262144 relay-log (No default value) relay-log-index (No default value) +relay-log-info-engine (No default value) relay-log-info-file relay-log.info relay-log-info-repository FILE relay-log-purge TRUE @@ -1017,6 +1025,7 @@ transaction-prealloc-size 4096 updatable-views-with-limit YES verbose TRUE wait-timeout 28800 +worker-info-engine (No default value) worker-info-repository FILE To see what values a running MySQL server is using, type === modified file 'mysql-test/suite/rpl/r/rpl_mixed_crash_safe.result' --- a/mysql-test/suite/rpl/r/rpl_mixed_crash_safe.result 2010-11-16 12:48:25 +0000 +++ b/mysql-test/suite/rpl/r/rpl_mixed_crash_safe.result 2010-12-13 21:16:31 +0000 @@ -25,19 +25,6 @@ slave_relay_log_info CREATE TABLE `slave `Master_log_pos` bigint(20) unsigned NOT NULL, `Sql_delay` int(11) NOT NULL, PRIMARY KEY (`Master_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Relay Log Information' -ALTER TABLE mysql.slave_relay_log_info ENGINE= Innodb; -SHOW CREATE TABLE mysql.slave_relay_log_info; -Table Create Table -slave_relay_log_info CREATE TABLE `slave_relay_log_info` ( - `Master_id` int(10) unsigned NOT NULL, - `Number_of_lines` int(10) unsigned NOT NULL, - `Relay_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `Relay_log_pos` bigint(20) unsigned NOT NULL, - `Master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `Master_log_pos` bigint(20) unsigned NOT NULL, - `Sql_delay` int(11) NOT NULL, - PRIMARY KEY (`Master_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Relay Log Information' SET SQL_LOG_BIN=0; CREATE TABLE nt_1 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = MyISAM; === modified file 'mysql-test/suite/rpl/r/rpl_row_crash_safe.result' --- a/mysql-test/suite/rpl/r/rpl_row_crash_safe.result 2010-11-16 12:48:25 +0000 +++ b/mysql-test/suite/rpl/r/rpl_row_crash_safe.result 2010-12-13 21:16:31 +0000 @@ -25,19 +25,6 @@ slave_relay_log_info CREATE TABLE `slave `Master_log_pos` bigint(20) unsigned NOT NULL, `Sql_delay` int(11) NOT NULL, PRIMARY KEY (`Master_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Relay Log Information' -ALTER TABLE mysql.slave_relay_log_info ENGINE= Innodb; -SHOW CREATE TABLE mysql.slave_relay_log_info; -Table Create Table -slave_relay_log_info CREATE TABLE `slave_relay_log_info` ( - `Master_id` int(10) unsigned NOT NULL, - `Number_of_lines` int(10) unsigned NOT NULL, - `Relay_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `Relay_log_pos` bigint(20) unsigned NOT NULL, - `Master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `Master_log_pos` bigint(20) unsigned NOT NULL, - `Sql_delay` int(11) NOT NULL, - PRIMARY KEY (`Master_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Relay Log Information' SET SQL_LOG_BIN=0; CREATE TABLE nt_1 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = MyISAM; === modified file 'mysql-test/suite/rpl/r/rpl_stm_crash_safe.result' --- a/mysql-test/suite/rpl/r/rpl_stm_crash_safe.result 2010-11-16 12:48:25 +0000 +++ b/mysql-test/suite/rpl/r/rpl_stm_crash_safe.result 2010-12-13 21:16:31 +0000 @@ -25,19 +25,6 @@ slave_relay_log_info CREATE TABLE `slave `Master_log_pos` bigint(20) unsigned NOT NULL, `Sql_delay` int(11) NOT NULL, PRIMARY KEY (`Master_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Relay Log Information' -ALTER TABLE mysql.slave_relay_log_info ENGINE= Innodb; -SHOW CREATE TABLE mysql.slave_relay_log_info; -Table Create Table -slave_relay_log_info CREATE TABLE `slave_relay_log_info` ( - `Master_id` int(10) unsigned NOT NULL, - `Number_of_lines` int(10) unsigned NOT NULL, - `Relay_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `Relay_log_pos` bigint(20) unsigned NOT NULL, - `Master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `Master_log_pos` bigint(20) unsigned NOT NULL, - `Sql_delay` int(11) NOT NULL, - PRIMARY KEY (`Master_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Relay Log Information' SET SQL_LOG_BIN=0; CREATE TABLE nt_1 (trans_id INT, stmt_id INT, info VARCHAR(64), PRIMARY KEY(trans_id, stmt_id)) ENGINE = MyISAM; === modified file 'mysql-test/suite/rpl/t/rpl_mixed_crash_safe-slave.opt' --- a/mysql-test/suite/rpl/t/rpl_mixed_crash_safe-slave.opt 2010-10-27 11:50:22 +0000 +++ b/mysql-test/suite/rpl/t/rpl_mixed_crash_safe-slave.opt 2010-12-13 21:16:31 +0000 @@ -1 +1 @@ ---skip-core-file --skip-slave-start --relay-log-info-repository=TABLE --relay-log-recovery=1 +--skip-core-file --skip-slave-start --relay-log-info-repository=TABLE --relay-log-info-engine=innodb --relay-log-recovery=1 === modified file 'mysql-test/suite/rpl/t/rpl_row_crash_safe-slave.opt' --- a/mysql-test/suite/rpl/t/rpl_row_crash_safe-slave.opt 2010-10-27 11:50:22 +0000 +++ b/mysql-test/suite/rpl/t/rpl_row_crash_safe-slave.opt 2010-12-13 21:16:31 +0000 @@ -1 +1 @@ ---skip-core-file --skip-slave-start --relay-log-info-repository=TABLE --relay-log-recovery=1 +--skip-core-file --skip-slave-start --relay-log-info-repository=TABLE --relay-log-info-engine=innodb --relay-log-recovery=1 === modified file 'mysql-test/suite/rpl/t/rpl_stm_crash_safe-slave.opt' --- a/mysql-test/suite/rpl/t/rpl_stm_crash_safe-slave.opt 2010-10-27 11:50:22 +0000 +++ b/mysql-test/suite/rpl/t/rpl_stm_crash_safe-slave.opt 2010-12-13 21:16:31 +0000 @@ -1 +1 @@ ---skip-core-file --skip-slave-start --relay-log-info-repository=TABLE --relay-log-recovery=1 +--skip-core-file --skip-slave-start --relay-log-info-repository=TABLE --relay-log-info-engine=innodb --relay-log-recovery=1 === modified file 'mysql-test/suite/sys_vars/r/all_vars.result' --- a/mysql-test/suite/sys_vars/r/all_vars.result 2010-12-13 14:52:50 +0000 +++ b/mysql-test/suite/sys_vars/r/all_vars.result 2010-12-13 21:16:31 +0000 @@ -18,7 +18,6 @@ OPT_MTS_WORKER_UNDERRUN_LEVEL SLAVE_RUN_QUERY_IN_PARALLEL INNODB_STATS_PERSISTENT_SAMPLE_PAGES RELAY_LOG_BASENAME -MTS_CHECKPOINT_PERIOD LOG_BIN_BASENAME INNODB_ANALYZE_IS_PERSISTENT INNODB_RESET_MONITOR_COUNTER @@ -38,7 +37,6 @@ OPT_MTS_WORKER_UNDERRUN_LEVEL SLAVE_RUN_QUERY_IN_PARALLEL INNODB_STATS_PERSISTENT_SAMPLE_PAGES RELAY_LOG_BASENAME -MTS_CHECKPOINT_PERIOD LOG_BIN_BASENAME INNODB_ANALYZE_IS_PERSISTENT INNODB_RESET_MONITOR_COUNTER === added file 'mysql-test/suite/sys_vars/r/mts_checkpoint_period_basic.result' --- a/mysql-test/suite/sys_vars/r/mts_checkpoint_period_basic.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/sys_vars/r/mts_checkpoint_period_basic.result 2010-12-14 12:51:30 +0000 @@ -0,0 +1,47 @@ +SET @start_global_value = @@global.mts_checkpoint_period; +SELECT @start_global_value; +@start_global_value +300 +select @@global.mts_checkpoint_period; +@@global.mts_checkpoint_period +300 +select @@session.mts_checkpoint_period; +ERROR HY000: Variable 'mts_checkpoint_period' is a GLOBAL variable +show global variables like 'mts_checkpoint_period'; +Variable_name Value +mts_checkpoint_period 300 +show session variables like 'mts_checkpoint_period'; +Variable_name Value +mts_checkpoint_period 300 +select * from information_schema.global_variables where variable_name='mts_checkpoint_period'; +VARIABLE_NAME VARIABLE_VALUE +MTS_CHECKPOINT_PERIOD 300 +select * from information_schema.session_variables where variable_name='mts_checkpoint_period'; +VARIABLE_NAME VARIABLE_VALUE +MTS_CHECKPOINT_PERIOD 300 +set global mts_checkpoint_period=1; +select @@global.mts_checkpoint_period; +@@global.mts_checkpoint_period +1 +set session mts_checkpoint_period=1; +ERROR HY000: Variable 'mts_checkpoint_period' is a GLOBAL variable and should be set with SET GLOBAL +set global mts_checkpoint_period=1.1; +ERROR 42000: Incorrect argument type to variable 'mts_checkpoint_period' +set global mts_checkpoint_period=1e1; +ERROR 42000: Incorrect argument type to variable 'mts_checkpoint_period' +set global mts_checkpoint_period="foo"; +ERROR 42000: Incorrect argument type to variable 'mts_checkpoint_period' +set global mts_checkpoint_period=0; +select @@global.mts_checkpoint_period; +@@global.mts_checkpoint_period +0 +set global mts_checkpoint_period=cast(-1 as unsigned int); +Warnings: +Warning 1292 Truncated incorrect mts_checkpoint_period value: '18446744073709551615' +select @@global.mts_checkpoint_period; +@@global.mts_checkpoint_period +4294967295 +SET @@global.mts_checkpoint_period = @start_global_value; +SELECT @@global.mts_checkpoint_period; +@@global.mts_checkpoint_period +300 === added file 'mysql-test/suite/sys_vars/t/mts_checkpoint_period_basic.test' --- a/mysql-test/suite/sys_vars/t/mts_checkpoint_period_basic.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/sys_vars/t/mts_checkpoint_period_basic.test 2010-12-13 21:16:31 +0000 @@ -0,0 +1,44 @@ +--source include/not_embedded.inc + +SET @start_global_value = @@global.mts_checkpoint_period; +SELECT @start_global_value; + +# +# exists as global only +# +select @@global.mts_checkpoint_period; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +select @@session.mts_checkpoint_period; +show global variables like 'mts_checkpoint_period'; +show session variables like 'mts_checkpoint_period'; +select * from information_schema.global_variables where variable_name='mts_checkpoint_period'; +select * from information_schema.session_variables where variable_name='mts_checkpoint_period'; + +# +# show that it's writable +# +set global mts_checkpoint_period=1; +select @@global.mts_checkpoint_period; +--error ER_GLOBAL_VARIABLE +set session mts_checkpoint_period=1; + +# +# incorrect types +# +--error ER_WRONG_TYPE_FOR_VAR +set global mts_checkpoint_period=1.1; +--error ER_WRONG_TYPE_FOR_VAR +set global mts_checkpoint_period=1e1; +--error ER_WRONG_TYPE_FOR_VAR +set global mts_checkpoint_period="foo"; + +# +# min/max values +# +set global mts_checkpoint_period=0; +select @@global.mts_checkpoint_period; +set global mts_checkpoint_period=cast(-1 as unsigned int); +select @@global.mts_checkpoint_period; + +SET @@global.mts_checkpoint_period = @start_global_value; +SELECT @@global.mts_checkpoint_period; === modified file 'scripts/mysql_install_db.pl.in' --- a/scripts/mysql_install_db.pl.in 2010-10-25 10:39:01 +0000 +++ b/scripts/mysql_install_db.pl.in 2010-12-13 21:16:31 +0000 @@ -79,11 +79,6 @@ Usage: $0 [OPTIONS] user. You must be root to use this option. By default mysqld runs using your current login name and files and directories that it creates will be owned by you. - --rpl-engine=engine The storage engine used for the mysql.slave_master_info and - mysql.slave_relay_log_info tables. By default, both tables are - created using the MyISAM storage engine. However, any storage - engine available to the server may be used. If a crash-safe - slave is required, the storage engine must be transactional. All other options are passed to the mysqld program @@ -122,7 +117,6 @@ sub parse_arguments "builddir=s", # FIXME not documented "srcdir=s", "ldata|datadir=s", - "rpl-engine=s", # Note that the user will be passed to mysqld so that it runs # as 'user' (crucial e.g. if log-bin=/some_other_path/ @@ -459,29 +453,6 @@ if ( open(PIPE, "| $mysqld_install_cmd_l report_verbose($opt,"OK"); # ---------------------------------------------------------------------- - # Pipe ALTER TABLE mysql.slave_master_info|slave_relay_log_info to "mysqld --bootstrap" - # ---------------------------------------------------------------------- - - if ($opt->{'rpl-engine'}) - { - report_verbose_wait($opt,"Setting engine for mysql.slave_master_info mysql.slave_relay_log_info tables..."); - if ( open(PIPE, "| $mysqld_install_cmd_line") ) - { - print PIPE "use mysql;\n"; - print PIPE "ALTER TABLE mysql.slave_master_info ENGINE= " . $opt->{'rpl-engine'} . ";\n"; - print PIPE "ALTER TABLE mysql.slave_relay_log_info ENGINE= " . $opt->{'$rpl-engine'} . ";\n"; - close PIPE; - - report_verbose($opt,"OK"); - } - else - { - warning($opt,"CRASH-SAFE SLAVE IS NOT COMPLETELY CONFIGURED!", - "The \"CRASH-SAFE SLAVE\" might not work properly."); - } - } - - # ---------------------------------------------------------------------- # Pipe fill_help_tables.sql to "mysqld --bootstrap" # ---------------------------------------------------------------------- === modified file 'scripts/mysql_install_db.sh' --- a/scripts/mysql_install_db.sh 2010-10-25 10:39:01 +0000 +++ b/scripts/mysql_install_db.sh 2010-12-13 21:16:31 +0000 @@ -63,11 +63,6 @@ Usage: $0 [OPTIONS] user. You must be root to use this option. By default mysqld runs using your current login name and files and directories that it creates will be owned by you. - --rpl-engine=engine The storage engine used for the mysql.slave_master_info and - mysql.slave_relay_log_info tables. By default, both tables are - created using the MyISAM storage engine. However, any storage - engine available to the server may be used. If a crash-safe - slave is required, the storage engine must be transactional. All other options are passed to the mysqld program @@ -120,8 +115,6 @@ parse_arguments() --no-defaults|--defaults-file=*|--defaults-extra-file=*) defaults="$arg" ;; - --rpl-engine=*) rpl_engine=`parse_arg "$arg"` ;; - --cross-bootstrap|--windows) # Used when building the MySQL system tables on a different host than # the target. The platform-independent files that are created in @@ -434,19 +427,6 @@ else exit 1 fi -if test -n "$rpl_engine" -then - s_echo "Setting engine for mysql.slave_master_info mysql.slave_relay_log_info tables..." - if { echo "use mysql;"; echo "ALTER TABLE mysql.slave_master_info ENGINE= $rpl_engine;"; echo "ALTER TABLE mysql.slave_relay_log_info ENGINE= $rpl_engine;"; } | $mysqld_install_cmd_line > /dev/null - then - s_echo "OK" - else - echo - echo "WARNING: CRASH-SAFE SLAVE IS NOT COMPLETELY CONFIGURED!" - echo "The \"CRASH-SAFE SLAVE\" might not work properly." - fi -fi - s_echo "Filling help tables..." if { echo "use mysql;"; cat $fill_help_tables; } | $mysqld_install_cmd_line > /dev/null then === modified file 'sql/lock.cc' --- a/sql/lock.cc 2010-11-23 22:37:59 +0000 +++ b/sql/lock.cc 2010-12-13 21:16:31 +0000 @@ -154,8 +154,10 @@ lock_tables_check(THD *thd, TABLE **tabl or hold any type of lock in a session, since this would be a DOS attack. */ - if (t->reginfo.lock_type >= TL_READ_NO_INSERT || - thd->lex->sql_command == SQLCOM_LOCK_TABLES) + if ((t->reginfo.lock_type >= TL_READ_NO_INSERT || + thd->lex->sql_command == SQLCOM_LOCK_TABLES) && + thd->lex->sql_command != SQLCOM_ALTER_TABLE && + !thd->slave_thread) { my_error(ER_CANT_LOCK_RPL_INFO_TABLE, MYF(0)); DBUG_RETURN(1); === modified file 'sql/mysqld.cc' --- a/sql/mysqld.cc 2010-12-14 08:57:16 +0000 +++ b/sql/mysqld.cc 2010-12-14 14:46:20 +0000 @@ -339,6 +339,9 @@ static char *lc_time_names_name; char *my_bind_addr_str; static char *default_collation_name; char *default_storage_engine; +char *master_info_engine= 0; +char *relay_log_info_engine= 0; +char *worker_info_engine= 0; static char compiled_default_collation_name[]= MYSQL_DEFAULT_COLLATION_NAME; static I_List thread_cache; static bool binlog_format_used= false; @@ -5965,6 +5968,15 @@ struct my_option my_long_options[]= {"default-storage-engine", 0, "The default storage engine for new tables", &default_storage_engine, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, + {"master-info-engine", 0, "The storage engine for the master info repository", + &master_info_engine, 0, 0, GET_STR, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0 }, + {"relay-log-info-engine", 0, "The storage engine for the relay info repository", + &relay_log_info_engine, 0, 0, GET_STR, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0 }, + {"worker-info-engine", 0, "The storage engine for the worker info repository", + &worker_info_engine, 0, 0, GET_STR, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0 }, {"default-time-zone", 0, "Set the default time zone.", &default_tz_name, &default_tz_name, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, === modified file 'sql/mysqld.h' --- a/sql/mysqld.h 2010-12-14 08:57:16 +0000 +++ b/sql/mysqld.h 2010-12-14 14:46:20 +0000 @@ -122,6 +122,9 @@ extern my_bool opt_enable_shared_memory; extern char *default_tz_name; extern Time_zone *default_tz; extern char *default_storage_engine; +extern char *master_info_engine; +extern char *relay_log_info_engine; +extern char *worker_info_engine; extern bool opt_endinfo, using_udf_functions; extern my_bool locked_in_memory; extern bool opt_using_transactions; === modified file 'sql/rpl_info.cc' --- a/sql/rpl_info.cc 2010-12-13 15:57:01 +0000 +++ b/sql/rpl_info.cc 2010-12-14 12:51:30 +0000 @@ -42,18 +42,14 @@ void Rpl_info::set_rpl_info_handler(Rpl_ } Rpl_info_coordinator::Rpl_info_coordinator(const char* type, const char* psf) - : Rpl_info(type) + : Rpl_info(type), mutex_info(0), cond_info(0), key_mutex_info(0), + key_cond_info(0) { register_mutexes(psf); } bool Rpl_info_coordinator::register_mutexes(const char* description) { - PSI_mutex_info *mutex_info= NULL; - PSI_cond_info *cond_info= NULL; - PSI_mutex_key *key_mutex_info= NULL; - PSI_cond_key *key_cond_info= NULL; - const int NUMBER_MUTEX_INFO= 2; const int RUN_LOCK_IDX= 0; const int DATA_LOCK_IDX= 1; @@ -118,8 +114,8 @@ err: if (mutex_info) delete []mutex_info; - if (mutex_info) - delete []mutex_info; + if (cond_info) + delete []cond_info; return (TRUE); } @@ -135,6 +131,18 @@ Rpl_info_coordinator::~Rpl_info_coordina mysql_cond_destroy(&data_cond); mysql_cond_destroy(&start_cond); mysql_cond_destroy(&stop_cond); + + if (key_mutex_info) + delete []key_mutex_info; + + if (key_cond_info) + delete []key_cond_info; + + if (mutex_info) + delete []mutex_info; + + if (cond_info) + delete []cond_info; } DBUG_VOID_RETURN; === modified file 'sql/rpl_info.h' --- a/sql/rpl_info.h 2010-12-08 01:30:32 +0000 +++ b/sql/rpl_info.h 2010-12-14 12:51:30 +0000 @@ -133,6 +133,11 @@ protected: bool register_mutexes(const char* description); private: + PSI_mutex_info *mutex_info; + PSI_cond_info *cond_info; + PSI_mutex_key *key_mutex_info; + PSI_cond_key *key_cond_info; + Rpl_info_coordinator& operator=(const Rpl_info_coordinator& info); Rpl_info_coordinator(const Rpl_info_coordinator& info); }; === modified file 'sql/rpl_info_factory.cc' --- a/sql/rpl_info_factory.cc 2010-12-09 16:17:32 +0000 +++ b/sql/rpl_info_factory.cc 2010-12-13 21:16:31 +0000 @@ -18,14 +18,6 @@ #include "rpl_slave.h" #include "rpl_info_factory.h" -/* - We need to replace these definitions by an option that states the - engine one wants to use in the master info repository. -*/ -#define master_info_engine NULL -#define relay_log_info_engine NULL -#define worker_info_engine NULL - #define NUMBER_OF_FIELDS_TO_IDENTIFY_COORDINATOR 1 #define NUMBER_OF_FIELDS_TO_IDENTIFY_WORKER 2 === modified file 'sql/rpl_info_table.cc' --- a/sql/rpl_info_table.cc 2010-12-08 00:33:48 +0000 +++ b/sql/rpl_info_table.cc 2010-12-13 21:16:31 +0000 @@ -15,12 +15,12 @@ #include "rpl_info_table.h" #include "rpl_utility.h" -#include "sql_parse.h" +#include "sql_prepare.h" Rpl_info_table::Rpl_info_table(uint nparam, const char* param_schema, const char *param_table) -:Rpl_info_handler(nparam) +:Rpl_info_handler(nparam), is_transactional(FALSE) { str_schema.str= str_table.str= NULL; str_schema.length= str_table.length= 0; @@ -444,16 +444,37 @@ char* Rpl_info_table::do_get_description bool Rpl_info_table::do_is_transactional() { + return is_transactional; +} + +bool Rpl_info_table::change_engine(const char *engine) +{ + bool error= TRUE; ulong saved_mode; TABLE *table= NULL; Open_tables_backup backup; - bool is_trans= FALSE; - - DBUG_ENTER("Rpl_info_table::do_is_transactional"); + String query; + LEX_STRING lex; + + DBUG_ENTER("Rpl_info_table::do_check_info"); THD *thd= access->create_thd(); - + Ed_connection conn(thd); saved_mode= thd->variables.sql_mode; + tmp_disable_binlog(thd); + + if (query.append(STRING_WITH_LEN("ALTER TABLE ")) || + query.append(description) || + query.append(STRING_WITH_LEN(" ENGINE= ")) || + query.append(engine) || + query.append(";")) + goto err; + + lex.str= query.c_ptr_safe(); + lex.length= query.length(); + + if ((error= conn.execute_direct(lex))) + goto err; /* Opens and locks the rpl_info table before accessing it. @@ -461,30 +482,11 @@ bool Rpl_info_table::do_is_transactional if (!access->open_table(thd, str_schema, str_table, get_number_info(), TL_READ, &table, &backup)) - is_trans= table->file->has_transactions(); + is_transactional= table->file->has_transactions(); access->close_table(thd, table, &backup, 0); - thd->variables.sql_mode= saved_mode; - access->drop_thd(thd); - DBUG_RETURN(is_trans); -} - -bool Rpl_info_table::change_engine(const char *engine) -{ - bool error= TRUE; - ulong saved_mode; - - DBUG_ENTER("Rpl_info_table::do_change_engine"); - - THD *thd= access->create_thd(); - - saved_mode= thd->variables.sql_mode; - tmp_disable_binlog(thd); - - /* TODO: Change the engine using internal functions */ - - error= FALSE; +err: reenable_binlog(thd); thd->variables.sql_mode= saved_mode; access->drop_thd(thd); === modified file 'sql/rpl_info_table.h' --- a/sql/rpl_info_table.h 2010-12-07 03:05:41 +0000 +++ b/sql/rpl_info_table.h 2010-12-13 21:16:31 +0000 @@ -60,6 +60,12 @@ private: */ Rpl_info_table_access *access; + /* + Identifies if a table is transactional or non-transactional. + This is used to provide a crash-safe behaviour. + */ + bool is_transactional; + int do_init_info(const ulong *uidx, const uint nidx); int do_check_info(const ulong *uidx, const uint nidx); void do_end_info(const ulong *uidx, const uint nidx); === modified file 'sql/rpl_info_table_access.cc' --- a/sql/rpl_info_table_access.cc 2010-11-11 11:53:01 +0000 +++ b/sql/rpl_info_table_access.cc 2010-12-13 21:16:31 +0000 @@ -307,6 +307,7 @@ THD *Rpl_info_table_access::create_thd() thd= new THD; thd->thread_stack= (char*) &thd; thd->store_globals(); + thd->security_ctx->skip_grants(); } else thd= current_thd; === modified file 'sql/rpl_rli.cc' --- a/sql/rpl_rli.cc 2010-12-13 16:53:32 +0000 +++ b/sql/rpl_rli.cc 2010-12-14 12:51:30 +0000 @@ -64,7 +64,7 @@ Relay_log_info::Relay_log_info(bool is_s cur_log_old_open_count(0), group_relay_log_pos(0), event_relay_log_pos(0), group_master_log_pos(0), log_space_total(0), ignore_log_space_limit(0), last_master_timestamp(0), slave_skip_counter(0), - abort_pos_wait(0), until_condition(UNTIL_NONE), + abort_pos_wait(0), slave_exec_mode(0), until_condition(UNTIL_NONE), until_log_pos(0), retried_trans(0), tables_to_lock(0), tables_to_lock_count(0), rows_query_ev(NULL), last_event_start_time(0), === modified file 'sql/rpl_slave.cc' --- a/sql/rpl_slave.cc 2010-12-14 08:57:16 +0000 +++ b/sql/rpl_slave.cc 2010-12-14 14:46:20 +0000 @@ -2794,8 +2794,6 @@ int apply_event_and_update_pos(Log_event if (!ev->when) ev->when= my_time(0); ev->thd = thd; // because up to this point, ev->thd == 0 - if (!rli->is_in_group() && rli->slave_exec_mode != slave_exec_mode_options) - rli->slave_exec_mode= slave_exec_mode_options; int reason= ev->shall_skip(rli); if (reason == Log_event::EVENT_SKIP_COUNT) @@ -3898,70 +3896,15 @@ bool mts_recovery_routine(Relay_log_info "%s from pos %lu, maxsize %lu.", log_name, (ulong) job.group_relay_log_pos, (ulong) s.st_size); - bool found= FALSE; - int res= 0; while ((ev= Log_event::read_log_event(&log, 0, &fdle, opt_master_verify_checksum))) { DBUG_ASSERT(ev->is_valid()); - String buffer; - const char *db= ev->get_db(); - - if (db != NULL) - { - buffer.set_int(strlen(db), FALSE, &my_charset_bin); - buffer.append(db); - found= job.db_ids->search_id(buffer.c_ptr_safe()); - } - - sql_print_information("Recovery relay log info. Event %s on db %s " - "sets cursor to pos %lu and was handled by worker(%d).", - ev->get_type_str(), db, (ulong) my_b_tell(&log), - found); - if (!found) - { - delete ev; - ev= NULL; - break; - } - - res= ev->apply_event(rli); delete ev; ev= NULL; - - if (res) - goto end; - } - if (!found) - { - sql_print_information("Before updating RLI " - "group_relay_log_name %s, " - "group_relay_log_pos %lu, " - "group_master_log_name %s, " - "group_master_lo_pos %lu.", - rli->get_group_relay_log_name(), - (ulong) rli->get_group_relay_log_pos(), - rli->get_group_master_log_name(), - (ulong) rli->get_group_master_log_pos()); - - rli->set_group_relay_log_pos(job.group_relay_log_pos); - rli->set_group_relay_log_name(job.group_relay_log_name); - rli->set_group_master_log_pos(job.group_master_log_pos); - rli->set_group_master_log_name(job.group_master_log_name); - - sql_print_information("After updating RLI " - "group_relay_log_name %s, " - "group_relay_log_pos %lu, " - "group_master_log_name %s, " - "group_master_lo_pos %lu.", - rli->get_group_relay_log_name(), - (ulong) rli->get_group_relay_log_pos(), - rli->get_group_master_log_name(), - (ulong) rli->get_group_master_log_pos()); } } - error= FALSE; end: if (desc) @@ -4395,8 +4338,8 @@ pthread_handler_t handle_slave_sql(void TODO: Alfranio, to settle invocation point. It's moved to possibly please an assert in the following block */ - if (rli->is_parallel_exec() && mts_recovery_routine(rli)) - goto err; + //if (rli->is_parallel_exec() && mts_recovery_routine(rli)) + // goto err; #ifndef DBUG_OFF { === modified file 'sql/sql_parse.cc' --- a/sql/sql_parse.cc 2010-12-08 00:33:48 +0000 +++ b/sql/sql_parse.cc 2010-12-13 21:16:31 +0000 @@ -298,8 +298,7 @@ void init_update_queries(void) CF_CAN_GENERATE_ROW_EVENTS; sql_command_flags[SQLCOM_CREATE_INDEX]= CF_CHANGES_DATA | CF_AUTO_COMMIT_TRANS; sql_command_flags[SQLCOM_ALTER_TABLE]= CF_CHANGES_DATA | CF_WRITE_LOGS_COMMAND | - CF_AUTO_COMMIT_TRANS | - CF_WRITE_RPL_INFO_COMMAND; + CF_AUTO_COMMIT_TRANS; sql_command_flags[SQLCOM_TRUNCATE]= CF_CHANGES_DATA | CF_WRITE_LOGS_COMMAND | CF_AUTO_COMMIT_TRANS; sql_command_flags[SQLCOM_DROP_TABLE]= CF_CHANGES_DATA | CF_AUTO_COMMIT_TRANS; --===============0707103684== 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/ # testament_sha1: 977d491597d276b7e9e95543f5fd6abf87551423 # timestamp: 2010-12-14 16:46:36 +0200 # base_revision_id: andrei.elkin@stripped\ # gsajrf9l0lmkd5xk # # Begin bundle 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 --===============0707103684==--