Skip to content

Commit c7463f7

Browse files
author
Sven Sandberg
committed
WL#7083 step 6.2. GTID-violations: Make ENFORCE_GTID_CONSISTENCY backward compatible with bool.
Before WL#7083, ENFORCE_GTID_CONSISTENCY was a boolean. Now it is a three-valued variable. Normally a three-valued variable would be of type Sys_var_enum. However, Sys_var_enum is incompatible with boolean in the following ways: - When the variable is SELECT'ed, boolean shows a numeric value (0 or 1) whereas enum shows the textual alias. - Booleans have two textual aliases for each value (0=off=false, 1=on=true), whereas enum only allows one. - The command-line option for a boolean can be used without an argument: '--command-line-option' without '=VALUE', which has the meaning 'TRUE'. If an enum allows the argument to be optional, it takes the default value, which in our case is different from TRUE. In order to avoid breaking compatibility with this behavior, we introduce a new Sys_var class for enumeration-like variables that can have multiple aliases, are displayed as integers, and allow '--command-line-option' without '=VALUE' to have a different value than the default value. @sys_vars.h - Add new class Sys_var_int_with_aliases. - Make Sys_var_enforce_gtid_consistency derive from the new class. @sys_vars.cc - Make Sys_var_enforce_gtid_consistency derive from the new class.
1 parent ae750d6 commit c7463f7

File tree

7 files changed

+499
-17
lines changed

7 files changed

