Hi Sergei,

Thanks for the comments. Please find the updated commits in the latest
comment in the ticket.

On Fri 2023-09-01 19:22:02 +0200, Sergei Golubchik wrote:

> Hi, Yuchen,
>
> On Sep 01, Yuchen Pei wrote:
>> revision-id: 04b99a30a3f (mariadb-11.0.1-103-g04b99a30a3f)
>> parent(s): 4f39ae75606
>> author: Yuchen Pei
>> committer: Yuchen Pei
>> timestamp: 2023-08-16 11:31:16 +1000
>> message:
>>
>> MDEV-15935 Adding global/session var redirect_url
>>
>> Adding a global/session var `redirect_url' of string type. The initial
>> value is empty. Can be supplied in mysqld with --redirect-url. A valid
>> redirect_url should be of the format
>>
>> {mysql,mariadb}://host[:port]
>>
>> where <host> is an arbitrary string not containing colons, and <port>
>> is a number between 0 and 65535 inclusive.
>>
>> diff --git a/mysql-test/main/redirect.opt b/mysql-test/main/redirect.opt
>
> move this to the sys_vars suite, please

Done.

>
>> --- /dev/null
>> +++ b/mysql-test/main/redirect.opt
>> @@ -0,0 +1 @@
>> +--redirect_url=mysql://foobar
>
> ok, as long as this isn't a complete feature, but just one piece of it.
>
> but when client support will be implemented (CONC-599) and the server
> will actually send this to the connecting clients (MDEV-31609),
> this test will need to be fixed, as foobar is not something a client can
> be redirected to.

Ack.

>
> Also, it'd be more interesting to try something like
>
> --init-connect='set @@redirect_url="mysql://foobar"'
>
> instead of the simple --redirect_url=mysql://foobar
>
> because init-connect is much more flexible, it can generate the url on
> the fly, it can send different users to different locations. So it'd
> make sense to test init-connect approach.

Done.

>
>> diff --git a/mysql-test/main/redirect.test b/mysql-test/main/redirect.test
>> new file mode 100644
>> --- /dev/null
>> +++ b/mysql-test/main/redirect.test
>> @@ -0,0 +1,56 @@
>> +--echo #
>> +--echo # MDEV-15935 Connection Redirection Mechanism in MariaDB
>> Client/Server Protocol
>> +--echo #
>> +
>> +set @old_redirect_url=@@redirect_url;
>> +select @@global.redirect_url;
>> +set global redirect_url=default;
>> +select @@global.redirect_url;
>> +--error ER_WRONG_VALUE_FOR_VAR
>> +set global redirect_url="mariadb.org";
>> +--error ER_WRONG_VALUE_FOR_VAR
>> +set global redirect_url="https://mariadb.org";;
>
> before doing all this fun, please remove redirect_url from the
> session_track_system_variables, or just set it to the empty string.

Done. Setting it to empty for simplicity, as removing requires
considering 3 cases of whether redirect_url is the only, first, or
non-first item in the var list. I had also added a couple of lines
before the statement setting it to empty, to test that it prints changes
in redirect_url, but it did not work with --ps-protocol, as it printed
out extra SESSION_TRACK_SCHEMA changes, even with --disable_ps_protocol,
and with `set session_track_system_variables="redirect_url";':
https://buildbot.mariadb.org/#/builders/534/builds/9207

>
>> diff --git a/sql/sql_class.h b/sql/sql_class.h
>> --- a/sql/sql_class.h
>> +++ b/sql/sql_class.h
>> @@ -3585,6 +3587,7 @@ class THD: public THD_count, /* this must be first */
>>    */
>>    LEX_CSTRING connection_name;
>>    char       default_master_connection_buff[MAX_CONNECTION_NAME+1];
>> +  char       redirect_url_buff[MAX_CONNECTION_NAME+1];
>
> This isn't such a good idea (I'm afraid, I missed it when
> default_master_connection_buff was added). A couple of years ago
> Monty have spent significant efforts trying to make THD smaller as it
> has grown to be too large. Now THD keeps growing again. Let's try not to
> encourage it, if we can help it.

Done. Without a THD field to store the string buffer, we'll have to
resort to strdup/free, as THD::strmake() puts the space in the
temporary runtime memroot which gets freed after a statement. In any
case, I removed default_master_connection_buff too, as part of the
cleanup of Sys_var_* classes requested below.

>
>>    uint8      password; /* 0, 1 or 2 */
>>    uint8      failed_com_change_user;
>>    bool       slave_thread;
>> diff --git a/sql/sys_vars.inl b/sql/sys_vars.inl
>> --- a/sql/sys_vars.inl
>> +++ b/sql/sys_vars.inl
>> @@ -637,6 +637,129 @@ class Sys_var_charptr_fscs: public Sys_var_charptr
> ...
>> +class Sys_var_redirect_url: public Sys_var_charptr_base
>
> please, no. new classes are needed only for variables with very special,
> unlike anything else, behavior.
>
> redirect_url is just a session string variable. See the comment at the
> top of sys_vars.cc
>
> But (!) there are no other session string variables yet.
>
> So I'd recomment to fix Sys_var_charptr to support session variables.
> And then create redirect_url out of it.

Done. Shall we add a new session_cleanup() method to sys_var that gets
called in ~THD(), so that we don't have to do it manually in say
plugin_thdvar_cleanup()?

>
> Practically it might need no changes at all, if you put explicit
> strmake (or strdup/free) into THD::init like you did anyway.
>
> After that, I suspect, you might be able to remove Sys_var_charptr_base,
> Sys_var_sesvartrack, and Sys_var_session_lexstring, because
> Sys_var_charptr/Sys_var_lexstring will be able to serve all those use
> cases.

Done except Sys_var_sesvartrack, which has its own custom update
methods and is a bit more complex to remove.

Because of all these merges that removed extra checks on
global-only/session-only, I added a regression test mdev_15935 on
enforcement of such checks.

Now that there are two commits for this ticket, does it make sense to
push the cleanup commit to an earlier version?

Best,
Yuchen
_______________________________________________
developers mailing list -- developers@lists.mariadb.org
To unsubscribe send an email to developers-le...@lists.mariadb.org

Reply via email to