merge with 4.0 to get bug fix for SHOW PROCESSLIST + connected slave
This commit is contained in:
commit
12ab0651c6
@ -508,6 +508,14 @@ btr_search_check_guess(
|
|||||||
/*===================*/
|
/*===================*/
|
||||||
/* out: TRUE if success */
|
/* out: TRUE if success */
|
||||||
btr_cur_t* cursor, /* in: guessed cursor position */
|
btr_cur_t* cursor, /* in: guessed cursor position */
|
||||||
|
ibool can_only_compare_to_cursor_rec,
|
||||||
|
/* in: if we do not have a latch on the page
|
||||||
|
of cursor, but only a latch on
|
||||||
|
btr_search_latch, then ONLY the columns
|
||||||
|
of the record UNDER the cursor are
|
||||||
|
protected, not the next or previous record
|
||||||
|
in the chain: we cannot look at the next or
|
||||||
|
previous record to check our guess! */
|
||||||
dtuple_t* tuple, /* in: data tuple */
|
dtuple_t* tuple, /* in: data tuple */
|
||||||
ulint mode, /* in: PAGE_CUR_L, PAGE_CUR_LE, PAGE_CUR_G,
|
ulint mode, /* in: PAGE_CUR_L, PAGE_CUR_LE, PAGE_CUR_G,
|
||||||
or PAGE_CUR_GE */
|
or PAGE_CUR_GE */
|
||||||
@ -566,6 +574,13 @@ btr_search_check_guess(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (can_only_compare_to_cursor_rec) {
|
||||||
|
/* Since we could not determine if our guess is right just by
|
||||||
|
looking at the record under the cursor, return FALSE */
|
||||||
|
|
||||||
|
return(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
match = 0;
|
match = 0;
|
||||||
bytes = 0;
|
bytes = 0;
|
||||||
|
|
||||||
@ -670,6 +685,7 @@ btr_search_guess_on_hash(
|
|||||||
ulint fold;
|
ulint fold;
|
||||||
ulint tuple_n_fields;
|
ulint tuple_n_fields;
|
||||||
dulint tree_id;
|
dulint tree_id;
|
||||||
|
ibool can_only_compare_to_cursor_rec = TRUE;
|
||||||
#ifdef notdefined
|
#ifdef notdefined
|
||||||
btr_cur_t cursor2;
|
btr_cur_t cursor2;
|
||||||
btr_pcur_t pcur;
|
btr_pcur_t pcur;
|
||||||
@ -744,6 +760,8 @@ btr_search_guess_on_hash(
|
|||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
can_only_compare_to_cursor_rec = FALSE;
|
||||||
|
|
||||||
buf_page_dbg_add_level(page, SYNC_TREE_NODE_FROM_HASH);
|
buf_page_dbg_add_level(page, SYNC_TREE_NODE_FROM_HASH);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -775,7 +793,15 @@ btr_search_guess_on_hash(
|
|||||||
fold);
|
fold);
|
||||||
*/
|
*/
|
||||||
} else {
|
} else {
|
||||||
success = btr_search_check_guess(cursor, tuple, mode, mtr);
|
/* If we only have the latch on btr_search_latch, not on the
|
||||||
|
page, it only protects the columns of the record the cursor
|
||||||
|
is positioned on. We cannot look at the next of the previous
|
||||||
|
record to determine if our guess for the cursor position is
|
||||||
|
right. */
|
||||||
|
|
||||||
|
success = btr_search_check_guess(cursor,
|
||||||
|
can_only_compare_to_cursor_rec,
|
||||||
|
tuple, mode, mtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!success) {
|
if (!success) {
|
||||||
|
@ -234,10 +234,16 @@ struct btr_search_sys_struct{
|
|||||||
extern btr_search_sys_t* btr_search_sys;
|
extern btr_search_sys_t* btr_search_sys;
|
||||||
|
|
||||||
/* The latch protecting the adaptive search system: this latch protects the
|
/* The latch protecting the adaptive search system: this latch protects the
|
||||||
(1) positions of records on those pages where a hash index has been built.
|
(1) hash index;
|
||||||
NOTE: It does not protect values of non-ordering fields within a record from
|
(2) columns of a record to which we have a pointer in the hash index;
|
||||||
being updated in-place! We can use fact (1) to perform unique searches to
|
|
||||||
indexes. */
|
but does NOT protect:
|
||||||
|
|
||||||
|
(3) next record offset field in a record;
|
||||||
|
(4) next or previous records on the same page.
|
||||||
|
|
||||||
|
Bear in mind (3) and (4) when using the hash index.
|
||||||
|
*/
|
||||||
|
|
||||||
extern rw_lock_t* btr_search_latch_temp;
|
extern rw_lock_t* btr_search_latch_temp;
|
||||||
|
|
||||||
|
@ -867,10 +867,11 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli)
|
|||||||
|
|
||||||
if (db_ok(thd->db, replicate_do_db, replicate_ignore_db))
|
if (db_ok(thd->db, replicate_do_db, replicate_ignore_db))
|
||||||
{
|
{
|
||||||
thd->query = (char*)query;
|
|
||||||
thd->set_time((time_t)when);
|
thd->set_time((time_t)when);
|
||||||
thd->current_tablenr = 0;
|
thd->current_tablenr = 0;
|
||||||
|
thd->query_length= q_len;
|
||||||
VOID(pthread_mutex_lock(&LOCK_thread_count));
|
VOID(pthread_mutex_lock(&LOCK_thread_count));
|
||||||
|
thd->query = (char*)query;
|
||||||
thd->query_id = query_id++;
|
thd->query_id = query_id++;
|
||||||
VOID(pthread_mutex_unlock(&LOCK_thread_count));
|
VOID(pthread_mutex_unlock(&LOCK_thread_count));
|
||||||
thd->query_error= 0; // clear error
|
thd->query_error= 0; // clear error
|
||||||
@ -928,7 +929,9 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// master could be inconsistent, abort and tell DBA to check/fix it
|
// master could be inconsistent, abort and tell DBA to check/fix it
|
||||||
|
VOID(pthread_mutex_lock(&LOCK_thread_count));
|
||||||
thd->db = thd->query = 0;
|
thd->db = thd->query = 0;
|
||||||
|
VOID(pthread_mutex_unlock(&LOCK_thread_count));
|
||||||
thd->variables.convert_set = 0;
|
thd->variables.convert_set = 0;
|
||||||
close_thread_tables(thd);
|
close_thread_tables(thd);
|
||||||
free_root(&thd->mem_root,0);
|
free_root(&thd->mem_root,0);
|
||||||
@ -936,7 +939,9 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
thd->db= 0; // prevent db from being freed
|
thd->db= 0; // prevent db from being freed
|
||||||
|
VOID(pthread_mutex_lock(&LOCK_thread_count));
|
||||||
thd->query= 0; // just to be sure
|
thd->query= 0; // just to be sure
|
||||||
|
VOID(pthread_mutex_unlock(&LOCK_thread_count));
|
||||||
// assume no convert for next query unless set explictly
|
// assume no convert for next query unless set explictly
|
||||||
thd->variables.convert_set = 0;
|
thd->variables.convert_set = 0;
|
||||||
close_thread_tables(thd);
|
close_thread_tables(thd);
|
||||||
@ -1513,7 +1518,8 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
|
|||||||
{
|
{
|
||||||
init_sql_alloc(&thd->mem_root, 8192,0);
|
init_sql_alloc(&thd->mem_root, 8192,0);
|
||||||
thd->db = rewrite_db((char*)db);
|
thd->db = rewrite_db((char*)db);
|
||||||
thd->query = 0;
|
DBUG_ASSERT(thd->query == 0);
|
||||||
|
thd->query = 0; // Should not be needed
|
||||||
thd->query_error = 0;
|
thd->query_error = 0;
|
||||||
|
|
||||||
if (db_ok(thd->db, replicate_do_db, replicate_ignore_db))
|
if (db_ok(thd->db, replicate_do_db, replicate_ignore_db))
|
||||||
|
21
sql/slave.cc
21
sql/slave.cc
@ -1011,6 +1011,7 @@ static int create_table_from_dump(THD* thd, NET* net, const char* db,
|
|||||||
const char* table_name)
|
const char* table_name)
|
||||||
{
|
{
|
||||||
ulong packet_len = my_net_read(net); // read create table statement
|
ulong packet_len = my_net_read(net); // read create table statement
|
||||||
|
char *query;
|
||||||
Vio* save_vio;
|
Vio* save_vio;
|
||||||
HA_CHECK_OPT check_opt;
|
HA_CHECK_OPT check_opt;
|
||||||
TABLE_LIST tables;
|
TABLE_LIST tables;
|
||||||
@ -1030,15 +1031,23 @@ static int create_table_from_dump(THD* thd, NET* net, const char* db,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
thd->command = COM_TABLE_DUMP;
|
thd->command = COM_TABLE_DUMP;
|
||||||
thd->query = sql_alloc(packet_len + 1);
|
/* Note that we should not set thd->query until the area is initalized */
|
||||||
if (!thd->query)
|
if (!(query = sql_alloc(packet_len + 1)))
|
||||||
{
|
{
|
||||||
sql_print_error("create_table_from_dump: out of memory");
|
sql_print_error("create_table_from_dump: out of memory");
|
||||||
net_printf(thd, ER_GET_ERRNO, "Out of memory");
|
net_printf(thd, ER_GET_ERRNO, "Out of memory");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
memcpy(thd->query, net->read_pos, packet_len);
|
memcpy(query, net->read_pos, packet_len);
|
||||||
thd->query[packet_len] = 0;
|
query[packet_len]= 0;
|
||||||
|
thd->query_length= packet_len;
|
||||||
|
/*
|
||||||
|
We make the following lock in an attempt to ensure that the compiler will
|
||||||
|
not rearrange the code so that thd->query is set too soon
|
||||||
|
*/
|
||||||
|
VOID(pthread_mutex_lock(&LOCK_thread_count));
|
||||||
|
thd->query= query;
|
||||||
|
VOID(pthread_mutex_unlock(&LOCK_thread_count));
|
||||||
thd->current_tablenr = 0;
|
thd->current_tablenr = 0;
|
||||||
thd->query_error = 0;
|
thd->query_error = 0;
|
||||||
thd->net.no_send_ok = 1;
|
thd->net.no_send_ok = 1;
|
||||||
@ -2272,7 +2281,9 @@ err:
|
|||||||
// print the current replication position
|
// print the current replication position
|
||||||
sql_print_error("Slave I/O thread exiting, read up to log '%s', position %s",
|
sql_print_error("Slave I/O thread exiting, read up to log '%s', position %s",
|
||||||
IO_RPL_LOG_NAME, llstr(mi->master_log_pos,llbuff));
|
IO_RPL_LOG_NAME, llstr(mi->master_log_pos,llbuff));
|
||||||
|
VOID(pthread_mutex_lock(&LOCK_thread_count));
|
||||||
thd->query = thd->db = 0; // extra safety
|
thd->query = thd->db = 0; // extra safety
|
||||||
|
VOID(pthread_mutex_unlock(&LOCK_thread_count));
|
||||||
if (mysql)
|
if (mysql)
|
||||||
{
|
{
|
||||||
mc_mysql_close(mysql);
|
mc_mysql_close(mysql);
|
||||||
@ -2407,7 +2418,9 @@ the slave SQL thread with \"SLAVE START\". We stopped at log \
|
|||||||
RPL_LOG_NAME, llstr(rli->master_log_pos,llbuff));
|
RPL_LOG_NAME, llstr(rli->master_log_pos,llbuff));
|
||||||
|
|
||||||
err:
|
err:
|
||||||
|
VOID(pthread_mutex_lock(&LOCK_thread_count));
|
||||||
thd->query = thd->db = 0; // extra safety
|
thd->query = thd->db = 0; // extra safety
|
||||||
|
VOID(pthread_mutex_unlock(&LOCK_thread_count));
|
||||||
thd->proc_info = "Waiting for slave mutex on exit";
|
thd->proc_info = "Waiting for slave mutex on exit";
|
||||||
pthread_mutex_lock(&rli->run_lock);
|
pthread_mutex_lock(&rli->run_lock);
|
||||||
DBUG_ASSERT(rli->slave_running == 1); // tracking buffer overrun
|
DBUG_ASSERT(rli->slave_running == 1); // tracking buffer overrun
|
||||||
|
@ -949,7 +949,7 @@ int mysql_table_dump(THD* thd, char* db, char* tbl_name, int fd)
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
net_flush(&thd->net);
|
net_flush(&thd->net);
|
||||||
if ((error = table->file->dump(thd,fd)))
|
if ((error= table->file->dump(thd,fd)))
|
||||||
my_error(ER_GET_ERRNO, MYF(0));
|
my_error(ER_GET_ERRNO, MYF(0));
|
||||||
|
|
||||||
err:
|
err:
|
||||||
@ -1054,7 +1054,6 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||||||
tbl_name[tbl_len] = 0;
|
tbl_name[tbl_len] = 0;
|
||||||
if (mysql_table_dump(thd, db, tbl_name, -1))
|
if (mysql_table_dump(thd, db, tbl_name, -1))
|
||||||
send_error(thd); // dump to NET
|
send_error(thd); // dump to NET
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case COM_CHANGE_USER:
|
case COM_CHANGE_USER:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user