+499
-17
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
include/rpl_init.inc [topology=none]
2+
CALL mtr.add_suppression("option 'enforce-gtid-consistency': value '.*' was");
3+
==== No option: defaults to 0 ====
4+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
5+
@@GLOBAL.ENFORCE_GTID_CONSISTENCY
6+
OFF
7+
==== Option given without value: defaults to 1 ====
8+
include/rpl_restart_server.inc [server_number=1 parameters: --enforce-gtid-consistency]
9+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
10+
@@GLOBAL.ENFORCE_GTID_CONSISTENCY
11+
ON
12+
==== Option given with invalid values: defaults to 0 ====
13+
include/rpl_restart_server.inc [server_number=1 parameters: --enforce-gtid-consistency=]
14+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
15+
@@GLOBAL.ENFORCE_GTID_CONSISTENCY
16+
OFF
17+
include/rpl_restart_server.inc [server_number=1 parameters: --enforce-gtid-consistency=homersimpson]
18+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
19+
@@GLOBAL.ENFORCE_GTID_CONSISTENCY
20+
OFF
21+
include/rpl_restart_server.inc [server_number=1 parameters: --enforce-gtid-consistency=-1]
22+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
23+
@@GLOBAL.ENFORCE_GTID_CONSISTENCY
24+
OFF
25+
include/rpl_restart_server.inc [server_number=1 parameters: --enforce-gtid-consistency=3]
26+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
27+
@@GLOBAL.ENFORCE_GTID_CONSISTENCY
28+
OFF
29+
==== Option given with correct value, equal to 1 ====
30+
include/rpl_restart_server.inc [server_number=1 parameters: --enforce-gtid-consistency=1]
31+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
32+
@@GLOBAL.ENFORCE_GTID_CONSISTENCY
33+
ON
34+
include/rpl_restart_server.inc [server_number=1 parameters: --enforce-gtid-consistency=on]
35+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
36+
@@GLOBAL.ENFORCE_GTID_CONSISTENCY
37+
ON
38+
include/rpl_restart_server.inc [server_number=1 parameters: --enforce-gtid-consistency=true]
39+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
40+
@@GLOBAL.ENFORCE_GTID_CONSISTENCY
41+
ON
42+
==== Option given with correct value, equal to 2 ====
43+
include/rpl_restart_server.inc [server_number=1 parameters: --enforce-gtid-consistency=2]
44+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
45+
@@GLOBAL.ENFORCE_GTID_CONSISTENCY
46+
WARN
47+
include/rpl_restart_server.inc [server_number=1 parameters: --enforce-gtid-consistency=warn]
48+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
49+
@@GLOBAL.ENFORCE_GTID_CONSISTENCY
50+
WARN
51+
==== Option given with correct value, equal to 0 ====
52+
include/rpl_restart_server.inc [server_number=1 parameters: --enforce-gtid-consistency=0]
53+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
54+
@@GLOBAL.ENFORCE_GTID_CONSISTENCY
55+
OFF
56+
include/rpl_restart_server.inc [server_number=1 parameters: --enforce-gtid-consistency=off]
57+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
58+
@@GLOBAL.ENFORCE_GTID_CONSISTENCY
59+
OFF
60+
include/rpl_restart_server.inc [server_number=1 parameters: --enforce-gtid-consistency=false]
61+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
62+
@@GLOBAL.ENFORCE_GTID_CONSISTENCY
63+
OFF
64+
include/rpl_end.inc
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
# ==== Purpose ====
2+
#
3+
# Test that the command-line enforce-gtid-consistency accepts the
4+
# values it is supposed to accept. This is a special variable, hence
5+
# the elaborate testing. The variable was boolean in 5.6, but changed
6+
# in 5.7 into an enumeration. However, normal enumerations aren't
7+
# entirely compatible with booleans:
8+
#
9+
# - Boolean has two aliases per value: 0=off=false, 1=on=true, but
10+
# enum only allows one alias per value.
11+
#
12+
# - Boolean is displayed as an int, enum displays the alias.
13+
#
14+
# - Boolean allows command-line options without arguments, like
15+
# --enforce-gtid-consistency (without =ON), enum does not.
16+
#
17+
# To create a three-valued variable that has multiple aliases per
18+
# value, is displayed as an int, and can be used on the command line
19+
# without argument, we needed a bit of new code. So that's what we
20+
# test here.
21+
#
22+
# ==== Implementation ====
23+
#
24+
# Restart the server several times, specifying
25+
# enforce-gtid-consistency in different ways.
26+
#
27+
# ==== References ====
28+
#
29+
# WL#7083: GTIDs: set gtid_mode=ON online
30+
# - The third value for enforce-gtid-consistency was added in this worklog.
31+
32+
# No point in running combinations.
33+
--source include/have_binlog_format_statement.inc
34+
--source include/not_gtid_enabled.inc
35+
36+
# Restarts many times, and very unlikely to ever fail again.
37+
--source include/big_test.inc
38+
39+
--let $rpl_server_count= 1
40+
--let $rpl_topology= none
41+
--source include/rpl_init.inc
42+
43+
CALL mtr.add_suppression("option 'enforce-gtid-consistency': value '.*' was");
44+
45+
--echo ==== No option: defaults to 0 ====
46+
47+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
48+
49+
--echo ==== Option given without value: defaults to 1 ====
50+
51+
--let $rpl_server_parameters= --enforce-gtid-consistency
52+
--let $rpl_server_number= 1
53+
--source include/rpl_restart_server.inc
54+
55+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
56+
57+
--echo ==== Option given with invalid values: defaults to 0 ====
58+
59+
--let $rpl_server_parameters= --enforce-gtid-consistency=
60+
--source include/rpl_restart_server.inc
61+
62+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
63+
64+
--let $rpl_server_parameters= --enforce-gtid-consistency=homersimpson
65+
--source include/rpl_restart_server.inc
66+
67+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
68+
69+
--let $rpl_server_parameters= --enforce-gtid-consistency=-1
70+
--source include/rpl_restart_server.inc
71+
72+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
73+
74+
--let $rpl_server_parameters= --enforce-gtid-consistency=3
75+
--source include/rpl_restart_server.inc
76+
77+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
78+
79+
--echo ==== Option given with correct value, equal to 1 ====
80+
81+
--let $rpl_server_parameters= --enforce-gtid-consistency=1
82+
--source include/rpl_restart_server.inc
83+
84+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
85+
86+
--let $rpl_server_parameters= --enforce-gtid-consistency=on
87+
--source include/rpl_restart_server.inc
88+
89+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
90+
91+
--let $rpl_server_parameters= --enforce-gtid-consistency=true
92+
--source include/rpl_restart_server.inc
93+
94+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
95+
96+
--echo ==== Option given with correct value, equal to 2 ====
97+
98+
--let $rpl_server_parameters= --enforce-gtid-consistency=2
99+
--source include/rpl_restart_server.inc
100+
101+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
102+
103+
--let $rpl_server_parameters= --enforce-gtid-consistency=warn
104+
--source include/rpl_restart_server.inc
105+
106+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
107+
108+
--echo ==== Option given with correct value, equal to 0 ====
109+
110+
--let $rpl_server_parameters= --enforce-gtid-consistency=0
111+
--source include/rpl_restart_server.inc
112+
113+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
114+
115+
--let $rpl_server_parameters= --enforce-gtid-consistency=off
116+
--source include/rpl_restart_server.inc
117+
118+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
119+
120+
--let $rpl_server_parameters= --enforce-gtid-consistency=false
121+
--source include/rpl_restart_server.inc
122+
123+
SELECT @@GLOBAL.ENFORCE_GTID_CONSISTENCY;
124+
125+
--source include/rpl_end.inc

