Commit 71153414 authored by Monty's avatar Monty

Fixed warnings and errors found by buildbot

field.cc
- Fixed warning about overlapping memory copy (backport from 10.0)

Item_subselect.cc
- Fixed core dump in main.view
- Problem was that thd->lex->current_select->master_unit()->item was not set, which caused crash in maxr_as_dependent

sql/mysqld.cc
- Got error on shutdown as we where freeing mutex before all THD objects was freed
  (~THD uses some mutex). Fixed by during shutdown freeing THD inside mutex.

sql/log.cc
- log_space_lock and LOCK_log where locked in inconsistenly. Fixed by not having a log_space_lock around purge_logs.

sql/slave.cc
- Remove unnecessary log_space_lock
- Move cond_broadcast inside lock to ensure we don't miss the signal
parent 7a967021
...@@ -7612,7 +7612,8 @@ int Field_geom::store(const char *from, uint length, CHARSET_INFO *cs) ...@@ -7612,7 +7612,8 @@ int Field_geom::store(const char *from, uint length, CHARSET_INFO *cs)
} }
Field_blob::store_length(length); Field_blob::store_length(length);
if (table->copy_blobs || length <= MAX_FIELD_WIDTH) if ((table->copy_blobs || length <= MAX_FIELD_WIDTH) &&
from != value.ptr())
{ // Must make a copy { // Must make a copy
value.copy(from, length, cs); value.copy(from, length, cs);
from= value.ptr(); from= value.ptr();
......
...@@ -2018,10 +2018,21 @@ Item_in_subselect::create_single_in_to_exists_cond(JOIN *join, ...@@ -2018,10 +2018,21 @@ Item_in_subselect::create_single_in_to_exists_cond(JOIN *join,
*/ */
if (expr && !expr->fixed) if (expr && !expr->fixed)
{ {
bool tmp;
SELECT_LEX *save_current_select= thd->lex->current_select; SELECT_LEX *save_current_select= thd->lex->current_select;
Item_subselect *save_item;
thd->lex->current_select= thd->lex->current_select->outer_select(); thd->lex->current_select= thd->lex->current_select->outer_select();
bool tmp; /*
For st_select_lex::mark_as_dependent, who needs to mark
this sub query as correlated.
*/
save_item= thd->lex->current_select->master_unit()->item;
thd->lex->current_select->master_unit()->item= this;
tmp= expr->fix_fields(thd, 0); tmp= expr->fix_fields(thd, 0);
thd->lex->current_select->master_unit()->item= save_item;
thd->lex->current_select= save_current_select; thd->lex->current_select= save_current_select;
if (tmp) if (tmp)
DBUG_RETURN(true); DBUG_RETURN(true);
......
...@@ -3676,6 +3676,7 @@ int MYSQL_BIN_LOG::purge_first_log(Relay_log_info* rli, bool included) ...@@ -3676,6 +3676,7 @@ int MYSQL_BIN_LOG::purge_first_log(Relay_log_info* rli, bool included)
{ {
int error; int error;
char *to_purge_if_included= NULL; char *to_purge_if_included= NULL;
ulonglong log_space_reclaimed= 0;
DBUG_ENTER("purge_first_log"); DBUG_ENTER("purge_first_log");
DBUG_ASSERT(is_open()); DBUG_ASSERT(is_open());
...@@ -3724,17 +3725,13 @@ int MYSQL_BIN_LOG::purge_first_log(Relay_log_info* rli, bool included) ...@@ -3724,17 +3725,13 @@ int MYSQL_BIN_LOG::purge_first_log(Relay_log_info* rli, bool included)
DBUG_EXECUTE_IF("crash_before_purge_logs", DBUG_SUICIDE();); DBUG_EXECUTE_IF("crash_before_purge_logs", DBUG_SUICIDE(););
mysql_mutex_lock(&rli->log_space_lock);
rli->relay_log.purge_logs(to_purge_if_included, included, rli->relay_log.purge_logs(to_purge_if_included, included,
0, 0, &rli->log_space_total); 0, 0, &log_space_reclaimed);
mysql_mutex_unlock(&rli->log_space_lock);
/* mysql_mutex_lock(&rli->log_space_lock);
Ok to broadcast after the critical region as there is no risk of rli->log_space_total-= log_space_reclaimed;
the mutex being destroyed by this thread later - this helps save
context switches
*/
mysql_cond_broadcast(&rli->log_space_cond); mysql_cond_broadcast(&rli->log_space_cond);
mysql_mutex_unlock(&rli->log_space_lock);
/* /*
* Need to update the log pos because purge logs has been called * Need to update the log pos because purge logs has been called
...@@ -3783,8 +3780,8 @@ int MYSQL_BIN_LOG::update_log_index(LOG_INFO* log_info, bool need_update_threads ...@@ -3783,8 +3780,8 @@ int MYSQL_BIN_LOG::update_log_index(LOG_INFO* log_info, bool need_update_threads
@param need_mutex @param need_mutex
@param need_update_threads If we want to update the log coordinates of @param need_update_threads If we want to update the log coordinates of
all threads. False for relay logs, true otherwise. all threads. False for relay logs, true otherwise.
@param freed_log_space If not null, decrement this variable of @param reclaimeed_log_space If not null, increment this variable to
the amount of log space freed the amount of log space freed
@note @note
If any of the logs before the deleted one is in use, If any of the logs before the deleted one is in use,
...@@ -3800,10 +3797,10 @@ int MYSQL_BIN_LOG::update_log_index(LOG_INFO* log_info, bool need_update_threads ...@@ -3800,10 +3797,10 @@ int MYSQL_BIN_LOG::update_log_index(LOG_INFO* log_info, bool need_update_threads
*/ */
int MYSQL_BIN_LOG::purge_logs(const char *to_log, int MYSQL_BIN_LOG::purge_logs(const char *to_log,
bool included, bool included,
bool need_mutex, bool need_mutex,
bool need_update_threads, bool need_update_threads,
ulonglong *decrease_log_space) ulonglong *reclaimed_space)
{ {
int error= 0; int error= 0;
bool exit_loop= 0; bool exit_loop= 0;
...@@ -3868,7 +3865,7 @@ int MYSQL_BIN_LOG::purge_logs(const char *to_log, ...@@ -3868,7 +3865,7 @@ int MYSQL_BIN_LOG::purge_logs(const char *to_log,
err: err:
/* Read each entry from purge_index_file and delete the file. */ /* Read each entry from purge_index_file and delete the file. */
if (is_inited_purge_index_file() && if (is_inited_purge_index_file() &&
(error= purge_index_entry(thd, decrease_log_space, FALSE))) (error= purge_index_entry(thd, reclaimed_space, FALSE)))
sql_print_error("MSYQL_BIN_LOG::purge_logs failed to process registered files" sql_print_error("MSYQL_BIN_LOG::purge_logs failed to process registered files"
" that would be purged."); " that would be purged.");
close_purge_index_file(); close_purge_index_file();
...@@ -3973,7 +3970,7 @@ int MYSQL_BIN_LOG::register_create_index_entry(const char *entry) ...@@ -3973,7 +3970,7 @@ int MYSQL_BIN_LOG::register_create_index_entry(const char *entry)
DBUG_RETURN(register_purge_index_entry(entry)); DBUG_RETURN(register_purge_index_entry(entry));
} }
int MYSQL_BIN_LOG::purge_index_entry(THD *thd, ulonglong *decrease_log_space, int MYSQL_BIN_LOG::purge_index_entry(THD *thd, ulonglong *reclaimed_space,
bool need_mutex) bool need_mutex)
{ {
DBUG_ENTER("MYSQL_BIN_LOG:purge_index_entry"); DBUG_ENTER("MYSQL_BIN_LOG:purge_index_entry");
...@@ -4093,8 +4090,8 @@ int MYSQL_BIN_LOG::purge_index_entry(THD *thd, ulonglong *decrease_log_space, ...@@ -4093,8 +4090,8 @@ int MYSQL_BIN_LOG::purge_index_entry(THD *thd, ulonglong *decrease_log_space,
DBUG_PRINT("info",("purging %s",log_info.log_file_name)); DBUG_PRINT("info",("purging %s",log_info.log_file_name));
if (!my_delete(log_info.log_file_name, MYF(0))) if (!my_delete(log_info.log_file_name, MYF(0)))
{ {
if (decrease_log_space) if (reclaimed_space)
*decrease_log_space-= s.st_size; *reclaimed_space+= s.st_size;
} }
else else
{ {
......
...@@ -2488,7 +2488,6 @@ void unlink_thd(THD *thd) ...@@ -2488,7 +2488,6 @@ void unlink_thd(THD *thd)
thd->add_status_to_global(); thd->add_status_to_global();
mysql_mutex_lock(&LOCK_thread_count); mysql_mutex_lock(&LOCK_thread_count);
thread_count--;
thd->unlink(); thd->unlink();
/* /*
Used by binlog_reset_master. It would be cleaner to use Used by binlog_reset_master. It would be cleaner to use
...@@ -2496,6 +2495,16 @@ void unlink_thd(THD *thd) ...@@ -2496,6 +2495,16 @@ void unlink_thd(THD *thd)
sync feature has been shut down at this point. sync feature has been shut down at this point.
*/ */
DBUG_EXECUTE_IF("sleep_after_lock_thread_count_before_delete_thd", sleep(5);); DBUG_EXECUTE_IF("sleep_after_lock_thread_count_before_delete_thd", sleep(5););
if (unlikely(abort_loop))
{
/*
During shutdown, we have to delete thd inside the mutex
to not refer to mutexes that may be deleted during shutdown
*/
delete thd;
thd= 0;
}
thread_count--;
mysql_mutex_unlock(&LOCK_thread_count); mysql_mutex_unlock(&LOCK_thread_count);
delete thd; delete thd;
......
...@@ -3556,9 +3556,7 @@ pthread_handler_t handle_slave_sql(void *arg) ...@@ -3556,9 +3556,7 @@ pthread_handler_t handle_slave_sql(void *arg)
rli->clear_error(); rli->clear_error();
//tell the I/O thread to take relay_log_space_limit into account from now on //tell the I/O thread to take relay_log_space_limit into account from now on
mysql_mutex_lock(&rli->log_space_lock);
rli->ignore_log_space_limit= 0; rli->ignore_log_space_limit= 0;
mysql_mutex_unlock(&rli->log_space_lock);
rli->trans_retries= 0; // start from "no error" rli->trans_retries= 0; // start from "no error"
DBUG_PRINT("info", ("rli->trans_retries: %lu", rli->trans_retries)); DBUG_PRINT("info", ("rli->trans_retries: %lu", rli->trans_retries));
...@@ -5228,14 +5226,8 @@ static Log_event* next_event(Relay_log_info* rli) ...@@ -5228,14 +5226,8 @@ static Log_event* next_event(Relay_log_info* rli)
rli->ignore_log_space_limit= true; rli->ignore_log_space_limit= true;
} }
/*
If the I/O thread is blocked, unblock it. Ok to broadcast
after unlock, because the mutex is only destroyed in
~Relay_log_info(), i.e. when rli is destroyed, and rli will
not be destroyed before we exit the present function.
*/
mysql_mutex_unlock(&rli->log_space_lock);
mysql_cond_broadcast(&rli->log_space_cond); mysql_cond_broadcast(&rli->log_space_cond);
mysql_mutex_unlock(&rli->log_space_lock);
// Note that wait_for_update_relay_log unlocks lock_log ! // Note that wait_for_update_relay_log unlocks lock_log !
rli->relay_log.wait_for_update_relay_log(rli->sql_thd); rli->relay_log.wait_for_update_relay_log(rli->sql_thd);
// re-acquire data lock since we released it earlier // re-acquire data lock since we released it earlier
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment