mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
cleanup: galera misc cleanups
also disable galera-specific output in mysql_tzinfo_to_sql, it'll be enabled later.
This commit is contained in:
parent
8596b70f96
commit
03ec3511a8
23 changed files with 149 additions and 284 deletions
|
@ -524,7 +524,16 @@ static int run_query(const char *query, DYNAMIC_STRING *ds_res,
|
||||||
File fd;
|
File fd;
|
||||||
char query_file_path[FN_REFLEN];
|
char query_file_path[FN_REFLEN];
|
||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
/* Note: wsrep_on=ON implicitly enables binary logging. */
|
/*
|
||||||
|
Strictly speaking, WITH_WSREP on the client only means that the
|
||||||
|
client was compiled with WSREP, it doesn't mean the server was,
|
||||||
|
so the server might not have WSREP_ON variable.
|
||||||
|
|
||||||
|
But mysql_upgrade is tightly bound to a specific server version
|
||||||
|
anyway - it was mysql_fix_privilege_tables_sql script embedded
|
||||||
|
into its binary - so even if it won't assume anything about server
|
||||||
|
wsrep-ness, it won't be any less server-dependend.
|
||||||
|
*/
|
||||||
const uchar sql_log_bin[]= "SET SQL_LOG_BIN=0, WSREP_ON=OFF;";
|
const uchar sql_log_bin[]= "SET SQL_LOG_BIN=0, WSREP_ON=OFF;";
|
||||||
#else
|
#else
|
||||||
const uchar sql_log_bin[]= "SET SQL_LOG_BIN=0;";
|
const uchar sql_log_bin[]= "SET SQL_LOG_BIN=0;";
|
||||||
|
|
|
@ -734,13 +734,8 @@ static int use_db(char *database)
|
||||||
/* Do not send commands to replication slaves. */
|
/* Do not send commands to replication slaves. */
|
||||||
static int disable_binlog()
|
static int disable_binlog()
|
||||||
{
|
{
|
||||||
#ifdef WITH_WSREP
|
mysql_query(sock, "SET WSREP_ON=0"); /* ignore the error, if any */
|
||||||
/* Additionally turn off @@wsrep_on to disable implicit binary logging. */
|
return run_query("SET SQL_LOG_BIN=0");
|
||||||
const char *stmt= "SET SQL_LOG_BIN=0, WSREP_ON=OFF";
|
|
||||||
#else
|
|
||||||
const char *stmt= "SET SQL_LOG_BIN=0";
|
|
||||||
#endif /* WITH_WSREP */
|
|
||||||
return run_query(stmt);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int handle_request_for_tables(char *tables, uint length)
|
static int handle_request_for_tables(char *tables, uint length)
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
#
|
#
|
||||||
# MDEV-5226 mysql_tzinfo_to_sql errors with tzdata 2013f and above
|
# MDEV-5226 mysql_tzinfo_to_sql errors with tzdata 2013f and above
|
||||||
#
|
#
|
||||||
SET SESSION wsrep_replicate_myisam=ON;
|
|
||||||
# Verbose run
|
# Verbose run
|
||||||
|
set @prep=if((select count(*) from information_schema.global_variables where variable_name='wsrep_on'), 'SET GLOBAL wsrep_replicate_myisam=?', 'do ?');
|
||||||
|
prepare set_wsrep_myisam from @prep;
|
||||||
|
set @toggle=1; execute set_wsrep_myisam using @toggle;
|
||||||
TRUNCATE TABLE time_zone;
|
TRUNCATE TABLE time_zone;
|
||||||
TRUNCATE TABLE time_zone_name;
|
TRUNCATE TABLE time_zone_name;
|
||||||
TRUNCATE TABLE time_zone_transition;
|
TRUNCATE TABLE time_zone_transition;
|
||||||
|
@ -26,7 +28,11 @@ Warning: Unable to load 'MYSQLTEST_VARDIR/zoneinfo/posix/ignored.tab' as time zo
|
||||||
Warning: Skipping directory 'MYSQLTEST_VARDIR/zoneinfo/posix/posix': to avoid infinite symlink recursion.
|
Warning: Skipping directory 'MYSQLTEST_VARDIR/zoneinfo/posix/posix': to avoid infinite symlink recursion.
|
||||||
ALTER TABLE time_zone_transition ORDER BY Time_zone_id, Transition_time;
|
ALTER TABLE time_zone_transition ORDER BY Time_zone_id, Transition_time;
|
||||||
ALTER TABLE time_zone_transition_type ORDER BY Time_zone_id, Transition_type_id;
|
ALTER TABLE time_zone_transition_type ORDER BY Time_zone_id, Transition_type_id;
|
||||||
|
set @toggle=0; execute set_wsrep_myisam using @toggle;
|
||||||
# Silent run
|
# Silent run
|
||||||
|
set @prep=if((select count(*) from information_schema.global_variables where variable_name='wsrep_on'), 'SET GLOBAL wsrep_replicate_myisam=?', 'do ?');
|
||||||
|
prepare set_wsrep_myisam from @prep;
|
||||||
|
set @toggle=1; execute set_wsrep_myisam using @toggle;
|
||||||
TRUNCATE TABLE time_zone;
|
TRUNCATE TABLE time_zone;
|
||||||
TRUNCATE TABLE time_zone_name;
|
TRUNCATE TABLE time_zone_name;
|
||||||
TRUNCATE TABLE time_zone_transition;
|
TRUNCATE TABLE time_zone_transition;
|
||||||
|
@ -47,17 +53,26 @@ INSERT INTO time_zone_transition_type (Time_zone_id, Transition_type_id, Offset,
|
||||||
Warning: Unable to load 'MYSQLTEST_VARDIR/zoneinfo/posix/garbage' as time zone. Skipping it.
|
Warning: Unable to load 'MYSQLTEST_VARDIR/zoneinfo/posix/garbage' as time zone. Skipping it.
|
||||||
ALTER TABLE time_zone_transition ORDER BY Time_zone_id, Transition_time;
|
ALTER TABLE time_zone_transition ORDER BY Time_zone_id, Transition_time;
|
||||||
ALTER TABLE time_zone_transition_type ORDER BY Time_zone_id, Transition_type_id;
|
ALTER TABLE time_zone_transition_type ORDER BY Time_zone_id, Transition_type_id;
|
||||||
|
set @toggle=0; execute set_wsrep_myisam using @toggle;
|
||||||
#
|
#
|
||||||
# Testing with explicit timezonefile
|
# Testing with explicit timezonefile
|
||||||
#
|
#
|
||||||
|
set @prep=if((select count(*) from information_schema.global_variables where variable_name='wsrep_on'), 'SET GLOBAL wsrep_replicate_myisam=?', 'do ?');
|
||||||
|
prepare set_wsrep_myisam from @prep;
|
||||||
|
set @toggle=1; execute set_wsrep_myisam using @toggle;
|
||||||
INSERT INTO time_zone (Use_leap_seconds) VALUES ('N');
|
INSERT INTO time_zone (Use_leap_seconds) VALUES ('N');
|
||||||
SET @time_zone_id= LAST_INSERT_ID();
|
SET @time_zone_id= LAST_INSERT_ID();
|
||||||
INSERT INTO time_zone_name (Name, Time_zone_id) VALUES ('XXX', @time_zone_id);
|
INSERT INTO time_zone_name (Name, Time_zone_id) VALUES ('XXX', @time_zone_id);
|
||||||
INSERT INTO time_zone_transition_type (Time_zone_id, Transition_type_id, Offset, Is_DST, Abbreviation) VALUES
|
INSERT INTO time_zone_transition_type (Time_zone_id, Transition_type_id, Offset, Is_DST, Abbreviation) VALUES
|
||||||
(@time_zone_id, 0, 0, 0, 'GMT')
|
(@time_zone_id, 0, 0, 0, 'GMT')
|
||||||
;
|
;
|
||||||
|
set @toggle=0; execute set_wsrep_myisam using @toggle;
|
||||||
#
|
#
|
||||||
# Testing --leap
|
# Testing --leap
|
||||||
#
|
#
|
||||||
|
set @prep=if((select count(*) from information_schema.global_variables where variable_name='wsrep_on'), 'SET GLOBAL wsrep_replicate_myisam=?', 'do ?');
|
||||||
|
prepare set_wsrep_myisam from @prep;
|
||||||
|
set @toggle=1; execute set_wsrep_myisam using @toggle;
|
||||||
TRUNCATE TABLE time_zone_leap_second;
|
TRUNCATE TABLE time_zone_leap_second;
|
||||||
ALTER TABLE time_zone_leap_second ORDER BY Transition_time;
|
ALTER TABLE time_zone_leap_second ORDER BY Transition_time;
|
||||||
|
set @toggle=0; execute set_wsrep_myisam using @toggle;
|
||||||
|
|
|
@ -1,70 +0,0 @@
|
||||||
#
|
|
||||||
# MDEV-5226 mysql_tzinfo_to_sql errors with tzdata 2013f and above
|
|
||||||
#
|
|
||||||
# Verbose run
|
|
||||||
SET GLOBAL wsrep_replicate_myisam= ON;
|
|
||||||
TRUNCATE TABLE time_zone;
|
|
||||||
TRUNCATE TABLE time_zone_name;
|
|
||||||
TRUNCATE TABLE time_zone_transition;
|
|
||||||
TRUNCATE TABLE time_zone_transition_type;
|
|
||||||
INSERT INTO time_zone (Use_leap_seconds) VALUES ('N');
|
|
||||||
SET @time_zone_id= LAST_INSERT_ID();
|
|
||||||
INSERT INTO time_zone_name (Name, Time_zone_id) VALUES ('GMT', @time_zone_id);
|
|
||||||
INSERT INTO time_zone_transition_type (Time_zone_id, Transition_type_id, Offset, Is_DST, Abbreviation) VALUES
|
|
||||||
(@time_zone_id, 0, 0, 0, 'GMT')
|
|
||||||
;
|
|
||||||
Warning: Unable to load 'MYSQLTEST_VARDIR/zoneinfo/garbage' as time zone. Skipping it.
|
|
||||||
Warning: Unable to load 'MYSQLTEST_VARDIR/zoneinfo/ignored.tab' as time zone. Skipping it.
|
|
||||||
INSERT INTO time_zone (Use_leap_seconds) VALUES ('N');
|
|
||||||
SET @time_zone_id= LAST_INSERT_ID();
|
|
||||||
INSERT INTO time_zone_name (Name, Time_zone_id) VALUES ('posix/GMT', @time_zone_id);
|
|
||||||
INSERT INTO time_zone_transition_type (Time_zone_id, Transition_type_id, Offset, Is_DST, Abbreviation) VALUES
|
|
||||||
(@time_zone_id, 0, 0, 0, 'GMT')
|
|
||||||
;
|
|
||||||
Warning: Unable to load 'MYSQLTEST_VARDIR/zoneinfo/posix/garbage' as time zone. Skipping it.
|
|
||||||
Warning: Unable to load 'MYSQLTEST_VARDIR/zoneinfo/posix/ignored.tab' as time zone. Skipping it.
|
|
||||||
Warning: Skipping directory 'MYSQLTEST_VARDIR/zoneinfo/posix/posix': to avoid infinite symlink recursion.
|
|
||||||
ALTER TABLE time_zone_transition ORDER BY Time_zone_id, Transition_time;
|
|
||||||
ALTER TABLE time_zone_transition_type ORDER BY Time_zone_id, Transition_type_id;
|
|
||||||
SET GLOBAL wsrep_replicate_myisam= OFF;
|
|
||||||
# Silent run
|
|
||||||
SET GLOBAL wsrep_replicate_myisam= ON;
|
|
||||||
TRUNCATE TABLE time_zone;
|
|
||||||
TRUNCATE TABLE time_zone_name;
|
|
||||||
TRUNCATE TABLE time_zone_transition;
|
|
||||||
TRUNCATE TABLE time_zone_transition_type;
|
|
||||||
INSERT INTO time_zone (Use_leap_seconds) VALUES ('N');
|
|
||||||
SET @time_zone_id= LAST_INSERT_ID();
|
|
||||||
INSERT INTO time_zone_name (Name, Time_zone_id) VALUES ('GMT', @time_zone_id);
|
|
||||||
INSERT INTO time_zone_transition_type (Time_zone_id, Transition_type_id, Offset, Is_DST, Abbreviation) VALUES
|
|
||||||
(@time_zone_id, 0, 0, 0, 'GMT')
|
|
||||||
;
|
|
||||||
Warning: Unable to load 'MYSQLTEST_VARDIR/zoneinfo/garbage' as time zone. Skipping it.
|
|
||||||
INSERT INTO time_zone (Use_leap_seconds) VALUES ('N');
|
|
||||||
SET @time_zone_id= LAST_INSERT_ID();
|
|
||||||
INSERT INTO time_zone_name (Name, Time_zone_id) VALUES ('posix/GMT', @time_zone_id);
|
|
||||||
INSERT INTO time_zone_transition_type (Time_zone_id, Transition_type_id, Offset, Is_DST, Abbreviation) VALUES
|
|
||||||
(@time_zone_id, 0, 0, 0, 'GMT')
|
|
||||||
;
|
|
||||||
Warning: Unable to load 'MYSQLTEST_VARDIR/zoneinfo/posix/garbage' as time zone. Skipping it.
|
|
||||||
ALTER TABLE time_zone_transition ORDER BY Time_zone_id, Transition_time;
|
|
||||||
ALTER TABLE time_zone_transition_type ORDER BY Time_zone_id, Transition_type_id;
|
|
||||||
SET GLOBAL wsrep_replicate_myisam= OFF;
|
|
||||||
#
|
|
||||||
# Testing with explicit timezonefile
|
|
||||||
#
|
|
||||||
SET GLOBAL wsrep_replicate_myisam= ON;
|
|
||||||
INSERT INTO time_zone (Use_leap_seconds) VALUES ('N');
|
|
||||||
SET @time_zone_id= LAST_INSERT_ID();
|
|
||||||
INSERT INTO time_zone_name (Name, Time_zone_id) VALUES ('XXX', @time_zone_id);
|
|
||||||
INSERT INTO time_zone_transition_type (Time_zone_id, Transition_type_id, Offset, Is_DST, Abbreviation) VALUES
|
|
||||||
(@time_zone_id, 0, 0, 0, 'GMT')
|
|
||||||
;
|
|
||||||
SET GLOBAL wsrep_replicate_myisam= OFF;
|
|
||||||
#
|
|
||||||
# Testing --leap
|
|
||||||
#
|
|
||||||
SET GLOBAL wsrep_replicate_myisam= ON;
|
|
||||||
TRUNCATE TABLE time_zone_leap_second;
|
|
||||||
ALTER TABLE time_zone_leap_second ORDER BY Transition_time;
|
|
||||||
SET GLOBAL wsrep_replicate_myisam= OFF;
|
|
|
@ -16,9 +16,11 @@ return "No wsrep provider library" unless -f $provider;
|
||||||
|
|
||||||
$ENV{WSREP_PROVIDER} = $provider;
|
$ENV{WSREP_PROVIDER} = $provider;
|
||||||
|
|
||||||
my ($path) = grep { -f "$_/wsrep_sst_rsync"; } "$::bindir/scripts", $::path_client_bindir;
|
my ($spath) = grep { -f "$_/wsrep_sst_rsync"; } "$::bindir/scripts", $::path_client_bindir;
|
||||||
|
return "No SST scripts" unless $spath;
|
||||||
|
|
||||||
return "No SST scripts" unless $path;
|
my ($epath) = grep { -f "$_/my_print_defaults"; } "$::bindir/extra", $::path_client_bindir;
|
||||||
|
return "No my_print_defaults" unless $epath;
|
||||||
|
|
||||||
push @::global_suppressions,
|
push @::global_suppressions,
|
||||||
(
|
(
|
||||||
|
@ -32,7 +34,8 @@ push @::global_suppressions,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
$ENV{PATH}="$path:$ENV{PATH}";
|
$ENV{PATH}="$epath:$ENV{PATH}";
|
||||||
|
$ENV{PATH}="$spath:$ENV{PATH}" unless $epath eq $spath;
|
||||||
|
|
||||||
bless { };
|
bless { };
|
||||||
|
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
--source include/have_wsrep.inc
|
|
||||||
--source include/have_symlink.inc
|
|
||||||
--source include/not_windows.inc
|
|
||||||
--source include/have_innodb.inc
|
|
||||||
|
|
||||||
--echo #
|
|
||||||
--echo # MDEV-5226 mysql_tzinfo_to_sql errors with tzdata 2013f and above
|
|
||||||
--echo #
|
|
||||||
|
|
||||||
--exec mkdir $MYSQLTEST_VARDIR/zoneinfo
|
|
||||||
--exec ln -s $MYSQLTEST_VARDIR/zoneinfo $MYSQLTEST_VARDIR/zoneinfo/posix
|
|
||||||
--copy_file std_data/zoneinfo/GMT $MYSQLTEST_VARDIR/zoneinfo/GMT
|
|
||||||
--copy_file std_data/words.dat $MYSQLTEST_VARDIR/zoneinfo/garbage
|
|
||||||
--copy_file std_data/words.dat $MYSQLTEST_VARDIR/zoneinfo/ignored.tab
|
|
||||||
|
|
||||||
--echo # Verbose run
|
|
||||||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
|
||||||
--exec $MYSQL_TZINFO_TO_SQL --verbose $MYSQLTEST_VARDIR/zoneinfo 2>&1
|
|
||||||
|
|
||||||
--echo # Silent run
|
|
||||||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
|
||||||
--exec $MYSQL_TZINFO_TO_SQL $MYSQLTEST_VARDIR/zoneinfo 2>&1
|
|
||||||
|
|
||||||
--echo #
|
|
||||||
--echo # Testing with explicit timezonefile
|
|
||||||
--echo #
|
|
||||||
|
|
||||||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
|
||||||
--exec $MYSQL_TZINFO_TO_SQL $MYSQLTEST_VARDIR/zoneinfo/GMT XXX 2>&1
|
|
||||||
|
|
||||||
--echo #
|
|
||||||
--echo # Testing --leap
|
|
||||||
--echo #
|
|
||||||
|
|
||||||
--exec $MYSQL_TZINFO_TO_SQL --leap $MYSQLTEST_VARDIR/zoneinfo/GMT 2>&1
|
|
||||||
|
|
||||||
#
|
|
||||||
# Cleanup
|
|
||||||
#
|
|
||||||
|
|
||||||
--exec rm -rf $MYSQLTEST_VARDIR/zoneinfo
|
|
|
@ -1,11 +1,5 @@
|
||||||
--source include/have_symlink.inc
|
--source include/have_symlink.inc
|
||||||
--source include/not_windows.inc
|
--source include/not_windows.inc
|
||||||
--source include/not_wsrep.inc
|
|
||||||
|
|
||||||
# Note: The output of mysql_tzinfo_to_sql is different if server is compiled
|
|
||||||
# with wsrep. Hence a copy of this test has been placed under wsrep suite with
|
|
||||||
# the updated result. (lp:1161432)
|
|
||||||
--source include/not_wsrep.inc
|
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # MDEV-5226 mysql_tzinfo_to_sql errors with tzdata 2013f and above
|
--echo # MDEV-5226 mysql_tzinfo_to_sql errors with tzdata 2013f and above
|
||||||
|
|
|
@ -68,10 +68,6 @@ uint my_large_page_size= 0;
|
||||||
int volatile my_have_got_alarm=0; /* declare variable to reset */
|
int volatile my_have_got_alarm=0; /* declare variable to reset */
|
||||||
ulong my_time_to_wait_for_lock=2; /* In seconds */
|
ulong my_time_to_wait_for_lock=2; /* In seconds */
|
||||||
|
|
||||||
#ifdef WITH_WSREP
|
|
||||||
my_bool mysys_wsrep= 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* from errors.c */
|
/* from errors.c */
|
||||||
#ifdef SHARED_LIBRARY
|
#ifdef SHARED_LIBRARY
|
||||||
const char *globerrs[GLOBERRS]; /* my_error_messages is here */
|
const char *globerrs[GLOBERRS]; /* my_error_messages is here */
|
||||||
|
|
|
@ -62,8 +62,6 @@ extern mysql_mutex_t THR_LOCK_malloc, THR_LOCK_open, THR_LOCK_keycache;
|
||||||
extern mysql_mutex_t THR_LOCK_lock, THR_LOCK_net;
|
extern mysql_mutex_t THR_LOCK_lock, THR_LOCK_net;
|
||||||
extern mysql_mutex_t THR_LOCK_charset;
|
extern mysql_mutex_t THR_LOCK_charset;
|
||||||
|
|
||||||
extern my_bool mysys_wsrep;
|
|
||||||
|
|
||||||
#include <mysql/psi/mysql_file.h>
|
#include <mysql/psi/mysql_file.h>
|
||||||
|
|
||||||
#ifdef HAVE_PSI_INTERFACE
|
#ifdef HAVE_PSI_INTERFACE
|
||||||
|
|
|
@ -688,7 +688,7 @@ wsrep_break_lock(
|
||||||
THR_LOCK_DATA *data, struct st_lock_list *lock_queue1,
|
THR_LOCK_DATA *data, struct st_lock_list *lock_queue1,
|
||||||
struct st_lock_list *wait_queue)
|
struct st_lock_list *wait_queue)
|
||||||
{
|
{
|
||||||
if (wsrep_on(data->owner->mysql_thd) &&
|
if (wsrep_on && wsrep_on(data->owner->mysql_thd) &&
|
||||||
wsrep_thd_is_brute_force &&
|
wsrep_thd_is_brute_force &&
|
||||||
wsrep_thd_is_brute_force(data->owner->mysql_thd, TRUE))
|
wsrep_thd_is_brute_force(data->owner->mysql_thd, TRUE))
|
||||||
{
|
{
|
||||||
|
@ -858,7 +858,7 @@ thr_lock(THR_LOCK_DATA *data, THR_LOCK_INFO *owner, ulong lock_wait_timeout)
|
||||||
In the latter case we should yield the lock to the writer.
|
In the latter case we should yield the lock to the writer.
|
||||||
*/
|
*/
|
||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
if (mysys_wsrep && wsrep_break_lock(data, &lock->write, &lock->read_wait))
|
if (wsrep_break_lock(data, &lock->write, &lock->read_wait))
|
||||||
{
|
{
|
||||||
wsrep_lock_inserted= TRUE;
|
wsrep_lock_inserted= TRUE;
|
||||||
}
|
}
|
||||||
|
@ -1006,7 +1006,7 @@ thr_lock(THR_LOCK_DATA *data, THR_LOCK_INFO *owner, ulong lock_wait_timeout)
|
||||||
lock->read.data->owner->thread_id, data->type));
|
lock->read.data->owner->thread_id, data->type));
|
||||||
}
|
}
|
||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
if (mysys_wsrep && wsrep_break_lock(data, &lock->write, &lock->write_wait))
|
if (wsrep_break_lock(data, &lock->write, &lock->write_wait))
|
||||||
{
|
{
|
||||||
wsrep_lock_inserted= TRUE;
|
wsrep_lock_inserted= TRUE;
|
||||||
}
|
}
|
||||||
|
@ -1016,7 +1016,7 @@ thr_lock(THR_LOCK_DATA *data, THR_LOCK_INFO *owner, ulong lock_wait_timeout)
|
||||||
}
|
}
|
||||||
/* Can't get lock yet; Wait for it */
|
/* Can't get lock yet; Wait for it */
|
||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
if (mysys_wsrep && wsrep_lock_inserted && wsrep_on(data->owner->mysql_thd))
|
if (wsrep_lock_inserted && wsrep_on(data->owner->mysql_thd))
|
||||||
DBUG_RETURN(wait_for_lock(wait_queue, data, 1, lock_wait_timeout));
|
DBUG_RETURN(wait_for_lock(wait_queue, data, 1, lock_wait_timeout));
|
||||||
#endif
|
#endif
|
||||||
result= wait_for_lock(wait_queue, data, 0, lock_wait_timeout);
|
result= wait_for_lock(wait_queue, data, 0, lock_wait_timeout);
|
||||||
|
|
|
@ -564,7 +564,8 @@ Event_parse_data::init_definer(THD *thd)
|
||||||
void Event_parse_data::check_originator_id(THD *thd)
|
void Event_parse_data::check_originator_id(THD *thd)
|
||||||
{
|
{
|
||||||
/* Disable replicated events on slave. */
|
/* Disable replicated events on slave. */
|
||||||
if ((thd->system_thread == SYSTEM_THREAD_SLAVE_SQL) ||
|
if (IF_WSREP(WSREP(thd) && thd->wsrep_applier, 0) ||
|
||||||
|
(thd->system_thread == SYSTEM_THREAD_SLAVE_SQL) ||
|
||||||
(thd->system_thread == SYSTEM_THREAD_SLAVE_IO))
|
(thd->system_thread == SYSTEM_THREAD_SLAVE_IO))
|
||||||
{
|
{
|
||||||
DBUG_PRINT("info", ("Invoked object status set to SLAVESIDE_DISABLED."));
|
DBUG_PRINT("info", ("Invoked object status set to SLAVESIDE_DISABLED."));
|
||||||
|
|
|
@ -1130,23 +1130,6 @@ Events::load_events_from_db(THD *thd)
|
||||||
delete et;
|
delete et;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
#ifdef WITH_WSREP
|
|
||||||
/*
|
|
||||||
When SST from master node who initials event, the event status is ENABLED
|
|
||||||
this is problematic because there are two nodes with same events and
|
|
||||||
both enabled.
|
|
||||||
*/
|
|
||||||
if (WSREP(thd) && et->originator != thd->variables.server_id)
|
|
||||||
{
|
|
||||||
store_record(table, record[1]);
|
|
||||||
table->field[ET_FIELD_STATUS]->
|
|
||||||
store((longlong) Event_parse_data::SLAVESIDE_DISABLED,
|
|
||||||
TRUE);
|
|
||||||
(void) table->file->ha_update_row(table->record[1], table->record[0]);
|
|
||||||
delete et;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/**
|
/**
|
||||||
Since the Event_queue_element object could be deleted inside
|
Since the Event_queue_element object could be deleted inside
|
||||||
Event_queue::create_event we should save the value of dropped flag
|
Event_queue::create_event we should save the value of dropped flag
|
||||||
|
|
|
@ -1144,6 +1144,25 @@ void trans_register_ha(THD *thd, bool all, handlerton *ht_arg)
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int prepare_or_error(handlerton *ht, THD *thd, bool all)
|
||||||
|
{
|
||||||
|
int err= ht->prepare(ht, thd, all);
|
||||||
|
status_var_increment(thd->status_var.ha_prepare_count);
|
||||||
|
if (err)
|
||||||
|
{
|
||||||
|
/* avoid sending error, if we're going to replay the transaction */
|
||||||
|
#ifdef WITH_WSREP
|
||||||
|
if (ht == wsrep_hton &&
|
||||||
|
err != WSREP_TRX_SIZE_EXCEEDED &&
|
||||||
|
thd->wsrep_conflict_state != MUST_REPLAY)
|
||||||
|
#endif
|
||||||
|
my_error(ER_ERROR_DURING_COMMIT, MYF(0), err);
|
||||||
|
}
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@retval
|
@retval
|
||||||
0 ok
|
0 ok
|
||||||
|
@ -1161,32 +1180,14 @@ int ha_prepare(THD *thd)
|
||||||
{
|
{
|
||||||
for (; ha_info; ha_info= ha_info->next())
|
for (; ha_info; ha_info= ha_info->next())
|
||||||
{
|
{
|
||||||
int err;
|
|
||||||
handlerton *ht= ha_info->ht();
|
handlerton *ht= ha_info->ht();
|
||||||
status_var_increment(thd->status_var.ha_prepare_count);
|
|
||||||
if (ht->prepare)
|
if (ht->prepare)
|
||||||
{
|
{
|
||||||
if ((err= ht->prepare(ht, thd, all)))
|
if (prepare_or_error(ht, thd, all))
|
||||||
{
|
{
|
||||||
#ifdef WITH_WSREP
|
ha_rollback_trans(thd, all);
|
||||||
if (ht == wsrep_hton)
|
error=1;
|
||||||
{
|
break;
|
||||||
error= 1;
|
|
||||||
/* avoid sending error, if we need to replay */
|
|
||||||
if (thd->wsrep_conflict_state!= MUST_REPLAY)
|
|
||||||
{
|
|
||||||
my_error(ER_LOCK_DEADLOCK, MYF(0), err);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
/* not wsrep hton, bail to native mysql behavior */
|
|
||||||
my_error(ER_ERROR_DURING_COMMIT, MYF(0), err);
|
|
||||||
ha_rollback_trans(thd, all);
|
|
||||||
error=1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1417,7 +1418,6 @@ int ha_commit_trans(THD *thd, bool all)
|
||||||
|
|
||||||
for (Ha_trx_info *hi= ha_info; hi; hi= hi->next())
|
for (Ha_trx_info *hi= ha_info; hi; hi= hi->next())
|
||||||
{
|
{
|
||||||
int err;
|
|
||||||
handlerton *ht= hi->ht();
|
handlerton *ht= hi->ht();
|
||||||
/*
|
/*
|
||||||
Do not call two-phase commit if this particular
|
Do not call two-phase commit if this particular
|
||||||
|
@ -1430,32 +1430,9 @@ int ha_commit_trans(THD *thd, bool all)
|
||||||
Sic: we know that prepare() is not NULL since otherwise
|
Sic: we know that prepare() is not NULL since otherwise
|
||||||
trans->no_2pc would have been set.
|
trans->no_2pc would have been set.
|
||||||
*/
|
*/
|
||||||
err= ht->prepare(ht, thd, all);
|
if (prepare_or_error(ht, thd, all))
|
||||||
status_var_increment(thd->status_var.ha_prepare_count);
|
|
||||||
if (err)
|
|
||||||
{
|
|
||||||
#ifdef WITH_WSREP
|
|
||||||
if (ht == wsrep_hton)
|
|
||||||
{
|
|
||||||
switch (err) {
|
|
||||||
case WSREP_TRX_SIZE_EXCEEDED:
|
|
||||||
/* give user size exeeded error from wsrep_api.h */
|
|
||||||
my_error(ER_ERROR_DURING_COMMIT, MYF(0), WSREP_SIZE_EXCEEDED);
|
|
||||||
break;
|
|
||||||
case WSREP_TRX_CERT_FAIL:
|
|
||||||
case WSREP_TRX_ERROR:
|
|
||||||
/* avoid sending error, if we need to replay */
|
|
||||||
if (thd->wsrep_conflict_state!= MUST_REPLAY)
|
|
||||||
{
|
|
||||||
my_error(ER_LOCK_DEADLOCK, MYF(0), err);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
#endif /* WITH_WSREP */
|
|
||||||
my_error(ER_ERROR_DURING_COMMIT, MYF(0), err);
|
|
||||||
goto err;
|
goto err;
|
||||||
}
|
|
||||||
need_prepare_ordered|= (ht->prepare_ordered != NULL);
|
need_prepare_ordered|= (ht->prepare_ordered != NULL);
|
||||||
need_commit_ordered|= (ht->commit_ordered != NULL);
|
need_commit_ordered|= (ht->commit_ordered != NULL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2230,8 +2230,7 @@ static int binlog_savepoint_rollback(handlerton *hton, THD *thd, void *sv)
|
||||||
DBUG_RETURN(mysql_bin_log.write(&qinfo));
|
DBUG_RETURN(mysql_bin_log.write(&qinfo));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!wsrep_emulate_bin_log)
|
binlog_trans_log_truncate(thd, *(my_off_t*)sv);
|
||||||
binlog_trans_log_truncate(thd, *(my_off_t*)sv);
|
|
||||||
|
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4368,7 +4368,7 @@ pthread_handler_t handle_slave_sql(void *arg)
|
||||||
my_off_t saved_skip= 0;
|
my_off_t saved_skip= 0;
|
||||||
Master_info *mi= ((Master_info*)arg);
|
Master_info *mi= ((Master_info*)arg);
|
||||||
Relay_log_info* rli = &mi->rli;
|
Relay_log_info* rli = &mi->rli;
|
||||||
my_bool wsrep_node_dropped= FALSE;
|
my_bool wsrep_node_dropped __attribute__((unused)) = FALSE;
|
||||||
const char *errmsg;
|
const char *errmsg;
|
||||||
rpl_group_info *serial_rgi;
|
rpl_group_info *serial_rgi;
|
||||||
rpl_sql_thread_info sql_info(mi->rpl_filter);
|
rpl_sql_thread_info sql_info(mi->rpl_filter);
|
||||||
|
@ -4379,9 +4379,6 @@ pthread_handler_t handle_slave_sql(void *arg)
|
||||||
|
|
||||||
wsrep_restart_point:
|
wsrep_restart_point:
|
||||||
|
|
||||||
LINT_INIT(saved_master_log_pos);
|
|
||||||
LINT_INIT(saved_log_pos);
|
|
||||||
|
|
||||||
serial_rgi= new rpl_group_info(rli);
|
serial_rgi= new rpl_group_info(rli);
|
||||||
thd = new THD; // note that contructor of THD uses DBUG_ !
|
thd = new THD; // note that contructor of THD uses DBUG_ !
|
||||||
thd->thread_stack = (char*)&thd; // remember where our stack is
|
thd->thread_stack = (char*)&thd; // remember where our stack is
|
||||||
|
|
|
@ -2655,11 +2655,11 @@ bool change_password(THD *thd, const char *host, const char *user,
|
||||||
TABLE_LIST tables[TABLES_MAX];
|
TABLE_LIST tables[TABLES_MAX];
|
||||||
/* Buffer should be extended when password length is extended. */
|
/* Buffer should be extended when password length is extended. */
|
||||||
char buff[512];
|
char buff[512];
|
||||||
ulong query_length=0;
|
ulong query_length= 0;
|
||||||
enum_binlog_format save_binlog_format;
|
enum_binlog_format save_binlog_format;
|
||||||
uint new_password_len= (uint) strlen(new_password);
|
uint new_password_len= (uint) strlen(new_password);
|
||||||
int result=0;
|
int result=0;
|
||||||
const CSET_STRING query_save = thd->query_string;
|
const CSET_STRING query_save __attribute__((unused)) = thd->query_string;
|
||||||
|
|
||||||
DBUG_ENTER("change_password");
|
DBUG_ENTER("change_password");
|
||||||
DBUG_PRINT("enter",("host: '%s' user: '%s' new_password: '%s'",
|
DBUG_PRINT("enter",("host: '%s' user: '%s' new_password: '%s'",
|
||||||
|
@ -2669,16 +2669,18 @@ bool change_password(THD *thd, const char *host, const char *user,
|
||||||
if (check_change_password(thd, host, user, new_password, new_password_len))
|
if (check_change_password(thd, host, user, new_password, new_password_len))
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
|
|
||||||
#ifdef WITH_WSREP
|
if (mysql_bin_log.is_open() ||
|
||||||
if (WSREP(thd) && !thd->wsrep_applier)
|
(WSREP(thd) && !IF_WSREP(thd->wsrep_applier, 0)))
|
||||||
{
|
{
|
||||||
query_length= sprintf(buff, "SET PASSWORD FOR '%-.120s'@'%-.120s'='%-.120s'",
|
query_length= sprintf(buff, "SET PASSWORD FOR '%-.120s'@'%-.120s'='%-.120s'",
|
||||||
safe_str(user), safe_str(host), new_password);
|
safe_str(user), safe_str(host), new_password);
|
||||||
thd->set_query_inner(buff, query_length, system_charset_info);
|
}
|
||||||
|
|
||||||
|
if (WSREP(thd) && !IF_WSREP(thd->wsrep_applier, 0))
|
||||||
|
{
|
||||||
|
thd->set_query_inner(buff, query_length, system_charset_info);
|
||||||
WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, (char*)"user", NULL);
|
WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, (char*)"user", NULL);
|
||||||
}
|
}
|
||||||
#endif /* WITH_WSREP */
|
|
||||||
|
|
||||||
if ((result= open_grant_tables(thd, tables, TL_WRITE, Table_user)))
|
if ((result= open_grant_tables(thd, tables, TL_WRITE, Table_user)))
|
||||||
DBUG_RETURN(result != 1);
|
DBUG_RETURN(result != 1);
|
||||||
|
@ -2730,34 +2732,27 @@ bool change_password(THD *thd, const char *host, const char *user,
|
||||||
result= 0;
|
result= 0;
|
||||||
if (mysql_bin_log.is_open())
|
if (mysql_bin_log.is_open())
|
||||||
{
|
{
|
||||||
query_length=
|
DBUG_ASSERT(query_length);
|
||||||
sprintf(buff,"SET PASSWORD FOR '%-.120s'@'%-.120s'='%-.120s'",
|
|
||||||
safe_str(acl_user->user.str),
|
|
||||||
safe_str(acl_user->host.hostname),
|
|
||||||
new_password);
|
|
||||||
thd->clear_error();
|
thd->clear_error();
|
||||||
result= thd->binlog_query(THD::STMT_QUERY_TYPE, buff, query_length,
|
result= thd->binlog_query(THD::STMT_QUERY_TYPE, buff, query_length,
|
||||||
FALSE, FALSE, FALSE, 0);
|
FALSE, FALSE, FALSE, 0);
|
||||||
}
|
}
|
||||||
end:
|
end:
|
||||||
close_mysql_tables(thd);
|
close_mysql_tables(thd);
|
||||||
|
|
||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
|
error: // this label is used in WSREP_TO_ISOLATION_END
|
||||||
if (WSREP(thd) && !thd->wsrep_applier)
|
if (WSREP(thd) && !thd->wsrep_applier)
|
||||||
{
|
{
|
||||||
WSREP_TO_ISOLATION_END;
|
WSREP_TO_ISOLATION_END;
|
||||||
|
|
||||||
thd->query_string = query_save;
|
thd->set_query_inner(query_save);
|
||||||
thd->wsrep_exec_mode = LOCAL_STATE;
|
thd->wsrep_exec_mode = LOCAL_STATE;
|
||||||
}
|
}
|
||||||
#endif /* WITH_WSREP */
|
#endif /* WITH_WSREP */
|
||||||
thd->restore_stmt_binlog_format(save_binlog_format);
|
thd->restore_stmt_binlog_format(save_binlog_format);
|
||||||
|
|
||||||
DBUG_RETURN(result);
|
DBUG_RETURN(result);
|
||||||
|
|
||||||
error:
|
|
||||||
WSREP_ERROR("Repliation of SET PASSWORD failed: %s", buff);
|
|
||||||
DBUG_RETURN(result);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int acl_check_set_default_role(THD *thd, const char *host, const char *user)
|
int acl_check_set_default_role(THD *thd, const char *host, const char *user)
|
||||||
|
@ -2773,10 +2768,11 @@ int acl_set_default_role(THD *thd, const char *host, const char *user,
|
||||||
char user_key[MAX_KEY_LENGTH];
|
char user_key[MAX_KEY_LENGTH];
|
||||||
int result= 1;
|
int result= 1;
|
||||||
int error;
|
int error;
|
||||||
|
ulong query_length= 0;
|
||||||
bool clear_role= FALSE;
|
bool clear_role= FALSE;
|
||||||
char buff[512];
|
char buff[512];
|
||||||
enum_binlog_format save_binlog_format;
|
enum_binlog_format save_binlog_format;
|
||||||
const CSET_STRING query_save = thd->query_string;
|
const CSET_STRING query_save __attribute__((unused)) = thd->query_string;
|
||||||
|
|
||||||
DBUG_ENTER("acl_set_default_role");
|
DBUG_ENTER("acl_set_default_role");
|
||||||
DBUG_PRINT("enter",("host: '%s' user: '%s' rolename: '%s'",
|
DBUG_PRINT("enter",("host: '%s' user: '%s' rolename: '%s'",
|
||||||
|
@ -2795,6 +2791,20 @@ int acl_set_default_role(THD *thd, const char *host, const char *user,
|
||||||
if (!strcasecmp(rolename, "NONE"))
|
if (!strcasecmp(rolename, "NONE"))
|
||||||
clear_role= TRUE;
|
clear_role= TRUE;
|
||||||
|
|
||||||
|
if (mysql_bin_log.is_open() ||
|
||||||
|
(WSREP(thd) && !IF_WSREP(thd->wsrep_applier, 0)))
|
||||||
|
{
|
||||||
|
query_length=
|
||||||
|
sprintf(buff,"SET DEFAULT ROLE '%-.120s' FOR '%-.120s'@'%-.120s'",
|
||||||
|
safe_str(rolename), safe_str(user), safe_str(host));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (WSREP(thd) && !IF_WSREP(thd->wsrep_applier, 0))
|
||||||
|
{
|
||||||
|
thd->set_query_inner(buff, query_length, system_charset_info);
|
||||||
|
WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, (char*)"user", NULL);
|
||||||
|
}
|
||||||
|
|
||||||
if ((result= open_grant_tables(thd, tables, TL_WRITE, Table_user)))
|
if ((result= open_grant_tables(thd, tables, TL_WRITE, Table_user)))
|
||||||
DBUG_RETURN(result != 1);
|
DBUG_RETURN(result != 1);
|
||||||
|
|
||||||
|
@ -2871,11 +2881,7 @@ int acl_set_default_role(THD *thd, const char *host, const char *user,
|
||||||
result= 0;
|
result= 0;
|
||||||
if (mysql_bin_log.is_open())
|
if (mysql_bin_log.is_open())
|
||||||
{
|
{
|
||||||
int query_length=
|
DBUG_ASSERT(query_length);
|
||||||
sprintf(buff,"SET DEFAULT ROLE '%-.120s' FOR '%-.120s'@'%-.120s'",
|
|
||||||
safe_str(acl_user->default_rolename.str),
|
|
||||||
safe_str(acl_user->user.str),
|
|
||||||
safe_str(acl_user->host.hostname));
|
|
||||||
thd->clear_error();
|
thd->clear_error();
|
||||||
result= thd->binlog_query(THD::STMT_QUERY_TYPE, buff, query_length,
|
result= thd->binlog_query(THD::STMT_QUERY_TYPE, buff, query_length,
|
||||||
FALSE, FALSE, FALSE, 0);
|
FALSE, FALSE, FALSE, 0);
|
||||||
|
@ -2884,11 +2890,12 @@ end:
|
||||||
close_mysql_tables(thd);
|
close_mysql_tables(thd);
|
||||||
|
|
||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
|
error: // this label is used in WSREP_TO_ISOLATION_END
|
||||||
if (WSREP(thd) && !thd->wsrep_applier)
|
if (WSREP(thd) && !thd->wsrep_applier)
|
||||||
{
|
{
|
||||||
WSREP_TO_ISOLATION_END;
|
WSREP_TO_ISOLATION_END;
|
||||||
|
|
||||||
thd->query_string = query_save;
|
thd->set_query_inner(query_save);
|
||||||
thd->wsrep_exec_mode = LOCAL_STATE;
|
thd->wsrep_exec_mode = LOCAL_STATE;
|
||||||
}
|
}
|
||||||
#endif /* WITH_WSREP */
|
#endif /* WITH_WSREP */
|
||||||
|
|
|
@ -4417,7 +4417,7 @@ restart:
|
||||||
flags))
|
flags))
|
||||||
{
|
{
|
||||||
error= TRUE;
|
error= TRUE;
|
||||||
goto err;
|
goto error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -4427,7 +4427,7 @@ restart:
|
||||||
ot_ctx.get_timeout(), flags))
|
ot_ctx.get_timeout(), flags))
|
||||||
{
|
{
|
||||||
error= TRUE;
|
error= TRUE;
|
||||||
goto err;
|
goto error;
|
||||||
}
|
}
|
||||||
for (table= *start; table && table != thd->lex->first_not_own_table();
|
for (table= *start; table && table != thd->lex->first_not_own_table();
|
||||||
table= table->next_global)
|
table= table->next_global)
|
||||||
|
@ -4485,16 +4485,16 @@ restart:
|
||||||
it may change in future.
|
it may change in future.
|
||||||
*/
|
*/
|
||||||
if (ot_ctx.recover_from_failed_open())
|
if (ot_ctx.recover_from_failed_open())
|
||||||
goto err;
|
goto error;
|
||||||
|
|
||||||
/* Re-open temporary tables after close_tables_for_reopen(). */
|
/* Re-open temporary tables after close_tables_for_reopen(). */
|
||||||
if (open_temporary_tables(thd, *start))
|
if (open_temporary_tables(thd, *start))
|
||||||
goto err;
|
goto error;
|
||||||
|
|
||||||
error= FALSE;
|
error= FALSE;
|
||||||
goto restart;
|
goto restart;
|
||||||
}
|
}
|
||||||
goto err;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG_SYNC(thd, "open_tables_after_open_and_process_table");
|
DEBUG_SYNC(thd, "open_tables_after_open_and_process_table");
|
||||||
|
@ -4542,11 +4542,11 @@ restart:
|
||||||
close_tables_for_reopen(thd, start,
|
close_tables_for_reopen(thd, start,
|
||||||
ot_ctx.start_of_statement_svp());
|
ot_ctx.start_of_statement_svp());
|
||||||
if (ot_ctx.recover_from_failed_open())
|
if (ot_ctx.recover_from_failed_open())
|
||||||
goto err;
|
goto error;
|
||||||
|
|
||||||
/* Re-open temporary tables after close_tables_for_reopen(). */
|
/* Re-open temporary tables after close_tables_for_reopen(). */
|
||||||
if (open_temporary_tables(thd, *start))
|
if (open_temporary_tables(thd, *start))
|
||||||
goto err;
|
goto error;
|
||||||
|
|
||||||
error= FALSE;
|
error= FALSE;
|
||||||
goto restart;
|
goto restart;
|
||||||
|
@ -4556,7 +4556,7 @@ restart:
|
||||||
Something is wrong with the table or its contents, and an error has
|
Something is wrong with the table or its contents, and an error has
|
||||||
been emitted; we must abort.
|
been emitted; we must abort.
|
||||||
*/
|
*/
|
||||||
goto err;
|
goto error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4567,44 +4567,37 @@ restart:
|
||||||
children, attach the children to their parents. At end of statement,
|
children, attach the children to their parents. At end of statement,
|
||||||
the children are detached. Attaching and detaching are always done,
|
the children are detached. Attaching and detaching are always done,
|
||||||
even under LOCK TABLES.
|
even under LOCK TABLES.
|
||||||
|
|
||||||
|
And start wsrep TOI if needed.
|
||||||
*/
|
*/
|
||||||
for (tables= *start; tables; tables= tables->next_global)
|
for (tables= *start; tables; tables= tables->next_global)
|
||||||
{
|
{
|
||||||
TABLE *tbl= tables->table;
|
TABLE *tbl= tables->table;
|
||||||
|
|
||||||
|
if (!tbl)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (WSREP_ON && sqlcom_can_generate_row_events(thd) &&
|
||||||
|
wsrep_replicate_myisam && tables && tbl->file->ht == myisam_hton &&
|
||||||
|
tables->lock_type >= TL_WRITE_ALLOW_WRITE)
|
||||||
|
{
|
||||||
|
WSREP_TO_ISOLATION_BEGIN(NULL, NULL, tables);
|
||||||
|
}
|
||||||
|
|
||||||
/* Schema tables may not have a TABLE object here. */
|
/* Schema tables may not have a TABLE object here. */
|
||||||
if (tbl && tbl->file->ht->db_type == DB_TYPE_MRG_MYISAM)
|
if (tbl->file->ht->db_type == DB_TYPE_MRG_MYISAM)
|
||||||
{
|
{
|
||||||
/* MERGE tables need to access parent and child TABLE_LISTs. */
|
/* MERGE tables need to access parent and child TABLE_LISTs. */
|
||||||
DBUG_ASSERT(tbl->pos_in_table_list == tables);
|
DBUG_ASSERT(tbl->pos_in_table_list == tables);
|
||||||
if (tbl->file->extra(HA_EXTRA_ATTACH_CHILDREN))
|
if (tbl->file->extra(HA_EXTRA_ATTACH_CHILDREN))
|
||||||
{
|
{
|
||||||
error= TRUE;
|
error= TRUE;
|
||||||
goto err;
|
goto error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WITH_WSREP
|
error:
|
||||||
if (WSREP_ON &&
|
|
||||||
(thd->lex->sql_command== SQLCOM_INSERT ||
|
|
||||||
thd->lex->sql_command== SQLCOM_INSERT_SELECT ||
|
|
||||||
thd->lex->sql_command== SQLCOM_REPLACE ||
|
|
||||||
thd->lex->sql_command== SQLCOM_REPLACE_SELECT ||
|
|
||||||
thd->lex->sql_command== SQLCOM_UPDATE ||
|
|
||||||
thd->lex->sql_command== SQLCOM_UPDATE_MULTI ||
|
|
||||||
thd->lex->sql_command== SQLCOM_LOAD ||
|
|
||||||
thd->lex->sql_command== SQLCOM_DELETE) &&
|
|
||||||
wsrep_replicate_myisam &&
|
|
||||||
(*start) &&
|
|
||||||
(*start)->table && (*start)->table->file->ht->db_type == DB_TYPE_MYISAM)
|
|
||||||
{
|
|
||||||
WSREP_TO_ISOLATION_BEGIN(NULL, NULL, (*start));
|
|
||||||
}
|
|
||||||
error:
|
|
||||||
#endif
|
|
||||||
|
|
||||||
err:
|
|
||||||
THD_STAGE_INFO(thd, stage_after_opening_tables);
|
THD_STAGE_INFO(thd, stage_after_opening_tables);
|
||||||
thd_proc_info(thd, 0);
|
thd_proc_info(thd, 0);
|
||||||
|
|
||||||
|
|
|
@ -4764,14 +4764,12 @@ end_with_restore_list:
|
||||||
thd->print_aborted_warning(3, "RELEASE");
|
thd->print_aborted_warning(3, "RELEASE");
|
||||||
}
|
}
|
||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
if (WSREP(thd))
|
if (WSREP(thd) && (thd->wsrep_conflict_state != NO_CONFLICT &&
|
||||||
|
thd->wsrep_conflict_state != REPLAYING))
|
||||||
{
|
{
|
||||||
if (thd->wsrep_conflict_state == NO_CONFLICT ||
|
DBUG_ASSERT(thd->is_error()); // the error is already issued
|
||||||
thd->wsrep_conflict_state == REPLAYING)
|
}
|
||||||
{
|
else
|
||||||
my_ok(thd);
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
#endif /* WITH_WSREP */
|
#endif /* WITH_WSREP */
|
||||||
my_ok(thd);
|
my_ok(thd);
|
||||||
break;
|
break;
|
||||||
|
@ -4810,11 +4808,9 @@ end_with_restore_list:
|
||||||
if (tx_release)
|
if (tx_release)
|
||||||
thd->killed= KILL_CONNECTION;
|
thd->killed= KILL_CONNECTION;
|
||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
if (WSREP(thd))
|
if (WSREP(thd) && thd->wsrep_conflict_state != NO_CONFLICT)
|
||||||
{
|
{
|
||||||
if (thd->wsrep_conflict_state == NO_CONFLICT) {
|
DBUG_ASSERT(thd->is_error()); // the error is already issued
|
||||||
my_ok(thd);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif /* WITH_WSREP */
|
#endif /* WITH_WSREP */
|
||||||
|
|
|
@ -2709,11 +2709,11 @@ main(int argc, char **argv)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WITH_WSREP
|
|
||||||
// Replicate MyISAM DDL for this session, cf. lp:1161432
|
// Replicate MyISAM DDL for this session, cf. lp:1161432
|
||||||
// timezone info unfixable in XtraDB Cluster
|
// timezone info unfixable in XtraDB Cluster
|
||||||
printf("SET GLOBAL wsrep_replicate_myisam= ON;\n");
|
printf("set @prep=if((select count(*) from information_schema.global_variables where variable_name='wsrep_on'), 'SET GLOBAL wsrep_replicate_myisam=?', 'do ?');\n"
|
||||||
#endif /* WITH_WSREP */
|
"prepare set_wsrep_myisam from @prep;\n"
|
||||||
|
"set @toggle=1; execute set_wsrep_myisam using @toggle;\n");
|
||||||
|
|
||||||
if (argc == 1 && !opt_leap)
|
if (argc == 1 && !opt_leap)
|
||||||
{
|
{
|
||||||
|
@ -2762,10 +2762,8 @@ main(int argc, char **argv)
|
||||||
free_root(&tz_storage, MYF(0));
|
free_root(&tz_storage, MYF(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WITH_WSREP
|
|
||||||
// Reset wsrep_replicate_myisam. lp:1161432
|
// Reset wsrep_replicate_myisam. lp:1161432
|
||||||
printf("SET GLOBAL wsrep_replicate_myisam= OFF;\n");
|
printf("set @toggle=0; execute set_wsrep_myisam using @toggle;\n");
|
||||||
#endif /* WITH_WSREP */
|
|
||||||
|
|
||||||
free_defaults(default_argv);
|
free_defaults(default_argv);
|
||||||
my_end(0);
|
my_end(0);
|
||||||
|
|
|
@ -157,6 +157,11 @@ static int wsrep_prepare(handlerton *hton, THD *thd, bool all)
|
||||||
!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) &&
|
!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) &&
|
||||||
(thd->variables.wsrep_on && !wsrep_trans_cache_is_empty(thd)))
|
(thd->variables.wsrep_on && !wsrep_trans_cache_is_empty(thd)))
|
||||||
{
|
{
|
||||||
|
int res= wsrep_run_wsrep_commit(thd, hton, all);
|
||||||
|
if (res == WSREP_TRX_SIZE_EXCEEDED)
|
||||||
|
res= EMSGSIZE;
|
||||||
|
else
|
||||||
|
res= EDEADLK; // for a better error message
|
||||||
DBUG_RETURN (wsrep_run_wsrep_commit(thd, hton, all));
|
DBUG_RETURN (wsrep_run_wsrep_commit(thd, hton, all));
|
||||||
}
|
}
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
|
|
|
@ -37,6 +37,12 @@
|
||||||
#include <slave.h>
|
#include <slave.h>
|
||||||
|
|
||||||
wsrep_t *wsrep = NULL;
|
wsrep_t *wsrep = NULL;
|
||||||
|
/*
|
||||||
|
wsrep_emulate_bin_log is a flag to tell that binlog has not been configured.
|
||||||
|
wsrep needs to get binlog events from transaction cache even when binlog is
|
||||||
|
not enabled, wsrep_emulate_bin_log opens needed code paths to make this
|
||||||
|
possible
|
||||||
|
*/
|
||||||
my_bool wsrep_emulate_bin_log = FALSE; // activating parts of binlog interface
|
my_bool wsrep_emulate_bin_log = FALSE; // activating parts of binlog interface
|
||||||
#ifdef GTID_SUPPORT
|
#ifdef GTID_SUPPORT
|
||||||
/* Sidno in global_sid_map corresponding to group uuid */
|
/* Sidno in global_sid_map corresponding to group uuid */
|
||||||
|
|
|
@ -330,6 +330,7 @@ int wsrep_create_trigger_query(THD *thd, uchar** buf, size_t* buf_len);
|
||||||
#define wsrep_deinit(X) do { } while(0)
|
#define wsrep_deinit(X) do { } while(0)
|
||||||
#define wsrep_recover() do { } while(0)
|
#define wsrep_recover() do { } while(0)
|
||||||
#define wsrep_slave_threads (1)
|
#define wsrep_slave_threads (1)
|
||||||
|
#define wsrep_replicate_myisam (0)
|
||||||
|
|
||||||
#endif /* WITH_WSREP */
|
#endif /* WITH_WSREP */
|
||||||
#endif /* WSREP_MYSQLD_H */
|
#endif /* WSREP_MYSQLD_H */
|
||||||
|
|
|
@ -31,6 +31,9 @@ void wsrep_create_rollbacker();
|
||||||
int wsrep_abort_thd(void *bf_thd_ptr, void *victim_thd_ptr,
|
int wsrep_abort_thd(void *bf_thd_ptr, void *victim_thd_ptr,
|
||||||
my_bool signal);
|
my_bool signal);
|
||||||
|
|
||||||
|
/*
|
||||||
|
PA = Parallel Applying (on the slave side)
|
||||||
|
*/
|
||||||
extern void wsrep_thd_set_PA_safe(void *thd_ptr, my_bool safe);
|
extern void wsrep_thd_set_PA_safe(void *thd_ptr, my_bool safe);
|
||||||
extern my_bool wsrep_thd_is_BF(THD *thd, my_bool sync);
|
extern my_bool wsrep_thd_is_BF(THD *thd, my_bool sync);
|
||||||
extern my_bool wsrep_thd_is_wsrep(void *thd_ptr);
|
extern my_bool wsrep_thd_is_wsrep(void *thd_ptr);
|
||||||
|
@ -44,7 +47,7 @@ extern "C" int wsrep_thd_in_locking_session(void *thd_ptr);
|
||||||
|
|
||||||
#define wsrep_thd_is_BF(T, S) (0)
|
#define wsrep_thd_is_BF(T, S) (0)
|
||||||
#define wsrep_abort_thd(X,Y,Z) do { } while(0)
|
#define wsrep_abort_thd(X,Y,Z) do { } while(0)
|
||||||
#define wsrep_create_appliers(T) (0)
|
#define wsrep_create_appliers(T) do { } while(0)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif /* WSREP_THD_H */
|
#endif /* WSREP_THD_H */
|
||||||
|
|
Loading…
Reference in a new issue