sql/mysqld.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7379,6 +7379,15 @@ mysqld_get_one_option(int optid,
73797379
case OPT_SHOW_OLD_TEMPORALS:
73807380
push_deprecated_warn_no_replacement(NULL, "show_old_temporals");
73817381
break;
7382+
case OPT_ENFORCE_GTID_CONSISTENCY:
7383+
{
7384+
const char *wrong_value=
7385+
fixup_enforce_gtid_consistency_command_line(argument);
7386+
if (wrong_value != NULL)
7387+
sql_print_warning("option 'enforce-gtid-consistency': value '%s' "
7388+
"was not recognized. Setting enforce-gtid-consistency "
7389+
"to OFF.", wrong_value);
7390+
}
73827391
}
73837392
return 0;
73847393
}

sql/mysqld.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ int init_common_variables();
9494
void my_init_signals();
9595
bool gtid_server_init();
9696
void gtid_server_cleanup();
97+
const char *fixup_enforce_gtid_consistency_command_line(char *value_arg);
9798

9899
extern "C" MYSQL_PLUGIN_IMPORT CHARSET_INFO *system_charset_info;
99100
extern MYSQL_PLUGIN_IMPORT CHARSET_INFO *files_charset_info ;
@@ -871,7 +872,8 @@ enum options_mysqld
871872
OPT_MDL_HASH_INSTANCES,
872873
OPT_SKIP_INNODB,
873874
OPT_AVOID_TEMPORAL_UPGRADE,
874-
OPT_SHOW_OLD_TEMPORALS
875+
OPT_SHOW_OLD_TEMPORALS,
876+
OPT_ENFORCE_GTID_CONSISTENCY
875877
};
876878

877879

sql/set_var.cc

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -255,12 +255,14 @@ uchar *sys_var::value_ptr(THD *thd, enum_var_type type, LEX_STRING *base)
255255

256256
bool sys_var::set_default(THD *thd, set_var* var)
257257
{
258+
DBUG_ENTER("sys_var::set_default");
258259
if (var->type == OPT_GLOBAL || scope() == GLOBAL)
259260
global_save_default(thd, var);
260261
else
261262
session_save_default(thd, var);
262263

263-
return check(thd, var) || update(thd, var);
264+
bool ret= check(thd, var) || update(thd, var);
265+
DBUG_RETURN(ret);
264266
}
265267

