cleanup: galera misc cleanups

also disable galera-specific output in mysql_tzinfo_to_sql,
it'll be enabled later.
This commit is contained in:
Sergei Golubchik 2014-10-08 18:47:16 +02:00
parent 8596b70f96
commit 03ec3511a8
23 changed files with 149 additions and 284 deletions

View file

@ -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;";

View file

@ -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)

View file

@ -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;

View file

@ -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;

View file

@ -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 { };

View file

@ -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

View file

@ -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

View file

@ -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 */

View file

@ -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

View file

@ -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);

View file

@ -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."));

View file

@ -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

View file

@ -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);
} }

View file

@ -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);
} }

View file

@ -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

View file

@ -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 */

View file

@ -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);

View file

@ -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 */

View file

@ -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);

View file

@ -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);

View file

@ -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 */

View file

@ -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 */

View file

@ -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 */