WL#14194: Replace old terms in replication system variables, options, and strings
Affects: Server-8.0
—
Status: Complete
EXECUTIVE SUMMARY
=================
Replace the terms "master", "slave", and "mts" by "source", "replica",
and "mta" in system variable names, status variables, SQL functions,
command-line options (for server and all tools), semisync plugin names
and file names, C++ filenames and header guards, debug symbols, help
texts, and in performance_schema instrumentation names for locks,
condition variables, threads, execution stages, allocators, and thread
commands. Create aliases so that users can use the old names for
system variables, SQL functions, and command-line options, and
deprecate the use of those aliases.
USER STORIES
============
U1. As a MySQL admin user:
- I want to use configuration that does not contain offensive
terms,
- so that I do not get offended by them and/or expose them to
other people (e.g., customers of my application built on top of
MySQL).
U2. As a MySQL admin user:
- I want to monitor the product without seeing offensive terms,
- so that I do not get offended by them and/or expose them to
other people (e.g., customers of my application built on top of
MySQL).
SCOPE
=====
This worklog is part of a broader effort to change old terminology
across the entire MySQL product line.
This worklog focuses only on changing *replication* terminology. For
the word "master", we only change it where it appears in a replication
context; we do not change "master key" or "master thread".
We only change status variables, SQL functions, command-line options,
semisync plugin names and filenames, C++ filenames and header guards,
debug symbols, help texts, and performance_schema instrumentation
names. (So we do not change privilege names, column names or other
metadata for system tables, error messages, ER_* symbols, or SQL
commands.)
LIMITATIONS
===========
We do not change identifiers related to NDB.
We do not change SQL printed by mysqldump or issued by mysqladmin,
MEB, or other external tools except mysqlbinlog. The identifiers we
change, are not changed when they appear in error messages.
REFERENCES
==========
- https://mysqlhighavailability.com/mysql-terminology-updates/
FR1. The words "master", "slave", and "mts" shall be replaced by
"source", "replica", and "mta", respectively, in the contexts
listed below, except where "master" occurs in a non-replication
context such as "master key" or "master thread".
Where possible, we keep the old names for backward compatibility,
as indicated in each item in the list.
Where possible the old names generate deprecation warnings, as
indicated in each item in the list:
FR1.1. All command-line options for mysqld, except those that
will be deprecated in WL#14526, and those that are defined
by NDB.
The old names shall remain, and using them shall generate
a deprecation warning in the error log.
FR1.2. All command-line options for mysqladmin.
The old names shall remain and make the tool print
deprecation warnings.
FR1.3. All command-line options for mysqlbinlog.
The old names shall remain and make the tool print
deprecation warnings.
FR1.4. All command-line options for mysqldump.
The old names shall remain and make the tool print
deprecation warnings.
FR1.5. All system variables, except those that have been deprecated
already.
The old names shall remain. The use of them in SQL
statement shall make the client return a deprecation
warning. The use of them on the command-line or
configuration file shall generate a deprecation warning in
the error log.
The following shall hold for persisted variables:
FR1.5.1. When the server reads persisted variables, it
shall accept either the old name, or the new
name, or both.
FR1.5.2. When the server writes persisted variables, it
shall persist both the old and the new name, even
if only one of them was specified in a SET
statement.
FR1.5.3. When RESET PERSIST is used with a renamed system
variable, regardless of using the old or new name
in the statement:
- The old name shall be removed if it is
persisted;
- The new name shall be removed if it is
persisted;
- A warning/error shall only be generated if
neither the old nor the new name was persisted.
Both the old and the new variables shall exist in the
following tables and commands, but no deprecation warning
shall be issued while reading them:
performance_schema.global_variables
performance_schema.session_variables
performance_schema.variables_by_thread
performance_schema.persisted_variables
performance_schema.variables_info
SHOW VARIABLES
FR1.6. All status variables defined in the server, except those
defined by NDB.
Both the old and the new variables shall exist in the
following places, and no deprecation warning shall be
generated when reading them:
performance_schema.global_status
performance_schema.session_status
performance_schema.status_by_thread
SHOW STATUS
FR1.7. All user variables that the replica sets on the connection
before it sends a COM_BINLOG_DUMP command to start
replication.
FR1.7.1. The source shall accept either the old or the new
names.
FR1.7.2. The replica shall set both the old-named and the
new-named variable.
No deprecation warning shall be generated.
FR1.8. All SQL functions defined in the server.
The old names shall remain and the use of them shall make
the client return deprecation warnings.
FR1.9. The following identifiers instrumented in performance_schema:
FR1.9.1. Thread commands
FR1.9.2. Instrumented locks
FR1.9.3. Instrumented condition variables
FR1.9.4. Thread stages
FR1.9.5. Thread names
FR1.9.6. Instrumented memory alloctions
The old names shall be removed.
FR1.10. All C++ source file names.
The old names shall be removed.
FR1.11. All header guards in C++ source filenames.
The old names shall be removed.
FR1.12. All debug symbols (as in
`DBUG_EXECUTE_IF("debug_symbol", ...)`).
The old names shall be removed.
FR1.13. The following names related to the two semisync libraries:
FR1.13.1. The library filenames.
FR1.13.2. The plugin names.
FR1.13.2. All system variables defined by the plugins.
FR1.13.2. All status variables defined by the plugins.
The libraries shall be duplicated so that old filenames
can be used with the old plugin names, and loading them
shall define the old-named system variables and status
variables.
Deprecation warnings shall be generated when loading the
old-named libraries.
An error shall be generated if the user loads both the
old-named and the new-named source libraries, or both the
old-named and the new-named replica libraries.
FR1.14. Compiled-in help texts for system variables and
command-line options:
- Any occurrence of renamed identifiers shall use the new
name.
- Any occurrence of master/slave/mts shall be replaced by
source/replica/mta.
- Any mistakes spotted while editing the text shall be
fixed.
- Any deprecated options shall be documented as
deprecated, with a reference to the new option.
SUMMARY OF THE APPROACH
=======================
Replace the old terms by the new terms in all the required places.
Where possible, maintain the old terms as aliases. This is possible
for configuration and other things that appear as identifiers in SQL,
but not for strings that appear in performance_schema tables, so we
break compatibility for them.
This needs to change more than 16000 files. Therefore, we perform the
replacements automatically. To make that practical, we use a tool
that reads a file containing replacement rules and applies each rule
to the full source tree. The tool needs to express things in
different ways than what standard tools like grep can, so we code a
new tool for this.
After applying the replacements, we code the aliases in a sequence of
follow-up steps.
CHANGES IN USER INTERFACE
=========================
Here we list the full set of replaced identifiers. Unless otherwise
specified, we uniformly replace "master" by "source", "slave" by
"replica", and "mts" by "mta".
* Changed system variables defined in the server:
For the variables below, the old name remains and is deprecated, and
the new name is added. Both names will exist in all contexts where
variables appear, i.e., --command-line-option, @@global.variable,
@@session.variable, SET PERSIST, SHOW VARIABLES,
performance_schema.global_variables,
performance_schema.persisted_variables,
performance_schema.variables_info. Deprecation warnings are emitted
when using the variable on the command line, in a SET statement, and
when accessing it using @@ notation. No warning is emitted when the
variable is accessed through a table or SHOW statement. The built-in
help for the old name states that it is deprecated.
master_verify_checksum
sync_master_info
init_slave
rpl_stop_slave_timeout
log_slow_slave_statements
slave_max_allowed_packet
slave_compressed_protocol
slave_exec_mode
slave_type_conversions
slave_sql_verify_checksum
slave_parallel_type
slave_preserve_commit_order
log_slave_updates
slave_allow_batching
slave_load_tmpdir
slave_net_timeout
sql_slave_skip_counter
slave_skip_errors
slave_checkpoint_period
slave_checkpoint_group
slave_transaction_retries
slave_parallel_workers
slave_pending_jobs_size_max
pseudo_slave_mode
skip_slave_start
The following variables are not changed:
- ndb_slave_conflict_role: We do not change NDB now.
- binlog_rotate_encryption_master_key_at_startup: This refers to the
"master key", which is a metaphor without offensive connotations.
This use of master is considered unproblematic and will not be
replaced.
- slave_rows_search_algorithms: Deprecated already
- master_info_repository: Deprecated already.
* Changed command-line options for mysqld:
For the following option, the old name remains and is deprecated, and
the new name is added. A deprecation warning is issued when the
command-line option is used. The built-in help for the old name
states that it is deprecated. (Most command-line options are also
system variables, and are included in the list in the preceding
section instead. The list here includes only the command-line options
which are not system variables.)
show-slave-auth-info
The following command-line options are not changed:
- abort-slave-event-count: Will be deprecated in WL#14526.
- disconnect-slave-event-count: Will be deprecated in WL#14526.
- master-info-file: Deprecated already.
- master-retry-count: Deprecated already.
* Changed command-line options for mysqlbinlog:
For the following option, the old name remains and is deprecated, and
the new name is added. A deprecation warning is issued when the
command-line option is used. The built-in help for the old name
states that it is deprecated.
read-from-remote-master
The following variable is not changed:
- stop-never-slave-server-id: Deprecated already.
* Changed command-line options for mysqldump:
For the following options, the old name remains and is deprecated, and
the new name is added. A deprecation warning is issued when the
command-line option is used. The built-in help for the old name
states that it is deprecated.
apply-slave-statements
delete-master-logs
dump-slave
include-master-host-port
master-data
* Changed command-line options for mysqladmin:
For the following options, the old name remains and is deprecated, and
the new name is added. A deprecation warning is issued when the
command-line option is used. The built-in help for the old name
states that it is deprecated.
start-slave
stop-slave
* Changed built-in SQL functions:
For the following function, the old name remains and is deprecated,
and the new name is added. A deprecation warning is issued when the
function is used.
MASTER_POS_WAIT
* Changed status variables:
Status variables are displayed with SHOW STATUS LIKE 'name' and
performance_schema.status_variables. The old name remains and the new
name is added. No deprecation warning is used.
Slave_open_temp_tables
Slave_rows_last_search_algorithm_used
Rpl_semi_sync_master_status
Rpl_semi_sync_master_clients
Rpl_semi_sync_master_yes_tx
Rpl_semi_sync_master_no_tx
Rpl_semi_sync_master_wait_sessions
Rpl_semi_sync_master_no_times
Rpl_semi_sync_master_timefunc_failures
Rpl_semi_sync_master_wait_pos_backtraverse
Rpl_semi_sync_master_tx_wait_time
Rpl_semi_sync_master_tx_waits
Rpl_semi_sync_master_tx_avg_wait_time
Rpl_semi_sync_master_net_wait_time
Rpl_semi_sync_master_net_waits
Rpl_semi_sync_master_net_avg_wait_time
Rpl_semi_sync_slave_status
All NDB-related status variables are skipped.
The following variables were already removed in 8.0:
Slave_running
Slave_retried_transactions
Slave_heartbeat_period
Slave_received_heartbeats
Slave_last_heartbeat
(There is some dead server code that makes it look like they exist, if
you read the code. Hence they were listed in an early version of this
worklog. We do not consider them in this worklog, and will remove
them in an independent bugfix.)
* Changed thread names in PERFORMANCE_SCHEMA:
Thread names are visible in the NAME column of
performance_schema.threads. The old name is replaced by the new name.
This is an incompatible change.
slave_io
slave_sql
slave_worker
* Changed thread commands in PERFORMANCE_SCHEMA:
Thread command is the value shown in the following places:
- The PROCESSLIST_COMMAND column of performance_schema.threads,
- the COMMAND column of performance_schema.processlist,
- the COMMAND column of SHOW PROCESSLIST,
- the COMMAND column of INFORMATION_SCHEMA.PROCESSLIST.
In the following case, the old name is replaced by the new name. This
is an incompatible change.
Register Slave
* Changed names of instrumented locks in PERFORMANCE_SCHEMA:
Mutex names are visible with a 'wait/synch/mutex/'
prefix, in the following places:
- the NAME column of performance_schema.mutex_instances
- the EVENT_NAME column of all performance_schema.events_waits_* tables
In the following cases, the old name is replaced by the new name. This
is an incompatible change.
Master_info::data_lock
Master_info::run_lock
Master_info::sleep_lock
Master_info::info_thd_lock
Master_info::rotate_lock
Slave_reporting_capability::err_lock
Relay_log_info::slave_worker_hash_lock
key_mts_temp_table_LOCK
key_mts_gaq_LOCK
LOCK_slave_list
* Changed names of instrumented condition variables in PERFORMANCE_SCHEMA:
Condition variable names are visible with a 'wait/synch/cond/' prefix
in the following places:
- the NAME column of performance_schema.cond_instances.
- the EVENT_NAME column of all performance_schema.events_waits_* tables
In the following cases, the old name is replaced by the new name. This
is an incompatible change.
Master_info::data_cond
Master_info::start_cond
Master_info::stop_cond
Master_info::sleep_cond
Master_info::rotate_cond
LOCK_slave_trans_dep_tracker
Relay_log_info::mts_gaq_cond
* Changed names of thread stages in PERFORMANCE_SCHEMA:
Thread stages are visible in the following places:
- the PROCESSLIST_STATE column of performance_schema.threads, and
- the EVENT_NAME column of all performance_schema.events_stages_* tables, and
- the STATE column of performance_schema.processlist, and
- the STATE column of SHOW PROCESSLIST, and
- the STATE column of INFORMATION_SCHEMA.PROCESSLIST.
In the following cases, the old name is replaced by the new name. This
is an incompatible change.
Checking master version
Connecting to master
Flushing relay log and master info repository.
Queueing master event to the relay log
Waiting until MASTER_DELAY seconds after master executed event
Waiting for master to send event
Waiting for master update
Killing slave
Master has sent all binlog to slave; waiting for more updates
Registering slave on master
Sending binlog event to slave
Slave has read all relay log; waiting for more updates
Waiting for slave workers to process their queues
Waiting for Slave Worker queue
Waiting for Slave Workers to free pending events
Waiting for Slave Worker to release partition
Waiting for slave mutex on exit
Waiting for slave thread to start
Waiting for the slave SQL thread to advance position
The following thread stages are defined in the old semi-sync plugin.
The new name is used in the new semi-sync plugin. This is a
*compatible* change, since users must enable the new library in order
to observe the new names.
Waiting for semi-sync ACK from slave
Waiting for semi-sync slave connection
Reading semi-sync ACK from slave
The following thread stages are changed in more complex way than the
scripted word substitution:
Waiting for the slave SQL thread to free enough relay log space
Waiting for the replica SQL thread to free relay log space
- The old text is exactly the maximum allowed length, and replacing
'slave' by 'replica' makes it one character too long. Hence removing
the redundant word 'enough'.
Changing master
Changing replication source
- This stage referred to the SQL statement CHANGE MASTER, which has
been renamed to CHANGE REPLICATION SOURCE, so the renamed stage
shall use the new SQL command name.
* Changed instrumented memory allocations:
Slave_job_group::group_relay_log_name
rpl_slave::check_temp_dir
SLAVE_INFO
show_slave_status_io_gtid_set
memory/sql/Relay_log_info::mts_coor
The old name is replaced by the new name. This is an incompatible
change.
* Changed C++ filenames:
rpl_slave.cc
rpl_slave.h
rpl_slave_until_options.cc
rpl_slave_until_options.h
rpl_slave_commit_order_manager.cc
rpl_slave_commit_order_manager.h
rpl_master.cc
rpl_master.h
rpl_mts_submode.cc
rpl_mts_submode.h
semisync_master.cc
semisync_master.h
semisync_master_ack_receiver.cc
semisync_master_ack_receiver.h
semisync_master_plugin.cc
semisync_master_socket_listener.h
semisync_slave.cc
semisync_slave.h
semisync_slave_plugin.cc
This is an internal change and does not change the API. Compatibility
is not an issue.
* Changed C++ header guards:
RPL_SLAVE_H
DEFINED_RPL_SLAVE_UNTIL_OPTIONS_H
RPL_SLAVE_COMMIT_ORDER_MANAGER
RPL_MASTER_H_INCLUDED
SEMISYNC_MASTER_H
SEMISYNC_MASTER_ACK_RECEIVER_DEFINED
SEMISYNC_MASTER_SOCKET_LISTENER
SEMISYNC_SLAVE_H
MTS_SUBMODE_H
This is an internal change and does not change the API. Compatibility
is not an issue.
* Changed C++ debug symbols:
after_locking_channel_map_in_start_slave
after_start_slave
begin_master_pos_wait
begin_start_slave
check_slave_debug_group
check_slave_master_info
dbug.before_get_MASTER_UUID
dbug.mts.force_clock_diff_eq_0
dbug.return_null_MASTER_UUID
debug_crash_slave_time_out
enable_mts_wokrer_failure_in_recovery_finalize
enable_mts_worker_failure_init
fail_generating_rotate_event_on_write_rotate_to_master_pos
fail_to_flush_master_info
fake_5_5_version_slave
fault_injection_get_slave_worker
fix_slave_net_timeout
force_rollback_in_slave_on_transactional_ddl_commit
FORCE_SLAVE_TO_RECONNECT_DUMP
FORCE_SLAVE_TO_RECONNECT_EVENT
FORCE_SLAVE_TO_RECONNECT_REG
get_master_server_id.
get_master_server_id.ER_NET_READ_INTERRUPTED
mts_checkpoint
mts_checkpoint_end
mts_checkpoint_start
mts_debug_concurrent_access
mts_debug_recovery_reset_fails
mts_debug_reset_workers_fails
mts_distribute_round_robin
mts_slave_worker_init_at_gaps_fails
mts_worker_thread_fails
mts_worker_thread_init_fails
ndb_slave_fail_marking_epoch_committed
old_row_based_repl_4_byte_map_id_master
query_log_event_mts_corrupt_db_names
remove_slave_load_file_before_write
request_master_log_pos_3
rotate_slave_debug_group
rpl_semisync_master_commit_trx_before_lock
rpl_semisync_simulate_add_slave_failure
rpl_slave_debug
rpl_slave_debug_point
signal.get_master_uuid
signal.got_stop_slave
simulate_hold_run_locks_on_stop_slave
simulate_io_slave_error_on_init
simulate_master_has_gtid_mode_off_something
simulate_master_has_gtid_mode_on_something
simulate_master_has_unknown_gtid_mode
simulate_register_slave_killed
simulate_slave_delay_at_terminate_bug38694
simulate_slave_unaware_checksum
simulate_slave_unaware_gtid
simulate_sql_slave_error_on_init
simulate_stop_when_mts_in_group
slave_acquired_backup_lock
slave_crash_after_commit
slave_crash_after_commit_no_atomic_ddl
slave_crash_before_commit
slave_reconnect_with_gtid_set_executed
slave_worker_ends_group_before_signal_lwm
stop_slave_dont_release_backup_lock
stop_slave_middle_group
stop_when_mts_in_group
undefined_algorithm_on_slave
uninitialized_master-info_structure
unrecognized_master_version
This is an internal change and does not change the API. Compatibility
is not an issue.
* Changed plugin library filenames:
semisync_slave.so
semisync_master.so
The old-named file remains and is deprecated, and the new-named file
is added. A deprecation warning is issued when loading the old-named
file.
* Changed plugin names:
rpl_semi_sync_slave
rpl_semi_sync_master
The old name exists only in the old-named file, and the new name
exists only in the new file. A deprecation warning is issued when
loading the old-named file.
* Changed system variables defined in the semisync plugins:
rpl_semi_sync_master_wait_for_slave_count
rpl_semi_sync_master_wait_no_slave
rpl_semi_sync_slave_enabled
rpl_semi_sync_slave_trace_level
rpl_semi_sync_master_wait_for_slave_count
rpl_semi_sync_master_wait_no_slave
rpl_semi_sync_master_enabled
rpl_semi_sync_master_timeout
rpl_semi_sync_master_trace_level
rpl_semi_sync_master_wait_point
The old name exists only in the old-named plugin, and the new name
exists only in the new-named plugin. A deprecation warning is issued
when loading the old-named plugin.
* Changed status variables defined in the semisync plugins:
Rpl_semi_sync_slave_enabled
Rpl_semi_sync_master_status
Rpl_semi_sync_master_clients
Rpl_semi_sync_master_yes_tx
Rpl_semi_sync_master_no_tx
Rpl_semi_sync_master_wait_sessions
Rpl_semi_sync_master_no_times
Rpl_semi_sync_master_timefunc_failures
Rpl_semi_sync_master_wait_pos_backtraverse
Rpl_semi_sync_master_tx_wait_time
Rpl_semi_sync_master_tx_waits
Rpl_semi_sync_master_tx_avg_wait_time
Rpl_semi_sync_master_net_wait_time
Rpl_semi_sync_master_net_waits
Rpl_semi_sync_master_net_avg_wait_time
The old name exists only in the old-named plugin, and the new name
exists only in the new-named plugin. A deprecation warning is issued
when loading the old-named plugin.
* Changed user variables recognized by dump threads:
(When replica connects to source, it sets some user variables on the
connection before issuing the COM_BINLOG_DUMP[_GTID] command.)
master_heartbeat_period
master_binlog_checksum
slave_uuid
rpl_semi_sync_slave
This is an internal change only and compatibility is not an isuse.
* Changed cloud configuration:
In internal/cloud/mysql-test/config/cloud.cnf, we use the new
library in the following line:
plugin-load-add="connection_control.so;semisync_master.so;thread_pool.so"
* Changed packaging definitions:
In all package definition files, we retain the existing semisync
libraries and add the new ones, so that they all get included in
packages.
* Changed help texts:
The help texts are too many to list here. Generally, we replace the
old terms by the new terms, and additionally rewrite the help texts
a bit where they can be improved. See the source patch for the full
list of changes.
DEPLOYMENT AND INSTALLATION
===========================
This adds two new files: semisync_source.so and semisync_replica.so.
They shall both be included in distributions. The existing
semisync_master.so and semisync_replica.so shall remain included in
distributions, too.
SECURITY
========
No security implications.
PROCEDURE TO MIGRATE APPLICATIONS TO NEW TERMINOLOGY
====================================================
If needed, we may publish the scripts that update the identifiers, to
aid in migration.
PROCEDURE TO MERGE UP FROM 5.7
==============================
After this worklog, patches written in 5.7 and merged to 8.0 may need
to rename identifiers. There are several cases:
1. New files, for example test, which use old identifiers. These can
be fixed by running a script after the merge.
2. Modified files, which add new lines that use old identifiers.
These can be fixed by running a script after the merge.
3. Modified files, which modify existing lines that use old
identifiers. These will generate merge conflicts. It seems hard
to use scripts to resolve the conflicts, so this will likely have
to be handled manually.
PROTOCOL
========
Existing behavior
-----------------
When an asynchronous replica connects to a source, it sets the
following user variables. These are user variables (not system
variables), which the dump thread interprets:
@master_heartbeat_period
@master_binlog_checksum
@slave_uuid
When a semi-synchronous replica connects, it checks if the source has
set the system variable @@global.rpl_semi_sync_source_enabled, and
also sets the user variable @rpl_semi_sync_slave, in addition to the
three user variables above.
New behavior
------------
We make the above logic more flexible, so that:
- For all the three user variables used in asynchronous replication,
the replica sets *both* the new-named variable and the old-named
variable when it connects.
- For the system variable checked in semi-synchronous replication, the
replica checks if *either* the new-named variable or the old-named
variable has been set.
- For the user variable set in semi-synchronous replication, the
replica sets *both* the new-named variable and the new-named
variable.
CROSS-VERSION REPLICATION
=========================
Asynchronous replication
------------------------
The changes in the protocol imply the following for *asynchronous*
cross-version replication. Here, OLD refers to a version before this
worklog. NEW refers to a version having this worklog. FUTURE refers
to a future version where the old terminology has been removed.
OLD->NEW: Works because NEW replica sets old-named variables.
NEW->OLD: Works because NEW source accepts old-named variables.
NEW->FUTURE: Works because NEW source accepts new-named variables.
FUTURE->NEW: Work because NEW replica sets new-named variables.
OLD->FUTURE: Unsupported. Does not work beacuse FUTURE sets only
new-named variables and OLD accepts only old-named variables.
FUTURE->OLD: Unsupported. Does not work beacuse FUTURE sets only
new-named variables and OLD accepts only old-named variables.
Semi-synchronous replication
----------------------------
The changes in the protocol, and the way we alias semisync libraries,
imply the following for *semi-synchronous* replication. In the
following, we assume all servers install a semisync library. On NEW,
there are two semisync libraries available, so we use NEW(old_semi) to
refer to a server having this worklog, on which the user has installed
the old-named semisync library, and we use NEW(new_semi) to refer to a
server having this worklog, on which the user has installed the
new-named semisync library. When a NEW server talks with an OLD
server, we require that NEW uses old_semi, and when NEW talks with
FUTURE, we requrie that NEW uses new_semi. The cases are as follows:
OLD->NEW(old_semi): Works because NEW(old_semi) recognizes old-named
system variable and sets new-named user variable.
OLD->NEW(new_semi): Unsupported: user should upgrade all servers
before using new_semi on NEW. Despite that, this works, because
NEW(new_semi) recognizes old-named system variable and sets
old-named user variable.
NEW(old_semi)->OLD: Works beacuse NEW(old_semi) exports old-named
system variable and recognizes old-named user variable.
NEW(new_semi)->OLD: Unsupported: user should upgrade all servers
before using new_semi. Does not work because OLD expects old-named
system variable rpl_semi_sync_source_enabled to be defined, which
NEW(new_semi) does not define.
NEW(old_semi)->NEW(new_semi): Works because NEW(new_semi) recognizes
old-named system variable and sets old-named user variable.
NEW(new_semi)->NEW(old_semi): Works because NEW(old_semi) recognizes
new-named system variable and sets new-named user variable.
NEW(old_semi)->FUTURE: Unsupported: user should enable new_semi before
upgrading to FUTURE. Does not work because FUTURE expects new-named
system variable, which NEW(old_semi) does not define.
NEW(new_semi)->FUTURE: Works because NEW(new_semi) defines new-named
system variables and accepts new-named user variables.
FUTURE->NEW(old_semi): Unsupported: user should enable new_semi before
upgrading to FUTURE. Despite that, this works because NEW(old_semi)
recognizes new system variable and sets new user variable.
FUTURE->NEW(new_semi): Works because NEW(new_semi) recognizes
new-named system variables and sets new-named user variables.
OLD->FUTURE: Unsupported (see asynchrounous replication case)
FUTURE->OLD: Unsupported (see asynchrounous replication case)
mysqlbinlog
-----------
When mysqlbinlog connects to a source server to receive binary logs,
it uses the same logic as an asynchronous replica. Thus, the same
cross-version compatibility constraints apply to the mysqlbinlog
connection as stated above for an asynchronous source-replica
connection.
mysqlbinlog prints one variable that is renamed in this worklog,
namely pseudo_slave_mode. In order for an old replica to process the
output from mysqlbinlog, in this worklog we retain the old variable
name in the output from mysqlbinlog. A possible future transition to
using only the new name is:
- OLD mysqlbinlog prints pseudo_slave_mode and recognizes only
pseudo_slave_mode.
- NEW mysqlbinlog prints pseudo_slave_mode and recognizes both
pseudo_slave_mode and pseudo_replica_mode.
- NEW+1 prints pseudo_replica_mode and recognizes both
pseudo_slave_mode and pseudo_replica_mode.
- NEW+2 prints pseudo_replica_mode and recognizes only
pseudo_replica_mode.
With this chain of changes, each version is able to interpret the
output both from a one version older mysqlbinlog and from a one
version newer mysqlbinlog.
APPLICATION COMPATIBILITY
=========================
Application changes required when upgrading from an older version to a
version having the feature:
- The changes in system variables, command-line options, status
variables, built-in SQL functions, and semisync plugins are fully
backward compatible, since we maintain the old names as aliases. An
application that uses them will work without change, but may observe
new deprecation warnings.
- The changes in peformance_schema instrumentation - thread names,
thread commands, locks, condition variables, thread stages, and
memory allocation - are incompatible. An application that depends
on the exact texts for these will have to be modified.
- The changes in C++ filenames, header guards, and debug symbols are
internal and not part of the user interface, so they do not count as
incompatible. However, future patches written in 5.7 will have to
deal with the renames while up-merging them.
Application changes required before upgrading from a version having
the feature to a future version where the old names are removed:
- The changes in system variables, command-line options, status
variables, built-in SQL functions, and semisync plugins require that
the user replaces the deprecated terminology by the new terminology
after upgrading to the version having the feature and before the
next upgrade.
Application changes on downgrade:
- An application that has upgraded to the version having the feature,
but not started to use the new names yet, can downgrade without
problem.
- An application that has upgraded to the version having the feature,
and started to adopt the new names in configuration files and SQL,
has to first revert to the old terminology before downgrading.
- An application that has upgraded to the version having the feature,
adopted the new names in configuration files and SQL, and upgraded
to the next version, can downgrade to the version where the feature
was introduced. From there, they can revert to the old terminology
and then downgrade to the version before the feature.
INTERNAL CODE CHANGES
=====================
We change other internal code identifiers when it is convenient, for
instance, when a C++ identifier matches a replacement pattern by
chance.
We implement this in several steps. We split the work in three sets
of patches:
1. Refactorings that simplify later steps, and scripts
======================================================
1.1.Various preparation steps
This contains miscelanneous preparation steps needed before the
automatic replacement:
- Eliminate multi-line string literals from the replication code, so
that string literals are easy to find by line-based search tools,
and so that the code formatting looks better. This was found by
searching for lines containing an odd number of double quotes. The
replacements were performed manually.
- Add a copyright header in a file that we are going to modify later,
so that git push won't complain. Since later steps are
auto-generated it's a bit easier to add the copyright header before
them than after them.
- Fix a command-line option that mixes dashes and
underscores (slave-preserve_commit-order), since the rename script
only searches for identifiers with only dashes or only underscores.
1.2.Fix mysqltest's escape function
* mysqltest's escape function should allow multiple escaped characters
mysqltest's escape function takes two arguments. The first one is a
character to escape and the second one is a string in which the
character will be escaped.
The usual use case for escape is to prepare a string for being used in
string context in an SQL statement. Therefore, both the quote
character (e.g. single quote) and the escape character (backslash)
need to be escaped. That requires two calls to escape, which is a bit
cumbersome.
Therefore, we extend the function to allow multiple escaped
characters. The reason we disallowed multiple escaped characters was
to allow any character including comma to be escaped, and still use
comma as a separator between the arguments. We make that work by
requiring that the user places any comma occurring among the escaped
characters first, and make the function look for the separator only
after the first character.
* Adapt test utilities to use the escape function
- assert.inc, eval.inc: These should have used 'escape' from the
beginning, so the caller wouldn't have to bother escaping strings.
Now we have too many tests using them and escaping strings, so
making it an option.
- escape_sql.inc: This was a workaround for not having proper 'escape'
function in the language. Removed it now.
- show_slave_status.inc: Updated it to use the escape function instead
of escape_sql.inc
1.3.Fix min/max values for sysvars with block_size!=1
Background:
System variables have a feature known as "block_size". Numeric system
variables can only be set to values that are multiples of block_size.
Most variables use a block size of 1. Numeric variables are
additionally limited to a maximum and a minimum value.
Problem:
In case the minimum and maximum values are not specified as multiples
of the block_size, the effective minimum and maximum are different
than the ones specified. This typically happens when using a
block_size that is a power of two, for instance 1024, and a maximum
that is a numeric limit such as MAXINT, which may have values such as
2^64-1, i.e., one-less than a multiple of the block_size.
This has no observable effect, other than the maximum value displayed
in performance_schema.system_variables_info being a value that is not
actually allowed to use for the variable.
This is a litte inconsistent, and also made it hard to write the
scripted tests in later steps of the worklog.
Also, the indentation was wrong all over Sys_var_integer.
Fix:
- Round the maximum down to the next smaller multiple of block_size.
- Round the minimum up to the next grater multiple of block_size.
- Fix the indentation.
1.4.Scripts
This contains the scripts used to execute the following steps. See
00README for an overview.
These scripts are only kept in the server branch during the
development of WL#14194. They will not be pushed to the main
repositories, but possibly published elsewhere in case it eases
migration for anyone.
2. Scripted replacements
========================
Perform all automated search-and-replace operations.
The following replacements are performed this way:
2.0. Replace "master" by "mistir" and "slave" by "slivi" in contexts
where we want to preserve the old terms. We replace this back
in the last search-and-replace operation. This hides it from
the other search-and-replace operations.
2.1. system variables
2.2. command-line options for mysqld
2.3. command-line options for mysqlbinlog
2.4. command-line options for mysqldump
2.5. command-line options for mysqladmin
2.6. SQL functions
2.7. status variables
2.8. thread commands
2.9. instrumented locks
2.10. instrumented condition variables
2.11. thread stages
2.12. thread names
2.13. instrumented memory allocations
2.13. C++ filenames
2.14. header guards in C++ header files
2.15. debug symbols
2.16. semisync
2.17. user variables used in the replication protocol handshake
2.99. Replace "mistir" by "master" and "slivi" by "slave"
Each of these categories is committed in a separate step.
This includes some C++ identifiers and mtr variables that contain the
replaced variables as substrings. This is only good.
It is necessary to rename filenames, since some .inc files in the test
suite contain e.g. system variable names in their names, so the place
where they are sourced will have their names changed.
3. Manual replacements, aliases, compatibility code, and tests
==============================================================
3.1.Fix tests
Fix test failures introduced by previous patch.
There were two tests that wrote variable names in alphabetic order to
their result files. So we re-record those result files.
3.2.Help texts
Remove the words "master/slave" from help texts for command line
options and system variables.
The search is automatic, finding occurrences of 'master' and 'slave'
within double-quoted strings, in sys_vars.cc mysqld.cc, and
semisync_*_plugin.cc (for server variables and command-line options),
and in mysqlbinlog.cc, mysqladmin.cc, mysqldump.cc (for client
command-line options).
However, the replacement is manual. Therefore we also clarify and
correct some texts. Since help texts rarely occur in the test suite,
this will not have too much unpredictable consequences: we just need
to update the result files for mysqld--help-[not]win.
We also fix some other texts occurring in these files, since it is
easier to do it now than to postpone it:
- Error messages in utilities. These usually don't occur in tests.
- Plugin description strings for the semisync plugins.
- Deprecation warning for --master-retry-count.
- Comments printed by mysqldump.
- Source code identifiers in mysqladmin.cc.
3.3.Aliases for command line options
For all renamed command-line options, we re-introduce the old name as
a deprecated alias. This includes command-line options in mysqladmin,
mysqlbinlog, mysqldump, and the server. For the server, it only
includes command-line options that are not defined through a system
variable.
3.4.Aliases for status variables
For all renamed status variables, we re-introduce the old name as an
alias. This does not include semisync status variables.
3.5.Aliases for semi-sync libraries and variables
* Server changes:
For the semisync libraries, we previously renamed both the filename,
the plugin name, the system variables defined in the libraries, and
the status variables defined in the libraries.
Now we create aliases for these as follows. We duplicate the
libraries so there exists one library having the old filename, the old
plugin name, the old-named system variables, and the old-named status
variables. We generate a deprecation warning only when the old
libraries are loaded, not when using the old-named variables.
Additionally, we generate an error when using the two duplicated
source-side libraries or the two duplicated replica-side libraries on
the same server.
* Package definition changes:
To make the packages aware of the new library, we update the following
files:
- mysql-test/include/plugin.defs
- packaging/**/*
* Test suite changes:
- Add a test utility to disable/restore binlogging in the current
session. Changed files:
- disable_binlog.inc
- restore_binlog.inc
- Add a test utility to use a JSON object as a key-value store and
lookup the value when using a mysqltest $variable as a key. New
file:
- json_lookup.inc
- Add test utilities to assert that some specific messages were
written to the error log.
New test utilities:
- save_error_log_position.inc: Store the current position in the log
in an internal variable.
- assert_error_log.inc: Assert that a given message (or sequence of
messages) was written to the log since the last saved position.
- show_error_log.inc: Show all messages generated since the last
saved position.
The above utilites need to respect the global error suppressions
defined in mtr_warnings.inc. To make use of that, we refactor
mtr_warnings.inc and related files. Changed files:
- check-warnings.test
- load_error_log.inc
- mtr_warnings.sql
A result file had to be updated, since the test printed all tables
in the mtr database to the result log, and we needed another one in
order to implement the utilities above:
- default_row_format_01.test
- Add test utility that simplifies the use of
mtr.add_suppression. This automates the suppression of messages on
all servers in a replication topology, and the disabling/re-enabling
of binary logging on the current session. Changed files:
- suppress_messages.inc
- Add test case for the feature: rpl_semi_sync_alias.
3.6.Cross-version-compatible connection user vars
When the replica connects to the source, it first connects, then sets
some user variables using regular SQL SET statements, and then starts
replication. We previously renamed some of those user variables.
Now we create aliases for those user variables in order to make
cross-version replication work, as follows:
- On the replica side, we set both the old-named variable and the
new-named variable.
- On the source side, we accept either the old-named variable or
the new-named variable.
3.7.Aliases for SQL functions
This creates the deprecated alias MASTER_POS_WAIT for the renamed SQL
function SOURCE_POS_WAIT.
3.8.Aliases for system variables
We previously renamed several system variables. Now we introduce a
framework for defining aliases for system variables, and define
deprecated aliases for all the renamed system variabes.
The framework consists of a subclass of Sys_var called
Sys_var_deprecated_alias. This class represents an alias for some
other Sys_var. It copies most member fields of that variable, so
setting one of the variables changes the value of both. We also make
it so that SET PERSIST writes the name of both variables.
When loading persisted variables, when either the alias or the real
name appears in the file, it loads both of them into the memory cache.
This ensures that both the real variable and the alias will be
persisted the next time the persisted variable file is written, which
ensures backward and forward compatibility in future upgrade/downgrade
scenarios.
In order to load the aliases while loading persisted variables, we
need to access the system variable framework (which contains the alias
definitions) while loading persisted variables. To do that, we have
to move the initialization of the system variable framework a bit
earlier - hence the change in mysqld.cc. This is only the
initialization of the framework, which makes it possible to access
metadata about the variable definitions; it is not the initialization
of system variable values. The system variable framework
initialization is self-contained and does not depend on other things,
so this change should not have any other side effects.
When using RESET PERSIST, we now reset both the variable and the
alias.
When handling command-line options, we make the old name generate a
deprecation warning. This is done in mysqld.cc:get_one_option.
We need changes to make the "variable_source" information accurate
when using an alias on the command line. (The variable_source is used
to populate columns of the performance_schema.variables_info table.)
When an alias is used on the command line, the command-line parsing
framework can only store the variable_source for the alias, since it
does not know that the alias is an alias. Therefore, we copy the
variable_source from the alias to the base variable from code that has
this information; namely, in mysqld.cc:get_one_option.
We remove the function clear_user_host_timestamp since it was unused,
and otherwise we would have to define it in Sys_var_alias.
We make sys_var::set_and_truncate return early if source and
destination are identical. Otherwise Valgrind complains. This happens
in the new call to sysvar->set_source_name from
mysqld.cc:mysqld_get_one_option.
3.9.Tests for system variable aliases
1. Test that the system variable aliases introduced in the previous
commit work as expected.
To make this less repetitive, introduce a framework to test system
variables using a declarative syntax. To make that framework
possible, we introduce another, lower-level framework, which
provides control flow based on JSON documents: in particular, it
allows test cases to iterate over JSON arrays, and unpack JSON
objects into a set of mtr variables. Relying on this JSON
framework, we can define properties of system variables using
JSON, and then iterate over all such definitions, unpack the
properties of the sysvars into mtr variables, and invoke the
higher-level framework to test the system variable.
The high-level framework is described in
mysql-test/suite/sys_vars/inc/control_for_sysvars_with_aliases.inc.
The JSON specifications are in
mysql-test/suite/sys_vars/inc/json_sysvar_specs.inc.
The JSON framework is in
mysql-test/include/create_json_iterator.inc,
mysql-test/include/create_json_unpacker.inc, and
mysql-test/include/create_unpacking_json_iterator.inc.
Persisted variables are tested in
mysql-test/suite/sys_vars/t/persisted_sysvars_with_aliases.inc
Also minor improvements in assert.inc and eval.inc.
Also added:
mysql-test/include/check_64bit_machine.inc,
mysql-test/include/check_64bit_ulong.inc,
mysql-test/include/have_32bit_ulong.inc, and
mysql-test/include/have_64bit_ulong.inc,
and updated:
mysql-test/include/have_32bit.inc and
mysql-test/include/have_64bit.inc
The new funcationliaty was necessary because some 64-bit windows
platforms use only 32 bits for ulong.
Also extended sys_vars.pseudo_replica_mode_basic. This is a
session variable, and therefore not covered by the new framework.
We could have written framework for session variables, but it's
too much work for just one variable.
2. Fix tests that broke when adding aliases:
binlog_nogtid.binlog_persist_only_variables:
- This test used wildcards like %master% and %slave% to select all
replication-related system variables from performance_schema
tables. The automatic replacements changed this to %source% and
%replica%, which made it match a few more variables, so the test
started to fail already in that step.
- After adding aliases, we need to make the match %master% and
%slave% again, in addition to %source% and %replica%, to include
all the aliases.
- We also need to modify the logic of the test when the test
executes RESET PERSIST. Before, it ran RESET PERSIST once for
each variable. However, when doing RESET PERSIST for a variable
having an alias, it will reset both the variable and the alias.
Then when the test issues RESET PERSIST for the alias, it has
already been reset and generates an error. Fixed by excluding
aliases from this part of the test.
persisted_variables_extended:
- This test used SET PERSIST replica_net_timeout and then
SELECT ... FROM performance_schema.persisted_variables ...
Therefore we update the result file to include the alias.
mysql-test/suite/binlog_nogtid/r/binlog_persist_variables.result
mysql-test/suite/binlog_nogtid/r/binlog_persist_variables.test
- This test counts the number of variales. Updated accordingly.
- The test lists replication variables, heuristically guessing
which variables are replication variables using a pattern.
Updated the pattern to include the aliases.
- Updated the result file to include the aliases and their
deprecation warnings
- The result file was auto-updated by the scripted renames.
It contains a list of variables in alphabetic order.
The rename broke the alphabetic order, so updated the
result file accordingly.
mysql-test/r/read_only_persisted_plugin_variables.result
mysql-test/r/read_only_persisted_variables.result
mysql-test/r/reset_persisted_variables.result
mysql-test/r/variables.result
mysql-test/suite/perfschema/r/persisted_variables.result
mysql-test/suite/perfschema/r/variables_info.result
mysql-test/suite/sys_vars/r/all_vars.result
mysql-test/t/all_persisted_variables.test
- These tests iterate over all variables, or some subset of
them, or assert that the number of variables is equal to some
constant. Updated result files to include the aliases.
mysql-test/r/mysqlcheck.result
mysql-test/r/partition_innodb_tablespace.result
mysql-test/suite/funcs_1/r/is_key_column_usage.result
mysql-test/suite/funcs_1/r/is_key_column_usage_ci.result
mysql-test/suite/funcs_1/r/is_statistics_ci.result
mysql-test/suite/funcs_1/r/is_statistics_cs.result
mysql-test/suite/funcs_1/r/is_table_constraints.result
mysql-test/suite/funcs_1/r/is_table_constraints_ci.result
mysql-test/suite/innodb/r/case_insensitive_fs.result
mysql-test/suite/innodb/r/choose_tbsp_location-discard.result
mysql-test/suite/innodb/r/create_tablespace.result
mysql-test/suite/innodb/r/create_tablespace_16k.result
mysql-test/suite/innodb/r/create_tablespace_32k.result
mysql-test/suite/innodb/r/create_tablespace_4k.result
mysql-test/suite/innodb/r/create_tablespace_64k.result
mysql-test/suite/innodb/r/create_tablespace_8k.result
mysql-test/suite/innodb/r/create_tablespace_debug.result
mysql-test/suite/innodb/r/create_tablespace_replication.result
mysql-test/suite/innodb/r/default_row_format.result
mysql-test/suite/innodb/r/default_row_format_compatibility.result
mysql-test/suite/innodb/r/default_row_format_tablespace.result
mysql-test/suite/innodb/r/discard_tablespace.result
mysql-test/suite/innodb/r/hidden_directory_dotfile.result
mysql-test/suite/innodb/r/hidden_directory_win.result
mysql-test/suite/innodb/r/innodb-index-online-fk.result
mysql-test/suite/innodb/r/innodb_tablespace.result
mysql-test/suite/innodb/r/known_dir_unique_undo.result
mysql-test/suite/innodb/r/known_directory.result
mysql-test/suite/innodb/r/partition_autoinc.result
mysql-test/suite/innodb/r/portability_tablespace.result
mysql-test/suite/innodb/r/rename_table.result
mysql-test/suite/innodb/r/tablespace_per_table.result
mysql-test/suite/innodb/r/unknown_directory.result
mysql-test/suite/innodb_fts/r/tablespace_location.result
mysql-test/suite/innodb_fts/r/tablespace_location_error.result
mysql-test/suite/innodb_zip/r/16k.result
mysql-test/suite/innodb_zip/r/4k.result
mysql-test/suite/innodb_zip/r/8k.result
mysql-test/suite/innodb_zip/r/restart.result
mysql-test/suite/innodb_zip/r/zip.result
mysql-test/suite/parts/r/partition_reorganize_innodb.result
- These tests count or list all tables defined. We added two
tables in the framework for assert_error_log.inc in step 3.5,
so updated the result file.
mysql-test/include/mysqld--help.inc
- This has a list of variables whose default is nondeterministic,
and one of the aliases had to be added there.
mysql-test/r/non_table_atomic_ddl.result
mysql-test/r/trigger_mdl.result
mysql-test/suite/binlog/r/binlog_truncate_kill.result
- The removal of begin_include_file.inc from filter_file.inc
also got rid of a 'connection ' printout from
the result log in tests using show_binlog_events.inc.
Updated result files.
3.10.Justify use of old term in mysqlbinlog
Make mysqlbinlog print a comment to clarify why we are still using the
old terminology.
Copyright (c) 2000, 2025, Oracle Corporation and/or its affiliates. All rights reserved.