Commit c612c49a authored by unknown's avatar unknown

BUG#12969301 : mysql_plugin: enable is ignored if plugin exists

This patch changes the mechanism by which the client enables a 
plugin. Instead of using INSERT IGNORE to reload a plugin library,
it now uses REPLACE INTO. This allows users to load a library
multiple times replacing the existing values in the mysql.plugin
table. This allows users to replace the symbol reference to a
different dl name in the table. Thus permitting enabling of 
multiple versions of the same library without first disabling
the old version.

A regression test was added to ensure this feature works.
parent 1ceb16a0
...@@ -1018,7 +1018,7 @@ static int find_plugin(char *tp_path) ...@@ -1018,7 +1018,7 @@ static int find_plugin(char *tp_path)
Build the boostrap file. Build the boostrap file.
Create a new file and populate it with SQL commands to ENABLE or DISABLE Create a new file and populate it with SQL commands to ENABLE or DISABLE
the plugin via INSERT and DELETE operations on the mysql.plugin table. the plugin via REPLACE and DELETE operations on the mysql.plugin table.
param[in] operation The type of operation (ENABLE or DISABLE) param[in] operation The type of operation (ENABLE or DISABLE)
param[out] bootstrap A FILE* pointer param[out] bootstrap A FILE* pointer
...@@ -1035,12 +1035,16 @@ static int build_bootstrap_file(char *operation, char *bootstrap) ...@@ -1035,12 +1035,16 @@ static int build_bootstrap_file(char *operation, char *bootstrap)
Perform plugin operation : ENABLE or DISABLE Perform plugin operation : ENABLE or DISABLE
The following creates a temporary bootstrap file and populates it with The following creates a temporary bootstrap file and populates it with
the appropriate SQL commands for the operation. For ENABLE, INSERT the appropriate SQL commands for the operation. For ENABLE, REPLACE
statements are created. For DISABLE, DELETE statements are created. The statements are created. For DISABLE, DELETE statements are created. The
values for these statements are derived from the plugin_data read from the values for these statements are derived from the plugin_data read from the
<plugin_name>.ini configuration file. Once the file is built, a call to <plugin_name>.ini configuration file. Once the file is built, a call to
mysqld is made in read only, bootstrap modes to read the SQL statements mysqld is made in read only, bootstrap modes to read the SQL statements
and execute them. and execute them.
Note: Replace was used so that if a user loads a newer version of a
library with a different library name, the new library name is
used for symbols that match.
*/ */
if ((error= make_tempfile(bootstrap, "sql"))) if ((error= make_tempfile(bootstrap, "sql")))
{ {
...@@ -1057,7 +1061,7 @@ static int build_bootstrap_file(char *operation, char *bootstrap) ...@@ -1057,7 +1061,7 @@ static int build_bootstrap_file(char *operation, char *bootstrap)
if (strcasecmp(operation, "enable") == 0) if (strcasecmp(operation, "enable") == 0)
{ {
int i= 0; int i= 0;
fprintf(file, "INSERT IGNORE INTO mysql.plugin VALUES "); fprintf(file, "REPLACE INTO mysql.plugin VALUES ");
for (i= 0; i < (int)array_elements(plugin_data.components); i++) for (i= 0; i < (int)array_elements(plugin_data.components); i++)
{ {
/* stop when we read the end of the symbol list - marked with NULL */ /* stop when we read the end of the symbol list - marked with NULL */
......
#
# Plugin configuration file. Place the following on a separate line:
#
# library binary file name (without .so or .dll)
# component_name
# [component_name] - additional components in plugin
#
liblibdaemon_example
daemon_example
...@@ -23,12 +23,24 @@ wacky libdaemon_example.so ...@@ -23,12 +23,24 @@ wacky libdaemon_example.so
wicky libdaemon_example.so wicky libdaemon_example.so
wonky libdaemon_example.so wonky libdaemon_example.so
# #
# Ensure the plugin is loaded.
#
SELECT * FROM mysql.plugin WHERE dl like '%libdaemon%' ORDER BY name;
name dl
daemon_example libdaemon_example.so
#
# Ensure the plugin is replaced.
#
SELECT * FROM mysql.plugin WHERE dl like '%libdaemon%' ORDER BY name;
name dl
daemon_example liblibdaemon_example.so
#
# Disable the plugin... # Disable the plugin...
# #
# #
# Ensure the plugin isn't loaded. # Ensure the plugin isn't loaded.
# #
SELECT * FROM mysql.plugin WHERE dl like 'libdaemon%' ORDER BY name; SELECT * FROM mysql.plugin WHERE dl like '%libdaemon%' ORDER BY name;
name dl name dl
# #
# Attempt to load non-existant plugin # Attempt to load non-existant plugin
......
...@@ -155,6 +155,74 @@ eval INSERT INTO mysql.plugin VALUES ('wonky', '$DAEMONEXAMPLE'); ...@@ -155,6 +155,74 @@ eval INSERT INTO mysql.plugin VALUES ('wonky', '$DAEMONEXAMPLE');
--replace_regex /\.dll/.so/ --replace_regex /\.dll/.so/
SELECT * FROM mysql.plugin WHERE dl like 'libdaemon%' ORDER BY name; SELECT * FROM mysql.plugin WHERE dl like 'libdaemon%' ORDER BY name;
# MTR will remove this file later, but this might be too late.
--error 0,1
--remove_file $expect_file
--write_file $expect_file
wait
EOF
--shutdown_server 10
--source include/wait_until_disconnected.inc
#
# Disable the plugin - to remove winky, wonky entries
#
--exec $MYSQL_PLUGIN_CMD DISABLE daemon_example
#
# Enable the plugin again
#
--exec $MYSQL_PLUGIN_CMD ENABLE daemon_example
#
# Restart the server
#
--append_file $expect_file
restart
EOF
--enable_reconnect
--source include/wait_until_connected_again.inc
--echo #
--echo # Ensure the plugin is loaded.
--echo #
--replace_regex /\.dll/.so/
SELECT * FROM mysql.plugin WHERE dl like '%libdaemon%' ORDER BY name;
# MTR will remove this file later, but this might be too late.
--error 0,1
--remove_file $expect_file
--write_file $expect_file
wait
EOF
--shutdown_server 10
--source include/wait_until_disconnected.inc
# To test the case where the same plugin is reloaded with a different soname,
# we must copy the example daemon to a new location renaming it.
let $DAEMON_RELOAD = lib$DAEMONEXAMPLE;
--copy_file $PLUGIN_DIR/$DAEMONEXAMPLE $PLUGIN_DIR/$DAEMON_RELOAD
--copy_file include/libdaemon_example.ini $PLUGIN_DIR/libdaemon_example.ini
# Now reload it and see that it is a different name.
--exec $MYSQL_PLUGIN_CMD ENABLE libdaemon_example
#
# Restart the server
#
--append_file $expect_file
restart
EOF
--enable_reconnect
--source include/wait_until_connected_again.inc
--echo #
--echo # Ensure the plugin is replaced.
--echo #
--replace_regex /\.dll/.so/
SELECT * FROM mysql.plugin WHERE dl like '%libdaemon%' ORDER BY name;
--echo # --echo #
--echo # Disable the plugin... --echo # Disable the plugin...
--echo # --echo #
...@@ -170,7 +238,12 @@ EOF ...@@ -170,7 +238,12 @@ EOF
# #
# Disable the plugin # Disable the plugin
# #
--exec $MYSQL_PLUGIN_CMD DISABLE daemon_example --exec $MYSQL_PLUGIN_CMD DISABLE libdaemon_example
# Remove files for last test case.
--remove_file $PLUGIN_DIR/$DAEMON_RELOAD
--remove_file $DAEMONEXAMPLE_DIR/libdaemon_example.ini
# #
# Restart the server # Restart the server
...@@ -184,7 +257,7 @@ EOF ...@@ -184,7 +257,7 @@ EOF
--echo # --echo #
--echo # Ensure the plugin isn't loaded. --echo # Ensure the plugin isn't loaded.
--echo # --echo #
SELECT * FROM mysql.plugin WHERE dl like 'libdaemon%' ORDER BY name; SELECT * FROM mysql.plugin WHERE dl like '%libdaemon%' ORDER BY name;
# #
# Stop the server for error conditions # Stop the server for error conditions
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment