mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
bzr merge -r3933..3945 codership/5.5 (Non-InnoDB changes only).
This commit is contained in:
@ -22,7 +22,7 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
#include <my_sys.h>
|
#include <my_sys.h>
|
||||||
typedef int (* wsrep_thd_is_brute_force_fun)(void *);
|
typedef my_bool (* wsrep_thd_is_brute_force_fun)(void *, my_bool);
|
||||||
typedef int (* wsrep_abort_thd_fun)(void *, void *, my_bool);
|
typedef int (* wsrep_abort_thd_fun)(void *, void *, my_bool);
|
||||||
typedef int (* wsrep_on_fun)(void *);
|
typedef int (* wsrep_on_fun)(void *);
|
||||||
void wsrep_thr_lock_init(
|
void wsrep_thr_lock_init(
|
||||||
|
@ -690,7 +690,7 @@ wsrep_break_lock(
|
|||||||
{
|
{
|
||||||
if (wsrep_on(data->owner->mysql_thd) &&
|
if (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))
|
wsrep_thd_is_brute_force(data->owner->mysql_thd, TRUE))
|
||||||
{
|
{
|
||||||
THR_LOCK_DATA *holder;
|
THR_LOCK_DATA *holder;
|
||||||
|
|
||||||
@ -715,7 +715,7 @@ wsrep_break_lock(
|
|||||||
holder;
|
holder;
|
||||||
holder=holder->next)
|
holder=holder->next)
|
||||||
{
|
{
|
||||||
if (!wsrep_thd_is_brute_force(holder->owner->mysql_thd))
|
if (!wsrep_thd_is_brute_force(holder->owner->mysql_thd, TRUE))
|
||||||
{
|
{
|
||||||
wsrep_abort_thd(data->owner->mysql_thd,
|
wsrep_abort_thd(data->owner->mysql_thd,
|
||||||
holder->owner->mysql_thd, FALSE);
|
holder->owner->mysql_thd, FALSE);
|
||||||
@ -731,7 +731,7 @@ wsrep_break_lock(
|
|||||||
holder;
|
holder;
|
||||||
holder=holder->next)
|
holder=holder->next)
|
||||||
{
|
{
|
||||||
if (!wsrep_thd_is_brute_force(holder->owner->mysql_thd))
|
if (!wsrep_thd_is_brute_force(holder->owner->mysql_thd, TRUE))
|
||||||
{
|
{
|
||||||
wsrep_abort_thd(data->owner->mysql_thd,
|
wsrep_abort_thd(data->owner->mysql_thd,
|
||||||
holder->owner->mysql_thd, FALSE);
|
holder->owner->mysql_thd, FALSE);
|
||||||
|
@ -567,8 +567,11 @@ void thd_binlog_trx_reset(THD * thd)
|
|||||||
{
|
{
|
||||||
binlog_cache_mngr *const cache_mngr=
|
binlog_cache_mngr *const cache_mngr=
|
||||||
(binlog_cache_mngr*) thd_get_ha_data(thd, binlog_hton);
|
(binlog_cache_mngr*) thd_get_ha_data(thd, binlog_hton);
|
||||||
if (cache_mngr) cache_mngr->reset(false, true);
|
if (cache_mngr)
|
||||||
}
|
{
|
||||||
|
cache_mngr->reset_cache(&cache_mngr->stmt_cache);
|
||||||
|
cache_mngr->reset_cache(&cache_mngr->trx_cache);
|
||||||
|
}
|
||||||
thd->clear_binlog_table_maps();
|
thd->clear_binlog_table_maps();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1482,7 +1482,7 @@ void MDL_lock::Ticket_list::add_ticket(MDL_ticket *ticket)
|
|||||||
DBUG_ASSERT(ticket->get_lock());
|
DBUG_ASSERT(ticket->get_lock());
|
||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
if ((this == &(ticket->get_lock()->m_waiting)) &&
|
if ((this == &(ticket->get_lock()->m_waiting)) &&
|
||||||
wsrep_thd_is_brute_force((void *)(ticket->get_ctx()->wsrep_get_thd())))
|
wsrep_thd_is_BF((void *)(ticket->get_ctx()->get_thd()), false))
|
||||||
{
|
{
|
||||||
Ticket_iterator itw(ticket->get_lock()->m_waiting);
|
Ticket_iterator itw(ticket->get_lock()->m_waiting);
|
||||||
Ticket_iterator itg(ticket->get_lock()->m_granted);
|
Ticket_iterator itg(ticket->get_lock()->m_granted);
|
||||||
@ -1493,7 +1493,7 @@ void MDL_lock::Ticket_list::add_ticket(MDL_ticket *ticket)
|
|||||||
|
|
||||||
while ((waiting= itw++) && !added)
|
while ((waiting= itw++) && !added)
|
||||||
{
|
{
|
||||||
if (!wsrep_thd_is_brute_force((void *)(waiting->get_ctx()->wsrep_get_thd())))
|
if (!wsrep_thd_is_BF((void *)(waiting->get_ctx()->get_thd()), true))
|
||||||
{
|
{
|
||||||
WSREP_DEBUG("MDL add_ticket inserted before: %lu %s",
|
WSREP_DEBUG("MDL add_ticket inserted before: %lu %s",
|
||||||
wsrep_thd_thread_id(waiting->get_ctx()->wsrep_get_thd()),
|
wsrep_thd_thread_id(waiting->get_ctx()->wsrep_get_thd()),
|
||||||
@ -1894,7 +1894,7 @@ MDL_lock::can_grant_lock(enum_mdl_type type_arg,
|
|||||||
ticket->is_incompatible_when_granted(type_arg))
|
ticket->is_incompatible_when_granted(type_arg))
|
||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
{
|
{
|
||||||
if (wsrep_thd_is_brute_force((void *)(requestor_ctx->wsrep_get_thd())) &&
|
if (wsrep_thd_is_BF((void *)(requestor_ctx->get_thd()), false) &&
|
||||||
key.mdl_namespace() == MDL_key::GLOBAL)
|
key.mdl_namespace() == MDL_key::GLOBAL)
|
||||||
{
|
{
|
||||||
WSREP_DEBUG("global lock granted for BF: %lu %s",
|
WSREP_DEBUG("global lock granted for BF: %lu %s",
|
||||||
@ -1935,7 +1935,7 @@ MDL_lock::can_grant_lock(enum_mdl_type type_arg,
|
|||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (wsrep_thd_is_brute_force((void *)(requestor_ctx->wsrep_get_thd())) &&
|
if (wsrep_thd_is_BF((void *)(requestor_ctx->get_thd()), false) &&
|
||||||
key.mdl_namespace() == MDL_key::GLOBAL)
|
key.mdl_namespace() == MDL_key::GLOBAL)
|
||||||
{
|
{
|
||||||
WSREP_DEBUG("global lock granted for BF (waiting queue): %lu %s",
|
WSREP_DEBUG("global lock granted for BF (waiting queue): %lu %s",
|
||||||
|
@ -2735,11 +2735,7 @@ static void network_init(void)
|
|||||||
@note
|
@note
|
||||||
For the connection that is doing shutdown, this is called twice
|
For the connection that is doing shutdown, this is called twice
|
||||||
*/
|
*/
|
||||||
#ifdef WITH_WSREP
|
|
||||||
void close_connection(THD *thd, uint sql_errno, bool lock)
|
|
||||||
#else
|
|
||||||
void close_connection(THD *thd, uint sql_errno)
|
void close_connection(THD *thd, uint sql_errno)
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
DBUG_ENTER("close_connection");
|
DBUG_ENTER("close_connection");
|
||||||
|
|
||||||
@ -2972,7 +2968,11 @@ bool one_thread_per_connection_end(THD *thd, bool put_in_cache)
|
|||||||
unlink_thd(thd);
|
unlink_thd(thd);
|
||||||
/* Mark that current_thd is not valid anymore */
|
/* Mark that current_thd is not valid anymore */
|
||||||
set_current_thd(0);
|
set_current_thd(0);
|
||||||
|
#ifdef WITH_WSREP
|
||||||
|
if (put_in_cache && cache_thread() && !thd->wsrep_applier)
|
||||||
|
#else
|
||||||
if (put_in_cache && cache_thread())
|
if (put_in_cache && cache_thread())
|
||||||
|
#endif /* WITH_WSREP */
|
||||||
DBUG_RETURN(0); // Thread is reused
|
DBUG_RETURN(0); // Thread is reused
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -5248,7 +5248,7 @@ pthread_handler_t start_wsrep_THD(void *arg)
|
|||||||
thd->thr_create_utime= microsecond_interval_timer();
|
thd->thr_create_utime= microsecond_interval_timer();
|
||||||
if (MYSQL_CALLBACK_ELSE(thread_scheduler, init_new_connection_thread, (), 0))
|
if (MYSQL_CALLBACK_ELSE(thread_scheduler, init_new_connection_thread, (), 0))
|
||||||
{
|
{
|
||||||
close_connection(thd, ER_OUT_OF_RESOURCES, 1);
|
close_connection(thd, ER_OUT_OF_RESOURCES);
|
||||||
statistic_increment(aborted_connects,&LOCK_status);
|
statistic_increment(aborted_connects,&LOCK_status);
|
||||||
MYSQL_CALLBACK(thread_scheduler, end_thread, (thd, 0));
|
MYSQL_CALLBACK(thread_scheduler, end_thread, (thd, 0));
|
||||||
|
|
||||||
@ -5271,7 +5271,7 @@ pthread_handler_t start_wsrep_THD(void *arg)
|
|||||||
thd->thread_stack= (char*) &thd;
|
thd->thread_stack= (char*) &thd;
|
||||||
if (thd->store_globals())
|
if (thd->store_globals())
|
||||||
{
|
{
|
||||||
close_connection(thd, ER_OUT_OF_RESOURCES, 1);
|
close_connection(thd, ER_OUT_OF_RESOURCES);
|
||||||
statistic_increment(aborted_connects,&LOCK_status);
|
statistic_increment(aborted_connects,&LOCK_status);
|
||||||
MYSQL_CALLBACK(thread_scheduler, end_thread, (thd, 0));
|
MYSQL_CALLBACK(thread_scheduler, end_thread, (thd, 0));
|
||||||
delete thd;
|
delete thd;
|
||||||
@ -5300,10 +5300,11 @@ pthread_handler_t start_wsrep_THD(void *arg)
|
|||||||
|
|
||||||
processor(thd);
|
processor(thd);
|
||||||
|
|
||||||
close_connection(thd, 0, 1);
|
close_connection(thd, 0);
|
||||||
|
|
||||||
mysql_mutex_lock(&LOCK_thread_count);
|
mysql_mutex_lock(&LOCK_thread_count);
|
||||||
wsrep_running_threads--;
|
wsrep_running_threads--;
|
||||||
|
WSREP_DEBUG("wsrep running threads now: %lu", wsrep_running_threads);
|
||||||
mysql_cond_signal(&COND_thread_count);
|
mysql_cond_signal(&COND_thread_count);
|
||||||
mysql_mutex_unlock(&LOCK_thread_count);
|
mysql_mutex_unlock(&LOCK_thread_count);
|
||||||
|
|
||||||
@ -5323,6 +5324,7 @@ pthread_handler_t start_wsrep_THD(void *arg)
|
|||||||
// at server shutdown
|
// at server shutdown
|
||||||
}
|
}
|
||||||
|
|
||||||
|
my_thread_end();
|
||||||
if (thread_handling > SCHEDULER_ONE_THREAD_PER_CONNECTION)
|
if (thread_handling > SCHEDULER_ONE_THREAD_PER_CONNECTION)
|
||||||
{
|
{
|
||||||
mysql_mutex_lock(&LOCK_thread_count);
|
mysql_mutex_lock(&LOCK_thread_count);
|
||||||
@ -5409,23 +5411,6 @@ static bool have_client_connections()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
returns the number of wsrep appliers running.
|
|
||||||
However, the caller (thd parameter) is not taken in account
|
|
||||||
*/
|
|
||||||
static int have_wsrep_appliers(THD *thd)
|
|
||||||
{
|
|
||||||
int ret= 0;
|
|
||||||
THD *tmp;
|
|
||||||
|
|
||||||
I_List_iterator<THD> it(threads);
|
|
||||||
while ((tmp=it++))
|
|
||||||
{
|
|
||||||
ret+= (tmp != thd && tmp->wsrep_applier);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void wsrep_close_thread(THD *thd)
|
static void wsrep_close_thread(THD *thd)
|
||||||
{
|
{
|
||||||
thd->killed= KILL_CONNECTION;
|
thd->killed= KILL_CONNECTION;
|
||||||
@ -5536,7 +5521,7 @@ void wsrep_close_client_connections(my_bool wait_to_end)
|
|||||||
!is_replaying_connection(tmp))
|
!is_replaying_connection(tmp))
|
||||||
{
|
{
|
||||||
WSREP_INFO("killing local connection: %ld",tmp->thread_id);
|
WSREP_INFO("killing local connection: %ld",tmp->thread_id);
|
||||||
close_connection(tmp,0,0);
|
close_connection(tmp,0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -5611,7 +5596,7 @@ void wsrep_wait_appliers_close(THD *thd)
|
|||||||
{
|
{
|
||||||
/* Wait for wsrep appliers to gracefully exit */
|
/* Wait for wsrep appliers to gracefully exit */
|
||||||
mysql_mutex_lock(&LOCK_thread_count);
|
mysql_mutex_lock(&LOCK_thread_count);
|
||||||
while (have_wsrep_appliers(thd) > 1)
|
while (wsrep_running_threads > 1)
|
||||||
// 1 is for rollbacker thread which needs to be killed explicitly.
|
// 1 is for rollbacker thread which needs to be killed explicitly.
|
||||||
// This gotta be fixed in a more elegant manner if we gonna have arbitrary
|
// This gotta be fixed in a more elegant manner if we gonna have arbitrary
|
||||||
// number of non-applier wsrep threads.
|
// number of non-applier wsrep threads.
|
||||||
@ -5631,7 +5616,7 @@ void wsrep_wait_appliers_close(THD *thd)
|
|||||||
wsrep_close_threads (thd);
|
wsrep_close_threads (thd);
|
||||||
/* and wait for them to die */
|
/* and wait for them to die */
|
||||||
mysql_mutex_lock(&LOCK_thread_count);
|
mysql_mutex_lock(&LOCK_thread_count);
|
||||||
while (have_wsrep_appliers(thd) > 0)
|
while (wsrep_running_threads > 0)
|
||||||
{
|
{
|
||||||
if (thread_handling > SCHEDULER_ONE_THREAD_PER_CONNECTION)
|
if (thread_handling > SCHEDULER_ONE_THREAD_PER_CONNECTION)
|
||||||
{
|
{
|
||||||
@ -6630,11 +6615,7 @@ void create_thread_to_handle_connection(THD *thd)
|
|||||||
my_snprintf(error_message_buff, sizeof(error_message_buff),
|
my_snprintf(error_message_buff, sizeof(error_message_buff),
|
||||||
ER_THD(thd, ER_CANT_CREATE_THREAD), error);
|
ER_THD(thd, ER_CANT_CREATE_THREAD), error);
|
||||||
net_send_error(thd, ER_CANT_CREATE_THREAD, error_message_buff, NULL);
|
net_send_error(thd, ER_CANT_CREATE_THREAD, error_message_buff, NULL);
|
||||||
#ifdef WITH_WSREP
|
|
||||||
close_connection(thd, ER_OUT_OF_RESOURCES ,0);
|
|
||||||
#else
|
|
||||||
close_connection(thd, ER_OUT_OF_RESOURCES);
|
close_connection(thd, ER_OUT_OF_RESOURCES);
|
||||||
#endif /* WITH_WSREP */
|
|
||||||
|
|
||||||
mysql_mutex_lock(&LOCK_thread_count);
|
mysql_mutex_lock(&LOCK_thread_count);
|
||||||
thd->unlink();
|
thd->unlink();
|
||||||
@ -6680,11 +6661,7 @@ static void create_new_thread(THD *thd)
|
|||||||
mysql_mutex_unlock(&LOCK_connection_count);
|
mysql_mutex_unlock(&LOCK_connection_count);
|
||||||
|
|
||||||
DBUG_PRINT("error",("Too many connections"));
|
DBUG_PRINT("error",("Too many connections"));
|
||||||
#ifdef WITH_WSREP
|
|
||||||
close_connection(thd, ER_CON_COUNT_ERROR, 1);
|
|
||||||
#else
|
|
||||||
close_connection(thd, ER_CON_COUNT_ERROR);
|
close_connection(thd, ER_CON_COUNT_ERROR);
|
||||||
#endif /* WITH_WSREP */
|
|
||||||
statistic_increment(denied_connections, &LOCK_status);
|
statistic_increment(denied_connections, &LOCK_status);
|
||||||
delete thd;
|
delete thd;
|
||||||
statistic_increment(connection_errors_max_connection, &LOCK_status);
|
statistic_increment(connection_errors_max_connection, &LOCK_status);
|
||||||
@ -7095,11 +7072,7 @@ pthread_handler_t handle_connections_namedpipes(void *arg)
|
|||||||
if (!(thd->net.vio= vio_new_win32pipe(hConnectedPipe)) ||
|
if (!(thd->net.vio= vio_new_win32pipe(hConnectedPipe)) ||
|
||||||
my_net_init(&thd->net, thd->net.vio, MYF(MY_THREAD_SPECIFIC)))
|
my_net_init(&thd->net, thd->net.vio, MYF(MY_THREAD_SPECIFIC)))
|
||||||
{
|
{
|
||||||
#ifdef WITH_WSREP
|
|
||||||
close_connection(thd, ER_OUT_OF_RESOURCES, 1);
|
|
||||||
#else
|
|
||||||
close_connection(thd, ER_OUT_OF_RESOURCES);
|
close_connection(thd, ER_OUT_OF_RESOURCES);
|
||||||
#endif
|
|
||||||
delete thd;
|
delete thd;
|
||||||
set_current_thd(0);
|
set_current_thd(0);
|
||||||
continue;
|
continue;
|
||||||
@ -7297,11 +7270,7 @@ pthread_handler_t handle_connections_shared_memory(void *arg)
|
|||||||
event_conn_closed)) ||
|
event_conn_closed)) ||
|
||||||
my_net_init(&thd->net, thd->net.vio, MYF(MY_THREAD_SPECIFIC)))
|
my_net_init(&thd->net, thd->net.vio, MYF(MY_THREAD_SPECIFIC)))
|
||||||
{
|
{
|
||||||
#ifdef WITH_WSREP
|
|
||||||
close_connection(thd, ER_OUT_OF_RESOURCES, 1);
|
|
||||||
#else
|
|
||||||
close_connection(thd, ER_OUT_OF_RESOURCES);
|
close_connection(thd, ER_OUT_OF_RESOURCES);
|
||||||
#endif
|
|
||||||
errmsg= 0;
|
errmsg= 0;
|
||||||
goto errorconn;
|
goto errorconn;
|
||||||
}
|
}
|
||||||
|
@ -55,11 +55,7 @@ typedef Bitmap<((MAX_INDEXES+7)/8*8)> key_map; /* Used for finding keys */
|
|||||||
some places */
|
some places */
|
||||||
/* Function prototypes */
|
/* Function prototypes */
|
||||||
void kill_mysql(void);
|
void kill_mysql(void);
|
||||||
#ifdef WITH_WSREP
|
|
||||||
void close_connection(THD *thd, uint sql_errno= 0, bool lock=1);
|
|
||||||
#else
|
|
||||||
void close_connection(THD *thd, uint sql_errno= 0);
|
void close_connection(THD *thd, uint sql_errno= 0);
|
||||||
#endif /* WITH_WSREP */
|
|
||||||
void handle_connection_in_main_thread(THD *thd);
|
void handle_connection_in_main_thread(THD *thd);
|
||||||
void create_thread_to_handle_connection(THD *thd);
|
void create_thread_to_handle_connection(THD *thd);
|
||||||
void delete_running_thd(THD *thd);
|
void delete_running_thd(THD *thd);
|
||||||
|
@ -8830,7 +8830,7 @@ bool mysql_notify_thread_having_shared_lock(THD *thd, THD *in_use,
|
|||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
{
|
{
|
||||||
signalled|= mysql_lock_abort_for_thread(thd, thd_table);
|
signalled|= mysql_lock_abort_for_thread(thd, thd_table);
|
||||||
if (thd && WSREP(thd) && wsrep_thd_is_brute_force((void *)thd))
|
if (thd && WSREP(thd) && wsrep_thd_is_BF((void *)thd, true))
|
||||||
{
|
{
|
||||||
WSREP_DEBUG("remove_table_from_cache: %llu",
|
WSREP_DEBUG("remove_table_from_cache: %llu",
|
||||||
(unsigned long long) thd->real_id);
|
(unsigned long long) thd->real_id);
|
||||||
|
@ -1102,11 +1102,7 @@ bool setup_connection_thread_globals(THD *thd)
|
|||||||
{
|
{
|
||||||
if (thd->store_globals())
|
if (thd->store_globals())
|
||||||
{
|
{
|
||||||
#ifdef WITH_WSREP
|
|
||||||
close_connection(thd, ER_OUT_OF_RESOURCES, 1);
|
|
||||||
#else
|
|
||||||
close_connection(thd, ER_OUT_OF_RESOURCES);
|
close_connection(thd, ER_OUT_OF_RESOURCES);
|
||||||
#endif
|
|
||||||
statistic_increment(aborted_connects,&LOCK_status);
|
statistic_increment(aborted_connects,&LOCK_status);
|
||||||
MYSQL_CALLBACK(thd->scheduler, end_thread, (thd, 0));
|
MYSQL_CALLBACK(thd->scheduler, end_thread, (thd, 0));
|
||||||
return 1; // Error
|
return 1; // Error
|
||||||
@ -1351,11 +1347,7 @@ void do_handle_one_connection(THD *thd_arg)
|
|||||||
|
|
||||||
if (MYSQL_CALLBACK_ELSE(thd->scheduler, init_new_connection_thread, (), 0))
|
if (MYSQL_CALLBACK_ELSE(thd->scheduler, init_new_connection_thread, (), 0))
|
||||||
{
|
{
|
||||||
#ifdef WITH_WSREP
|
|
||||||
close_connection(thd, ER_OUT_OF_RESOURCES, 1);
|
|
||||||
#else
|
|
||||||
close_connection(thd, ER_OUT_OF_RESOURCES);
|
close_connection(thd, ER_OUT_OF_RESOURCES);
|
||||||
#endif
|
|
||||||
statistic_increment(aborted_connects,&LOCK_status);
|
statistic_increment(aborted_connects,&LOCK_status);
|
||||||
MYSQL_CALLBACK(thd->scheduler, end_thread, (thd, 0));
|
MYSQL_CALLBACK(thd->scheduler, end_thread, (thd, 0));
|
||||||
return;
|
return;
|
||||||
@ -1413,13 +1405,9 @@ void do_handle_one_connection(THD *thd_arg)
|
|||||||
thd->wsrep_query_state= QUERY_EXITING;
|
thd->wsrep_query_state= QUERY_EXITING;
|
||||||
mysql_mutex_unlock(&thd->LOCK_wsrep_thd);
|
mysql_mutex_unlock(&thd->LOCK_wsrep_thd);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
end_thread:
|
|
||||||
#ifdef WITH_WSREP
|
|
||||||
close_connection(thd, 0, 1);
|
|
||||||
#else
|
|
||||||
close_connection(thd);
|
|
||||||
#endif
|
#endif
|
||||||
|
end_thread:
|
||||||
|
close_connection(thd);
|
||||||
|
|
||||||
if (thd->userstat_running)
|
if (thd->userstat_running)
|
||||||
update_global_user_stats(thd, create_user, time(NULL));
|
update_global_user_stats(thd, create_user, time(NULL));
|
||||||
|
@ -808,11 +808,7 @@ void do_handle_bootstrap(THD *thd)
|
|||||||
if (my_thread_init() || thd->store_globals())
|
if (my_thread_init() || thd->store_globals())
|
||||||
{
|
{
|
||||||
#ifndef EMBEDDED_LIBRARY
|
#ifndef EMBEDDED_LIBRARY
|
||||||
#ifdef WITH_WSREP
|
|
||||||
close_connection(thd, ER_OUT_OF_RESOURCES, 1);
|
|
||||||
#else
|
|
||||||
close_connection(thd, ER_OUT_OF_RESOURCES);
|
close_connection(thd, ER_OUT_OF_RESOURCES);
|
||||||
#endif /* WITH_WSREP */
|
|
||||||
#endif
|
#endif
|
||||||
thd->fatal_error();
|
thd->fatal_error();
|
||||||
goto end;
|
goto end;
|
||||||
@ -7884,7 +7880,7 @@ kill_one_thread(THD *thd, longlong id, killed_state kill_signal, killed_type typ
|
|||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
if (((thd->security_ctx->master_access & SUPER_ACL) ||
|
if (((thd->security_ctx->master_access & SUPER_ACL) ||
|
||||||
thd->security_ctx->user_matches(tmp->security_ctx)) &&
|
thd->security_ctx->user_matches(tmp->security_ctx)) &&
|
||||||
!wsrep_thd_is_brute_force((void *)tmp))
|
!wsrep_thd_is_BF((void *)tmp, true))
|
||||||
#else
|
#else
|
||||||
if ((thd->security_ctx->master_access & SUPER_ACL) ||
|
if ((thd->security_ctx->master_access & SUPER_ACL) ||
|
||||||
thd->security_ctx->user_matches(tmp->security_ctx))
|
thd->security_ctx->user_matches(tmp->security_ctx))
|
||||||
|
@ -663,7 +663,7 @@ void wsrep_init_startup (bool first)
|
|||||||
{
|
{
|
||||||
if (wsrep_init()) unireg_abort(1);
|
if (wsrep_init()) unireg_abort(1);
|
||||||
|
|
||||||
wsrep_thr_lock_init(wsrep_thd_is_brute_force, wsrep_abort_thd,
|
wsrep_thr_lock_init(wsrep_thd_is_BF, wsrep_abort_thd,
|
||||||
wsrep_debug, wsrep_convert_LOCK_to_trx, wsrep_on);
|
wsrep_debug, wsrep_convert_LOCK_to_trx, wsrep_on);
|
||||||
|
|
||||||
/* Skip replication start if no cluster address */
|
/* Skip replication start if no cluster address */
|
||||||
@ -1370,6 +1370,13 @@ int wsrep_to_isolation_begin(THD *thd, char *db_, char *table_,
|
|||||||
DBUG_ASSERT(thd->wsrep_exec_mode == LOCAL_STATE);
|
DBUG_ASSERT(thd->wsrep_exec_mode == LOCAL_STATE);
|
||||||
DBUG_ASSERT(thd->wsrep_trx_meta.gtid.seqno == WSREP_SEQNO_UNDEFINED);
|
DBUG_ASSERT(thd->wsrep_trx_meta.gtid.seqno == WSREP_SEQNO_UNDEFINED);
|
||||||
|
|
||||||
|
if (thd->global_read_lock.can_acquire_protection())
|
||||||
|
{
|
||||||
|
WSREP_DEBUG("Aborting TOI: Global Read-Lock (FTWRL) in place: %s %lu",
|
||||||
|
thd->query(), thd->thread_id);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (wsrep_debug && thd->mdl_context.has_locks())
|
if (wsrep_debug && thd->mdl_context.has_locks())
|
||||||
{
|
{
|
||||||
WSREP_DEBUG("thread holds MDL locks at TI begin: %s %lu",
|
WSREP_DEBUG("thread holds MDL locks at TI begin: %s %lu",
|
||||||
|
@ -473,27 +473,51 @@ void wsrep_create_rollbacker()
|
|||||||
}
|
}
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
int wsrep_thd_is_brute_force(void *thd_ptr)
|
my_bool wsrep_thd_is_BF(void *thd_ptr, my_bool sync)
|
||||||
{
|
{
|
||||||
/*
|
my_bool status = FALSE;
|
||||||
Brute force:
|
if (thd_ptr)
|
||||||
Appliers and replaying are running in REPL_RECV mode. TOI statements
|
{
|
||||||
in TOTAL_ORDER mode. Locally committing transaction that has got
|
THD* thd = (THD*)thd_ptr;
|
||||||
past wsrep->pre_commit() without error is running in LOCAL_COMMIT mode.
|
if (sync) mysql_mutex_lock(&thd->LOCK_wsrep_thd);
|
||||||
|
|
||||||
Everything else is running in LOCAL_STATE and should not be considered
|
status = ((thd->wsrep_exec_mode == REPL_RECV) ||
|
||||||
brute force.
|
(thd->wsrep_exec_mode == TOTAL_ORDER));
|
||||||
*/
|
if (sync) mysql_mutex_unlock(&thd->LOCK_wsrep_thd);
|
||||||
if (thd_ptr) {
|
|
||||||
switch (((THD *)thd_ptr)->wsrep_exec_mode) {
|
|
||||||
case LOCAL_STATE: return 0;
|
|
||||||
case REPL_RECV: return 1;
|
|
||||||
case TOTAL_ORDER: return 2;
|
|
||||||
case LOCAL_COMMIT: return 3;
|
|
||||||
}
|
|
||||||
DBUG_ASSERT(0);
|
|
||||||
}
|
}
|
||||||
return 0;
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
my_bool wsrep_thd_is_BF_or_commit(void *thd_ptr, my_bool sync)
|
||||||
|
{
|
||||||
|
bool status = FALSE;
|
||||||
|
if (thd_ptr)
|
||||||
|
{
|
||||||
|
THD* thd = (THD*)thd_ptr;
|
||||||
|
if (sync) mysql_mutex_lock(&thd->LOCK_wsrep_thd);
|
||||||
|
|
||||||
|
status = ((thd->wsrep_exec_mode == REPL_RECV) ||
|
||||||
|
(thd->wsrep_exec_mode == TOTAL_ORDER) ||
|
||||||
|
(thd->wsrep_exec_mode == LOCAL_COMMIT));
|
||||||
|
if (sync) mysql_mutex_unlock(&thd->LOCK_wsrep_thd);
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
my_bool wsrep_thd_is_local(void *thd_ptr, my_bool sync)
|
||||||
|
{
|
||||||
|
bool status = FALSE;
|
||||||
|
if (thd_ptr)
|
||||||
|
{
|
||||||
|
THD* thd = (THD*)thd_ptr;
|
||||||
|
if (sync) mysql_mutex_lock(&thd->LOCK_wsrep_thd);
|
||||||
|
|
||||||
|
status = (thd->wsrep_exec_mode == LOCAL_STATE);
|
||||||
|
if (sync) mysql_mutex_unlock(&thd->LOCK_wsrep_thd);
|
||||||
|
}
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
|
@ -24,7 +24,9 @@ void wsrep_replay_transaction(THD *thd);
|
|||||||
void wsrep_create_appliers(long threads);
|
void wsrep_create_appliers(long threads);
|
||||||
void wsrep_create_rollbacker();
|
void wsrep_create_rollbacker();
|
||||||
|
|
||||||
extern "C" int wsrep_thd_is_brute_force(void *thd_ptr);
|
extern "C" my_bool wsrep_thd_is_BF(void *thd_ptr, my_bool sync);
|
||||||
|
extern "C" my_bool wsrep_thd_is_BF_or_commit(void *thd_ptr, my_bool sync);
|
||||||
|
extern "C" my_bool wsrep_thd_is_local(void *thd_ptr, my_bool sync);
|
||||||
extern "C" int wsrep_abort_thd(void *bf_thd_ptr, void *victim_thd_ptr,
|
extern "C" int wsrep_abort_thd(void *bf_thd_ptr, void *victim_thd_ptr,
|
||||||
my_bool signal);
|
my_bool signal);
|
||||||
extern "C" int wsrep_thd_in_locking_session(void *thd_ptr);
|
extern "C" int wsrep_thd_in_locking_session(void *thd_ptr);
|
||||||
|
@ -331,7 +331,16 @@ bool wsrep_cluster_address_update (sys_var *self, THD* thd, enum_var_type type)
|
|||||||
bool wsrep_on_saved= thd->variables.wsrep_on;
|
bool wsrep_on_saved= thd->variables.wsrep_on;
|
||||||
thd->variables.wsrep_on= false;
|
thd->variables.wsrep_on= false;
|
||||||
|
|
||||||
|
/* stop replication is heavy operation, and includes closing all client
|
||||||
|
connections. Closing clients may need to get LOCK_global_system_variables
|
||||||
|
at least in MariaDB.
|
||||||
|
|
||||||
|
Note: releasing LOCK_global_system_variables may cause race condition, if
|
||||||
|
there can be several concurrent clients changing wsrep_provider
|
||||||
|
*/
|
||||||
|
mysql_mutex_unlock(&LOCK_global_system_variables);
|
||||||
wsrep_stop_replication(thd);
|
wsrep_stop_replication(thd);
|
||||||
|
mysql_mutex_lock(&LOCK_global_system_variables);
|
||||||
|
|
||||||
if (wsrep_start_replication())
|
if (wsrep_start_replication())
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user