Bug #100363 clone_valid_donor_list causes initialization failures

Submitted: 29 Jul 2020 9:16 Modified: 14 Jan 2021 16:27
Reporter: Daniël van Eeden Email Updates:
Status: Verified Impact on me:
None 
Category:MySQL Server: Clone Plugin Severity:S3 (Non-critical)
Version:8.0.21 OS:Any
Assigned to: CPU Architecture:Any
Tags: Clone, cloning, usability

[29 Jul 2020 9:16] Daniël van Eeden
Description:
If I add this to the my.cnf:
plugin-load-add='clone=mysql_clone.so'
clone_valid_donor_list=myhost:3306

And then run:
`mysqld --initialize-insecure --user=mysql`

This happens:

2020-07-29T09:07:35.292872Z 0 [Warning] [MY-013501] [Server] Ignoring --plugin-load[_add] list as the server is running with --initialize(-insecure).
2020-07-29T09:07:35.695258Z 0 [ERROR] [MY-000067] [Server] unknown variable 'clone_valid_donor_list=myhost:3306'.

Prefixing the variable with `loose_` allows mysqld to initialize.

As initializing and cloning is closely related this is an unfortunate incompatibility.

Not putting the clone_valid_donor_list in the my.cnf but using `SET GLOBAL...` before calling `CLONE...` would work,
but the reason for this setting to exist is to have an extra layer of security, which gets lost if done like this.

How to repeat:
Put clone_valid_donor_list in the my.cnf when initializing mysqld

Suggested fix:
1. Allow certain plugins, like the clone plugin, to be loaded during initialization of mysqld.

2. Have something like `mysqld --initialize-clone myserver:3306` that combines the required steps for initialization and cloning.
[29 Jul 2020 12:04] MySQL Verification Team
Hello Daniël,

Thank you for the report and feedback.
Verified as described.

regards,
Umesh
[29 Jul 2020 14:50] Daniël van Eeden
Another solution may be to put plugin config in different sections

[mysqld]
plugin_load_add='clone=mysql_clone.so'

[clone]
clone_valid_donor_list=myhost:3306

The failing on missing variables in the mysqld section can remain critical and the plugin settings can be handled only if the plugin is active.

Maybe use a prefix like [plugin__clone] instead of [clone] to make things more explicit.
[13 Jan 2021 14:23] Georgi Kodinov
Posted by developer:
 
First of all I'd like to state that this is working as documented, albeit in the release notes. 
https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-18.html says:
When the server is run with --initialize, there is no reason to load non-early plugins. The server now logs a warning and ignores any --plugin-load or --plugin-load-add options given with --initialize. (Bug #29622406)

Maybe the documentation can be expanded a bit, but it is an intentional behavior. 

And also the fact that unknown options prevent mysqld from starting is also well known behavior. This makes the bug report a feature request technically. Marking the bug as such. 

Now on ways to fix this:
I do not think that currently --initalize needs any external plugins to perform its function. On the contrary: the server is in such a limbo state at init time that allowing arbitrary plugins to load during that time is probably not a very sustainable.

As for fixing the issue. Unfortunately there's very little one can do to fix this issue as it's a well-known consequence from the architectural decision of having options for dynamically loadable components interwoven with the server options. This leaves the server with no way of distinguishing between a misspelled and a correctly-spelled-but-for-a-missing-plugin option. 
We are working on a solution for this covering components but it's a feature and not a bug fix as it changes architecture. 

In the meanwhile I would suggest workarounds:
1. use --defaults-extra-file for the plugin-related variables and do not pass that during --initialize
2. use SET PERSIST[_ONLY]: this automatically prefixes with --loose behind the scenes.
[14 Jan 2021 16:27] Daniël van Eeden
Thanks for the explanation. I agree that this is a feature and that there is not really a good and easy fix right now.

Would having sections in the my.cnf for plugins work? e.g.:
=================
[mysqld]
plugin-load-add='clone=mysql_clone.so'

[plugin_clone]
valid_donor_list=myserver.example.com:3306
==================

Instead of:
==================
[mysqld]
plugin-load-add='clone=mysql_clone.so'
clone_valid_donor_list=myserver.example.com:3306
==================

Portions of this website are copyright © 2001, 2002 The PHP Group

Page generated in 0.056 sec. using MySQL 8.4.7-u6-cloud

Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the respective copyright holders.
It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.