From: Bjorn Munch Date: January 11 2011 1:27pm Subject: bzr commit into mysql-5.5-mtr branch (bjorn.munch:3137) Bug#58841 List-Archive: http://lists.mysql.com/commits/128421 X-Bug: 58841 Message-Id: <201101111327.p0BDRtje012461@khepri15.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0296379709==" --===============0296379709== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/bm136801/my/genplug-55/ based on revid:bjorn.munch@stripped 3137 Bjorn Munch 2011-01-11 Bug #58841 Generalise handling of plugins in MTR mysql-test-run.pl script Put descriptions of plugins into a separate file read by MTR MTR itself has generalised code to read this and set env. variables Removed the *SO variables, updated some tests accordingly New commit: added optional list of plugin names for _LOAD variable Also made changes for the new AUTH_* plugins added: mysql-test/include/plugin.defs modified: mysql-test/mysql-test-run.pl mysql-test/suite/bugs/t/bug57108.test mysql-test/t/bug46261.test mysql-test/t/fulltext_plugin.test mysql-test/t/plugin.test mysql-test/t/plugin_auth_qa_2-master.opt mysql-test/t/plugin_auth_qa_3-master.opt mysql-test/t/plugin_not_embedded.test === added file 'mysql-test/include/plugin.defs' --- a/mysql-test/include/plugin.defs 1970-01-01 00:00:00 +0000 +++ b/mysql-test/include/plugin.defs 2011-01-11 13:27:03 +0000 @@ -0,0 +1,41 @@ +# Definition file for plugins. +# +# [,...] +# +# The following variables will be set for a plugin, where PLUGVAR +# represents the variable name given as the 3rd item +# +# PLUGVAR: name of plugin file including extension .so or .dll +# PLUGVAR_DIR: name of directory where plugin was found +# PLUGVAR_OPT: mysqld option --plugin_dir=.... +# PLUGVAR_LOAD: option --plugin_load=.... if the 4th element is present +# +# If a listed plugin is not found, the corresponding variables will be +# set to empty, they will not be unset. +# +# The PLUGVAR variable is not quoted, so you must remember to quote it +# when using it in an INSTALL PLUGIN command. +# +# The envorinment variables can be used in tests. If adding a new plugin, +# you are free to pick your variable name, but please keep it upper +# case for consistency. +# +# The _LOAD variable will have a form +# +# --plugin_load==;=..... +# +# with name1, name2 etc from the comma separated list of plugin names +# in the optional 4th argument. + +auth_test_plugin plugin/auth PLUGIN_AUTH test_plugin_server +qa_auth_interface plugin/auth PLUGIN_AUTH_INTERFACE qa_auth_interface +qa_auth_server plugin/auth PLUGIN_AUTH_SERVER qa_auth_server +qa_auth_client plugin/auth PLUGIN_AUTH_CLIENT qa_auth_client +udf_example sql UDF_EXAMPLE_LIB +ha_example storage/example EXAMPLE_PLUGIN EXAMPLE +semisync_master plugin/semisync SEMISYNC_MASTER_PLUGIN +semisync_slave plugin/semisync SEMISYNC_SLAVE_PLUGIN +ha_archive storage/archive ARCHIVE_PLUGIN +ha_blackhole storage/blackhole BLACKHOLE_PLUGIN +ha_federated storage/federated FEDERATED_PLUGIN +mypluglib plugin/fulltext SIMPLE_PARSER === modified file 'mysql-test/mysql-test-run.pl' --- a/mysql-test/mysql-test-run.pl 2010-12-29 15:28:19 +0000 +++ b/mysql-test/mysql-test-run.pl 2011-01-11 13:27:03 +0000 @@ -131,10 +131,6 @@ my $opt_start_dirty; my $opt_start_exit; my $start_only; -my $auth_interface_fn; # the name of qa_auth_interface plugin -my $auth_server_fn; # the name of qa_auth_server plugin -my $auth_client_fn; # the name of qa_auth_client plugin -my $auth_filename; # the name of the authentication test plugin my $auth_plugin; # the path to the authentication test plugin END { @@ -1124,27 +1120,7 @@ sub command_line_setup { "$basedir/sql/share/charsets", "$basedir/share/charsets"); - # Look for auth test plugins - if (IS_WINDOWS) - { - $auth_filename = "auth_test_plugin.dll"; - $auth_interface_fn = "qa_auth_interface.dll"; - $auth_server_fn = "qa_auth_server.dll"; - $auth_client_fn = "qa_auth_client.dll"; - } - else - { - $auth_filename = "auth_test_plugin.so"; - $auth_interface_fn = "qa_auth_interface.so"; - $auth_server_fn = "qa_auth_server.so"; - $auth_client_fn = "qa_auth_client.so"; - } - $auth_plugin= - mtr_file_exists(vs_config_dirs('plugin/auth/',$auth_filename), - "$basedir/plugin/auth/.libs/" . $auth_filename, - "$basedir/lib/mysql/plugin/" . $auth_filename, - "$basedir/lib/plugin/" . $auth_filename); - + ($auth_plugin)= find_plugin("auth_test_plugin", "plugin/auth"); if (using_extern()) { @@ -1983,6 +1959,53 @@ sub find_plugin($$) return $lib_example_plugin; } +# +# Read plugin defintions file +# + +sub read_plugin_defs($) +{ + my ($defs_file)= @_; + + open(PLUGDEF, '<', $defs_file) + or mtr_error("Can't read plugin defintions file $defs_file"); + + while () { + next if /^#/; + my ($plug_file, $plug_loc, $plug_var, $plug_names)= split; + # Allow empty lines + next unless $plug_file; + mtr_error("Lines in $defs_file must have 3 or 4 items") unless $plug_var; + + my ($plugin)= find_plugin($plug_file, $plug_loc); + + # Set env. variables that tests may use, set to empty if plugin + # listed in def. file but not found. + + if ($plugin) { + $ENV{$plug_var}= basename($plugin); + $ENV{$plug_var.'_DIR'}= dirname($plugin); + $ENV{$plug_var.'_OPT'}= "--plugin-dir=".dirname($plugin); + if ($plug_names) { + my $lib_name= basename($plugin); + my $load_var= "--plugin_load="; + my $semi= ''; + foreach my $plug_name (split (',', $plug_names)) { + $load_var .= $semi . "$plug_name=$lib_name"; + $semi= ';'; + } + $ENV{$plug_var.'_LOAD'}= $load_var; + } + } else { + $ENV{$plug_var}= ""; + $ENV{$plug_var.'_DIR'}= ""; + $ENV{$plug_var.'_OPT'}= ""; + $ENV{$plug_var.'_LOAD'}= "" if $plug_names; + } + } + close PLUGDEF; +} + sub environment_setup { umask(022); @@ -2019,127 +2042,19 @@ sub environment_setup { } # -------------------------------------------------------------------------- - # Add the path where mysqld will find udf_example.so - # -------------------------------------------------------------------------- - my $udf_example_filename; - if (IS_WINDOWS) - { - $udf_example_filename = "udf_example.dll"; - } - else - { - $udf_example_filename = "udf_example.so"; - } - my $lib_udf_example= - mtr_file_exists(vs_config_dirs('sql', $udf_example_filename), - "$basedir/sql/.libs/$udf_example_filename",); - - if ( $lib_udf_example ) - { - push(@ld_library_paths, dirname($lib_udf_example)); - } - - $ENV{'UDF_EXAMPLE_LIB'}= - ($lib_udf_example ? basename($lib_udf_example) : ""); - $ENV{'UDF_EXAMPLE_LIB_OPT'}= "--plugin-dir=". - ($lib_udf_example ? dirname($lib_udf_example) : ""); - - # -------------------------------------------------------------------------- - # Add the path where mysqld will find the auth test plugin (dialog.so/dll) + # Read definitions from include/plugin.defs + # + # Plugin settings should no longer be added here, instead + # place definitions in include/plugin.defs. + # See comment in that file for details. # -------------------------------------------------------------------------- - if ($auth_plugin) - { - $ENV{'PLUGIN_AUTH'}= basename($auth_plugin); - $ENV{'PLUGIN_AUTH_OPT'}= "--plugin-dir=".dirname($auth_plugin); + read_plugin_defs("include/plugin.defs"); - $ENV{'PLUGIN_AUTH_LOAD'}="--plugin_load=test_plugin_server=".$auth_filename; - $ENV{'PLUGIN_AUTH_INTERFACE'}="--plugin_load=qa_auth_interface=".$auth_interface_fn; - $ENV{'PLUGIN_AUTH_SERVER'}="--plugin_load=qa_auth_server=".$auth_server_fn; - $ENV{'PLUGIN_AUTH_CLIENT'}="--plugin_load=qa_auth_client=".$auth_client_fn; - } - else + # Simplify reference to semisync plugins + if ($ENV{'SEMISYNC_MASTER_PLUGIN'}) { - $ENV{'PLUGIN_AUTH'}= ""; - $ENV{'PLUGIN_AUTH_OPT'}="--plugin-dir="; - $ENV{'PLUGIN_AUTH_LOAD'}=""; - $ENV{'PLUGIN_AUTH_INTERFACE'}=""; - $ENV{'PLUGIN_AUTH_SERVER'}=""; - $ENV{'PLUGIN_AUTH_CLIENT'}=""; - } - - - # -------------------------------------------------------------------------- - # Add the path where mysqld will find ha_example.so - # -------------------------------------------------------------------------- - if ($mysql_version_id >= 50100) { - my ($lib_example_plugin) = find_plugin("ha_example", "storage/example"); - - if($lib_example_plugin) - { - $ENV{'EXAMPLE_PLUGIN'}= - ($lib_example_plugin ? basename($lib_example_plugin) : ""); - $ENV{'EXAMPLE_PLUGIN_OPT'}= "--plugin-dir=". - ($lib_example_plugin ? dirname($lib_example_plugin) : ""); - - $ENV{'HA_EXAMPLE_SO'}="'".basename($lib_example_plugin)."'"; - $ENV{'EXAMPLE_PLUGIN_LOAD'}="--plugin_load=EXAMPLE=".basename($lib_example_plugin); - } - else - { - # Some ".opt" files use some of these variables, so they must be defined - $ENV{'EXAMPLE_PLUGIN'}= ""; - $ENV{'EXAMPLE_PLUGIN_OPT'}= ""; - $ENV{'HA_EXAMPLE_SO'}= ""; - $ENV{'EXAMPLE_PLUGIN_LOAD'}= ""; - } + $ENV{'SEMISYNC_PLUGIN_OPT'}= $ENV{'SEMISYNC_MASTER_PLUGIN_OPT'}; } - - - # -------------------------------------------------------------------------- - # Add the path where mysqld will find semisync plugins - # -------------------------------------------------------------------------- - if (!$opt_embedded_server) { - - - my ($lib_semisync_master_plugin) = find_plugin("semisync_master", "plugin/semisync"); - my ($lib_semisync_slave_plugin) = find_plugin("semisync_slave", "plugin/semisync"); - - - if ($lib_semisync_master_plugin && $lib_semisync_slave_plugin) - { - $ENV{'SEMISYNC_MASTER_PLUGIN'}= basename($lib_semisync_master_plugin); - $ENV{'SEMISYNC_SLAVE_PLUGIN'}= basename($lib_semisync_slave_plugin); - $ENV{'SEMISYNC_PLUGIN_OPT'}= "--plugin-dir=".dirname($lib_semisync_master_plugin); - } - else - { - $ENV{'SEMISYNC_MASTER_PLUGIN'}= ""; - $ENV{'SEMISYNC_SLAVE_PLUGIN'}= ""; - $ENV{'SEMISYNC_PLUGIN_OPT'}="--plugin-dir="; - } - } - - # ---------------------------------------------------- - # Add the paths where mysqld will find archive/blackhole/federated plugins. - # ---------------------------------------------------- - $ENV{'ARCHIVE_PLUGIN_DIR'} = - dirname(find_plugin("ha_archive", "storage/archive")); - $ENV{'BLACKHOLE_PLUGIN_DIR'} = - dirname(find_plugin("ha_blackhole", "storage/blackhole")); - $ENV{'FEDERATED_PLUGIN_DIR'} = - dirname(find_plugin("ha_federated", "storage/federated")); - - # ---------------------------------------------------- - # Add the path where mysqld will find mypluglib.so - # ---------------------------------------------------- - - my ($lib_simple_parser) = find_plugin("mypluglib", "plugin/fulltext"); - - $ENV{'MYPLUGLIB_SO'}="'".basename($lib_simple_parser)."'"; - $ENV{'SIMPLE_PARSER'}= - ($lib_simple_parser ? basename($lib_simple_parser) : ""); - $ENV{'SIMPLE_PARSER_OPT'}= "--plugin-dir=". - ($lib_simple_parser ? dirname($lib_simple_parser) : ""); # -------------------------------------------------------------------------- # Valgrind need to be run with debug libraries otherwise it's almost === modified file 'mysql-test/suite/bugs/t/bug57108.test' --- a/mysql-test/suite/bugs/t/bug57108.test 2010-11-04 10:00:59 +0000 +++ b/mysql-test/suite/bugs/t/bug57108.test 2011-01-11 13:27:03 +0000 @@ -5,7 +5,7 @@ # switched directory after starting the server and am using a relative # --defaults-file. --replace_regex /\.dll/.so/ -eval INSTALL PLUGIN example SONAME $HA_EXAMPLE_SO; +eval INSTALL PLUGIN example SONAME '$EXAMPLE_PLUGIN'; --query_vertical SELECT @@global.connect_timeout AS connect_timeout, @@global.local_infile AS local_infile === modified file 'mysql-test/t/bug46261.test' --- a/mysql-test/t/bug46261.test 2010-04-22 13:52:00 +0000 +++ b/mysql-test/t/bug46261.test 2011-01-11 13:27:03 +0000 @@ -7,7 +7,7 @@ --replace_regex /\.dll/.so/ --error ER_OPTION_PREVENTS_STATEMENT -eval INSTALL PLUGIN example SONAME $HA_EXAMPLE_SO; +eval INSTALL PLUGIN example SONAME '$EXAMPLE_PLUGIN'; --replace_regex /\.dll/.so/ --error ER_OPTION_PREVENTS_STATEMENT === modified file 'mysql-test/t/fulltext_plugin.test' --- a/mysql-test/t/fulltext_plugin.test 2009-11-09 11:32:48 +0000 +++ b/mysql-test/t/fulltext_plugin.test 2011-01-11 13:27:03 +0000 @@ -4,7 +4,7 @@ # BUG#39746 - Debug flag breaks struct definition (server crash) # --replace_regex /\.dll/.so/ -eval INSTALL PLUGIN simple_parser SONAME $MYPLUGLIB_SO; +eval INSTALL PLUGIN simple_parser SONAME '$SIMPLE_PARSER'; CREATE TABLE t1(a TEXT, b TEXT, FULLTEXT(a) WITH PARSER simple_parser); ALTER TABLE t1 ADD FULLTEXT(b) WITH PARSER simple_parser; DROP TABLE t1; === modified file 'mysql-test/t/plugin.test' --- a/mysql-test/t/plugin.test 2009-11-02 20:05:42 +0000 +++ b/mysql-test/t/plugin.test 2011-01-11 13:27:03 +0000 @@ -5,15 +5,15 @@ CREATE TABLE t1(a int) ENGINE=EXAMPLE; DROP TABLE t1; --replace_regex /\.dll/.so/ -eval INSTALL PLUGIN example SONAME $HA_EXAMPLE_SO; +eval INSTALL PLUGIN example SONAME '$EXAMPLE_PLUGIN'; --replace_regex /\.dll/.so/ --error 1125 -eval INSTALL PLUGIN EXAMPLE SONAME $HA_EXAMPLE_SO; +eval INSTALL PLUGIN EXAMPLE SONAME '$EXAMPLE_PLUGIN'; UNINSTALL PLUGIN example; --replace_regex /\.dll/.so/ -eval INSTALL PLUGIN example SONAME $HA_EXAMPLE_SO; +eval INSTALL PLUGIN example SONAME '$EXAMPLE_PLUGIN'; CREATE TABLE t1(a int) ENGINE=EXAMPLE; @@ -41,7 +41,7 @@ UNINSTALL PLUGIN non_exist; --echo # to impossible int val --echo # --replace_regex /\.dll/.so/ -eval INSTALL PLUGIN example SONAME $HA_EXAMPLE_SO; +eval INSTALL PLUGIN example SONAME '$EXAMPLE_PLUGIN'; SET GLOBAL example_enum_var= e1; SET GLOBAL example_enum_var= e2; @@ -56,7 +56,7 @@ UNINSTALL PLUGIN example; # Bug #32757 hang with sql_mode set when setting some global variables # --replace_regex /\.dll/.so/ -eval INSTALL PLUGIN example SONAME $HA_EXAMPLE_SO; +eval INSTALL PLUGIN example SONAME '$EXAMPLE_PLUGIN'; select @@session.sql_mode into @old_sql_mode; === modified file 'mysql-test/t/plugin_auth_qa_2-master.opt' --- a/mysql-test/t/plugin_auth_qa_2-master.opt 2010-10-20 14:56:09 +0000 +++ b/mysql-test/t/plugin_auth_qa_2-master.opt 2011-01-11 13:27:03 +0000 @@ -1,2 +1,2 @@ -$PLUGIN_AUTH_OPT -$PLUGIN_AUTH_INTERFACE +$PLUGIN_AUTH_INTERFACE_OPT +$PLUGIN_AUTH_INTERFACE_LOAD === modified file 'mysql-test/t/plugin_auth_qa_3-master.opt' --- a/mysql-test/t/plugin_auth_qa_3-master.opt 2010-10-20 14:56:09 +0000 +++ b/mysql-test/t/plugin_auth_qa_3-master.opt 2011-01-11 13:27:03 +0000 @@ -1,2 +1,2 @@ -$PLUGIN_AUTH_OPT -$PLUGIN_AUTH_SERVER +$PLUGIN_AUTH_SERVER_OPT +$PLUGIN_AUTH_SERVER_LOAD === modified file 'mysql-test/t/plugin_not_embedded.test' --- a/mysql-test/t/plugin_not_embedded.test 2010-12-02 08:13:31 +0000 +++ b/mysql-test/t/plugin_not_embedded.test 2011-01-11 13:27:03 +0000 @@ -8,7 +8,7 @@ GRANT INSERT ON mysql.plugin TO bug51770@localhost; connect(con1,localhost,bug51770,,); --replace_regex /\.dll/.so/ -eval INSTALL PLUGIN example SONAME $HA_EXAMPLE_SO; +eval INSTALL PLUGIN example SONAME '$EXAMPLE_PLUGIN'; --error ER_TABLEACCESS_DENIED_ERROR UNINSTALL PLUGIN example; connection default; @@ -25,7 +25,7 @@ DROP USER bug51770@localhost; # The bug consisted of not recognizing / on Windows, so checking / on # all platforms should cover this case. -let $path = `select CONCAT_WS('/', '..', $HA_EXAMPLE_SO)`; +let $path = `select CONCAT_WS('/', '..', '$EXAMPLE_PLUGIN')`; --replace_regex /\.dll/.so/ --error ER_UDF_NO_PATHS eval INSTALL PLUGIN example SONAME '$path'; --===============0296379709== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/bjorn.munch@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: bjorn.munch@stripped # target_branch: file:///home/bm136801/my/genplug-55/ # testament_sha1: c8c555fc1eb5bc67193887807bfa10781525205f # timestamp: 2011-01-11 14:27:55 +0100 # base_revision_id: bjorn.munch@stripped\ # qbbutdwsoyjx4m4t # # Begin bundle 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 --===============0296379709==--