266268
void sys_var::do_deprecated_warning(THD *thd)
@@ -630,33 +632,35 @@ set_var::set_var(enum_var_type type_arg, sys_var *var_arg,
630632

631633
int set_var::check(THD *thd)
632634
{
635+
DBUG_ENTER("set_var::check");
633636
var->do_deprecated_warning(thd);
634637
if (var->is_readonly())
635638
{
636639
my_error(ER_INCORRECT_GLOBAL_LOCAL_VAR, MYF(0), var->name.str, "read only");
637-
return -1;
640+
DBUG_RETURN(-1);
638641
}
639642
if (var->check_type(type))
640643
{
641644
int err= type == OPT_GLOBAL ? ER_LOCAL_VARIABLE : ER_GLOBAL_VARIABLE;
642645
my_error(err, MYF(0), var->name.str);
643-
return -1;
646+
DBUG_RETURN(-1);
644647
}
645648
if ((type == OPT_GLOBAL && check_global_access(thd, SUPER_ACL)))
646-
return 1;
649+
DBUG_RETURN(1);
647650
/* value is a NULL pointer if we are using SET ... = DEFAULT */
648651
if (!value)
649-
return 0;
652+
DBUG_RETURN(0);
650653

651654
if ((!value->fixed &&
652655
value->fix_fields(thd, &value)) || value->check_cols(1))
653-
return -1;
656+
DBUG_RETURN(-1);
654657
if (var->check_update_type(value->result_type()))
655658
{
656659
my_error(ER_WRONG_TYPE_FOR_VAR, MYF(0), var->name.str);
657-
return -1;
660+
DBUG_RETURN(-1);
658661
}
659-
return var->check(thd, this) ? -1 : 0;
662+
int ret= var->check(thd, this) ? -1 : 0;
663+
DBUG_RETURN(ret);
660664
}
661665

662666

sql/sys_vars.cc

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4759,16 +4759,32 @@ static Sys_var_charptr Sys_ignore_db_dirs(
47594759
NO_CMD_LINE,
47604760
IN_FS_CHARSET, DEFAULT(0));
47614761

4762+
const Sys_var_multi_enum::ALIAS enforce_gtid_consistency_aliases[]=
4763+
{
4764+
{ "OFF", 0 },
4765+
{ "ON", 1 },
4766+
{ "WARN", 2 },
4767+
{ "FALSE", 0 },
4768+
{ "TRUE", 1 },
4769+
{ NULL, 0 }
4770+
};
47624771
static Sys_var_enforce_gtid_consistency Sys_enforce_gtid_consistency(
47634772
"enforce_gtid_consistency",
47644773
"Prevents execution of statements that would be impossible to log "
47654774
"in a transactionally safe manner. Currently, the disallowed "
47664775
"statements include CREATE TEMPORARY TABLE inside transactions, "
47674776
"all updates to non-transactional tables, and CREATE TABLE ... SELECT.",
4768-
GLOBAL_VAR(_gtid_consistency_mode), CMD_LINE(OPT_ARG),
4769-
gtid_consistency_mode_names,
4770-
DEFAULT(GTID_CONSISTENCY_MODE_OFF), NO_MUTEX_GUARD, NOT_IN_BINLOG,
4777+
GLOBAL_VAR(_gtid_consistency_mode),
4778+
CMD_LINE(OPT_ARG, OPT_ENFORCE_GTID_CONSISTENCY),
4779+
enforce_gtid_consistency_aliases, 3,
4780+
DEFAULT(3/*position of "FALSE" in enforce_gtid_consistency_aliases*/),
4781+
DEFAULT(GTID_CONSISTENCY_MODE_ON),
4782+
NO_MUTEX_GUARD, NOT_IN_BINLOG,
47714783
ON_CHECK(check_super_outside_trx_outside_sf_outside_sp));
4784+
const char *fixup_enforce_gtid_consistency_command_line(char *value_arg)
4785+
{
4786+
return Sys_enforce_gtid_consistency.fixup_command_line(value_arg);
4787+
}
47724788

47734789
static Sys_var_mybool Sys_binlog_gtid_simple_recovery(
47744790
"binlog_gtid_simple_recovery",

0 commit comments

Comments
 (0)