1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00
This commit is contained in:
Brave Galera Crew
2019-01-23 15:30:00 +04:00
committed by Sergey Vojtovich
parent 382115b992
commit 36a2a185fe
791 changed files with 28035 additions and 8865 deletions

View File

@@ -53,6 +53,9 @@
// Create_file_log_event,
// Format_description_log_event
#include "wsrep_mysqld.h"
#ifdef WITH_WSREP
#include "wsrep_trans_observer.h"
#endif
#ifdef HAVE_REPLICATION
@@ -1201,6 +1204,11 @@ terminate_slave_thread(THD *thd,
int error __attribute__((unused));
DBUG_PRINT("loop", ("killing slave thread"));
#ifdef WITH_WSREP
/* awake_no_mutex() requires LOCK_thd_data to be locked if wsrep
is enabled */
if (WSREP(thd)) mysql_mutex_lock(&thd->LOCK_thd_data);
#endif /* WITH_WSREP */
mysql_mutex_lock(&thd->LOCK_thd_kill);
#ifndef DONT_USE_THR_ALARM
/*
@@ -1214,6 +1222,9 @@ terminate_slave_thread(THD *thd,
thd->awake_no_mutex(NOT_KILLED);
mysql_mutex_unlock(&thd->LOCK_thd_kill);
#ifdef WITH_WSREP
if (WSREP(thd)) mysql_mutex_unlock(&thd->LOCK_thd_data);
#endif /* WITH_WSREP */
/*
There is a small chance that slave thread might miss the first
@@ -3943,14 +3954,20 @@ apply_event_and_update_pos_apply(Log_event* ev, THD* thd, rpl_group_info *rgi,
exec_res= ev->apply_event(rgi);
#ifdef WITH_WSREP
if (exec_res && thd->wsrep_conflict_state != NO_CONFLICT)
if (WSREP_ON)
{
mysql_mutex_lock(&thd->LOCK_thd_data);
if (exec_res &&
thd->wsrep_trx().state() != wsrep::transaction::s_executing)
{
WSREP_DEBUG("SQL apply failed, res %d conflict state: %d",
exec_res, thd->wsrep_conflict_state);
WSREP_DEBUG("SQL apply failed, res %d conflict state: %s",
exec_res, wsrep_thd_transaction_state_str(thd));
rli->abort_slave= 1;
rli->report(ERROR_LEVEL, ER_UNKNOWN_COM_ERROR, rgi->gtid_info(),
"Node has dropped from cluster");
}
mysql_mutex_unlock(&thd->LOCK_thd_data);
}
#endif
#ifndef DBUG_OFF
@@ -4243,6 +4260,13 @@ static int exec_relay_log_event(THD* thd, Relay_log_info* rli,
}
if (ev)
{
#ifdef WITH_WSREP
if (wsrep_before_statement(thd))
{
WSREP_INFO("Wsrep before statement error");
DBUG_RETURN(1);
}
#endif /* WITH_WSREP */
int exec_res;
Log_event_type typ= ev->get_type_code();
@@ -4274,9 +4298,9 @@ static int exec_relay_log_event(THD* thd, Relay_log_info* rli,
rli->until_condition == Relay_log_info::UNTIL_RELAY_POS) &&
(ev->server_id != global_system_variables.server_id ||
rli->replicate_same_server_id) &&
rli->is_until_satisfied((rli->get_flag(Relay_log_info::IN_TRANSACTION) || !ev->log_pos)
? rli->group_master_log_pos
: ev->log_pos - ev->data_written))
rli->is_until_satisfied((rli->get_flag(Relay_log_info::IN_TRANSACTION) || !ev->log_pos)
? rli->group_master_log_pos
: ev->log_pos - ev->data_written))
{
sql_print_information("Slave SQL thread stopped because it reached its"
" UNTIL position %llu", rli->until_pos());
@@ -4287,6 +4311,9 @@ static int exec_relay_log_event(THD* thd, Relay_log_info* rli,
rli->abort_slave= 1;
rli->stop_for_until= true;
mysql_mutex_unlock(&rli->data_lock);
#ifdef WITH_WSREP
wsrep_after_statement(thd);
#endif /* WITH_WSREP */
delete ev;
DBUG_RETURN(1);
}
@@ -4324,7 +4351,12 @@ static int exec_relay_log_event(THD* thd, Relay_log_info* rli,
if (res == 0)
rli->event_relay_log_pos= rli->future_event_relay_log_pos;
if (res >= 0)
{
#ifdef WITH_WSREP
wsrep_after_statement(thd);
#endif /* WITH_WSREP */
DBUG_RETURN(res);
}
/*
Else we proceed to execute the event non-parallel.
This is the case for pre-10.0 events without GTID, and for handling
@@ -4359,6 +4391,9 @@ static int exec_relay_log_event(THD* thd, Relay_log_info* rli,
"aborted because of out-of-memory error");
mysql_mutex_unlock(&rli->data_lock);
delete ev;
#ifdef WITH_WSREP
wsrep_after_statement(thd);
#endif /* WITH_WSREP */
DBUG_RETURN(1);
}
@@ -4373,6 +4408,9 @@ static int exec_relay_log_event(THD* thd, Relay_log_info* rli,
"thread aborted because of out-of-memory error");
mysql_mutex_unlock(&rli->data_lock);
delete ev;
#ifdef WITH_WSREP
wsrep_after_statement(thd);
#endif /* WITH_WSREP */
DBUG_RETURN(1);
}
/*
@@ -4401,13 +4439,17 @@ static int exec_relay_log_event(THD* thd, Relay_log_info* rli,
retry.
*/
if (unlikely(exec_res == 2))
{
#ifdef WITH_WSREP
wsrep_after_statement(thd);
#endif /* WITH_WSREP */
DBUG_RETURN(1);
}
#ifdef WITH_WSREP
mysql_mutex_lock(&thd->LOCK_thd_data);
if (thd->wsrep_conflict_state == NO_CONFLICT)
{
mysql_mutex_unlock(&thd->LOCK_thd_data);
enum wsrep::client_error wsrep_error= thd->wsrep_cs().current_error();
mysql_mutex_unlock(&thd->LOCK_thd_data);
if (wsrep_error == wsrep::e_success)
#endif /* WITH_WSREP */
if (slave_trans_retries)
{
@@ -4420,8 +4462,8 @@ static int exec_relay_log_event(THD* thd, Relay_log_info* rli,
We were in a transaction which has been rolled back because of a
temporary error;
let's seek back to BEGIN log event and retry it all again.
Note, if lock wait timeout (innodb_lock_wait_timeout exceeded)
there is no rollback since 5.0.13 (ref: manual).
Note, if lock wait timeout (innodb_lock_wait_timeout exceeded)
there is no rollback since 5.0.13 (ref: manual).
We have to not only seek but also
a) init_master_info(), to seek back to hot relay log's start
@@ -4482,13 +4524,11 @@ static int exec_relay_log_event(THD* thd, Relay_log_info* rli,
serial_rgi->trans_retries));
}
}
#ifdef WITH_WSREP
}
else
mysql_mutex_unlock(&thd->LOCK_thd_data);
#endif /* WITH_WSREP */
thread_safe_increment64(&rli->executed_entries);
#ifdef WITH_WSREP
wsrep_after_statement(thd);
#endif /* WITH_WSREP */
DBUG_RETURN(exec_res);
}
mysql_mutex_unlock(&rli->data_lock);
@@ -5415,12 +5455,6 @@ pthread_handler_t handle_slave_sql(void *arg)
}
#endif
#ifdef WITH_WSREP
thd->wsrep_exec_mode= LOCAL_STATE;
/* synchronize with wsrep replication */
if (WSREP_ON)
wsrep_ready_wait();
#endif
DBUG_PRINT("master_info",("log_file_name: %s position: %llu",
rli->group_master_log_name,
rli->group_master_log_pos));
@@ -5517,7 +5551,14 @@ pthread_handler_t handle_slave_sql(void *arg)
goto err;
}
mysql_mutex_unlock(&rli->data_lock);
#ifdef WITH_WSREP
wsrep_open(thd);
if (wsrep_before_command(thd))
{
WSREP_WARN("Slave SQL wsrep_before_command() failed");
goto err;
}
#endif /* WITH_WSREP */
/* Read queries from the IO/THREAD until this thread is killed */
thd->set_command(COM_SLAVE_SQL);
@@ -5554,10 +5595,16 @@ pthread_handler_t handle_slave_sql(void *arg)
if (exec_relay_log_event(thd, rli, serial_rgi))
{
#ifdef WITH_WSREP
if (thd->wsrep_conflict_state != NO_CONFLICT)
if (WSREP_ON)
{
wsrep_node_dropped= TRUE;
rli->abort_slave= TRUE;
mysql_mutex_lock(&thd->LOCK_thd_data);
if (thd->wsrep_cs().current_error())
{
wsrep_node_dropped = TRUE;
rli->abort_slave = TRUE;
}
mysql_mutex_unlock(&thd->LOCK_thd_data);
}
#endif /* WITH_WSREP */
@@ -5590,6 +5637,10 @@ pthread_handler_t handle_slave_sql(void *arg)
"log '%s' at position %llu%s", RPL_LOG_NAME,
rli->group_master_log_pos, tmp.c_ptr_safe());
}
#ifdef WITH_WSREP
wsrep_after_command_before_result(thd);
wsrep_after_command_after_result(thd);
#endif /* WITH_WSREP */
err_before_start:
@@ -5708,17 +5759,17 @@ err_during_init:
"SQL slave will continue");
wsrep_node_dropped= FALSE;
mysql_mutex_unlock(&rli->run_lock);
WSREP_DEBUG("wsrep_conflict_state now: %d", thd->wsrep_conflict_state);
WSREP_INFO("slave restart: %d", thd->wsrep_conflict_state);
thd->wsrep_conflict_state= NO_CONFLICT;
goto wsrep_restart_point;
} else {
}
else
{
WSREP_INFO("Slave error due to node going non-primary");
WSREP_INFO("wsrep_restart_slave was set and therefore slave will be "
"automatically restarted when node joins back to cluster.");
"automatically restarted when node joins back to cluster");
wsrep_restart_slave_activated= TRUE;
}
}
wsrep_close(thd);
#endif /* WITH_WSREP */
/*