untested changes to close socket on slave stop for OS's that do not
interrupt I/O after thr_alarm_kill() test case for order by desc coredump mysql-test/t/order_by.test: added test case for order by desc bug sql/slave.cc: close socket on slave stop sql/slave.h: close socket on slave stop sql/sql_class.cc: close socket on slave stop sql/sql_class.h: close socket on slave stop sql/sql_parse.cc: changed kill_one_thread to use prepare_to_die() sql/sql_repl.cc: close socket on slave stop
This commit is contained in:
parent
76d77185fe
commit
f87b3ee44d
@ -165,3 +165,43 @@ insert into t3 (ID, DateOfAction) values (87, '1999-07-19'), (89, '1999-07-19
|
||||
select t3.DateOfAction, t1.TransactionID from t1 join t2 join t3 where t2.ID = t1.TransactionID and t3.ID = t2.GroupID order by t3.DateOfAction, t1.TransactionID;
|
||||
select t3.DateOfAction, t1.TransactionID from t1 join t2 join t3 where t2.ID = t1.TransactionID and t3.ID = t2.GroupID order by t1.TransactionID,t3.DateOfAction;
|
||||
drop table t1,t2,t3;
|
||||
|
||||
#bug reported by Wouter de Jong
|
||||
|
||||
drop table if exists members;
|
||||
CREATE TABLE members (
|
||||
member_id int(11) NOT NULL auto_increment,
|
||||
inschrijf_datum varchar(20) NOT NULL default '',
|
||||
lastchange_datum varchar(20) NOT NULL default '',
|
||||
nickname varchar(20) NOT NULL default '',
|
||||
password varchar(8) NOT NULL default '',
|
||||
voornaam varchar(30) NOT NULL default '',
|
||||
tussenvoegsels varchar(10) NOT NULL default '',
|
||||
achternaam varchar(50) NOT NULL default '',
|
||||
straat varchar(100) NOT NULL default '',
|
||||
postcode varchar(10) NOT NULL default '',
|
||||
wijk varchar(40) NOT NULL default '',
|
||||
plaats varchar(50) NOT NULL default '',
|
||||
telefoon varchar(10) NOT NULL default '',
|
||||
geboortedatum date NOT NULL default '0000-00-00',
|
||||
geslacht varchar(5) NOT NULL default '',
|
||||
email varchar(80) NOT NULL default '',
|
||||
uin varchar(15) NOT NULL default '',
|
||||
homepage varchar(100) NOT NULL default '',
|
||||
internet varchar(15) NOT NULL default '',
|
||||
scherk varchar(30) NOT NULL default '',
|
||||
favo_boek varchar(50) NOT NULL default '',
|
||||
favo_tijdschrift varchar(50) NOT NULL default '',
|
||||
favo_tv varchar(50) NOT NULL default '',
|
||||
favo_eten varchar(50) NOT NULL default '',
|
||||
favo_muziek varchar(30) NOT NULL default '',
|
||||
info text NOT NULL,
|
||||
ipnr varchar(30) NOT NULL default '',
|
||||
PRIMARY KEY (member_id)
|
||||
) TYPE=MyISAM PACK_KEYS=1;
|
||||
|
||||
insert into members (member_id) values (1),(2),(3);
|
||||
select member_id, nickname, voornaam FROM members
|
||||
ORDER by lastchange_datum DESC LIMIT 2;
|
||||
drop table members;
|
||||
|
||||
|
18
sql/slave.cc
18
sql/slave.cc
@ -36,6 +36,7 @@ bool wild_do_table_inited = 0, wild_ignore_table_inited = 0;
|
||||
bool table_rules_on = 0;
|
||||
uint32 slave_skip_counter = 0;
|
||||
static TABLE* save_temporary_tables = 0;
|
||||
THD* slave_thd = 0;
|
||||
// when slave thread exits, we need to remember the temporary tables so we
|
||||
// can re-use them on slave start
|
||||
|
||||
@ -1157,7 +1158,7 @@ pthread_handler_decl(handle_slave,arg __attribute__((unused)))
|
||||
|
||||
// needs to call my_thread_init(), otherwise we get a coredump in DBUG_ stuff
|
||||
my_thread_init();
|
||||
thd = new THD; // note that contructor of THD uses DBUG_ !
|
||||
slave_thd = thd = new THD; // note that contructor of THD uses DBUG_ !
|
||||
thd->set_time();
|
||||
DBUG_ENTER("handle_slave");
|
||||
|
||||
@ -1347,6 +1348,7 @@ position %s",
|
||||
pthread_cond_broadcast(&COND_slave_stopped); // tell the world we are done
|
||||
pthread_mutex_unlock(&LOCK_slave);
|
||||
net_end(&thd->net); // destructor will not free it, because we are weird
|
||||
slave_thd = 0;
|
||||
delete thd;
|
||||
my_thread_end();
|
||||
#ifndef DBUG_OFF
|
||||
@ -1376,8 +1378,13 @@ static int safe_connect(THD* thd, MYSQL* mysql, MASTER_INFO* mi)
|
||||
}
|
||||
|
||||
if(!slave_was_killed)
|
||||
mysql_log.write(thd, COM_CONNECT_OUT, "%s@%s:%d",
|
||||
{
|
||||
mysql_log.write(thd, COM_CONNECT_OUT, "%s@%s:%d",
|
||||
mi->user, mi->host, mi->port);
|
||||
#ifdef STOP_IO_WITH_FD_CLOSE
|
||||
thd->set_active_fd(vio_fd(mysql->net.vio));
|
||||
#endif
|
||||
}
|
||||
|
||||
return slave_was_killed;
|
||||
}
|
||||
@ -1404,11 +1411,16 @@ static int safe_reconnect(THD* thd, MYSQL* mysql, MASTER_INFO* mi)
|
||||
}
|
||||
|
||||
if(!slave_was_killed)
|
||||
sql_print_error("Slave: reconnected to master '%s@%s:%d',\
|
||||
{
|
||||
sql_print_error("Slave: reconnected to master '%s@%s:%d',\
|
||||
replication resumed in log '%s' at position %s", glob_mi.user,
|
||||
glob_mi.host, glob_mi.port,
|
||||
RPL_LOG_NAME,
|
||||
llstr(glob_mi.pos,llbuff));
|
||||
#ifdef STOP_IO_WITH_FD_CLOSE
|
||||
thd->set_active_fd(vio_fd(mysql->net.vio));
|
||||
#endif
|
||||
}
|
||||
|
||||
return slave_was_killed;
|
||||
}
|
||||
|
@ -99,6 +99,7 @@ extern uint32 slave_skip_counter;
|
||||
// have caused errors, and have been manually applied by DBA already
|
||||
|
||||
extern pthread_t slave_real_id;
|
||||
extern THD* slave_thd;
|
||||
extern MASTER_INFO glob_mi;
|
||||
extern HASH replicate_do_table, replicate_ignore_table;
|
||||
extern DYNAMIC_ARRAY replicate_wild_do_table, replicate_wild_ignore_table;
|
||||
|
@ -84,6 +84,10 @@ THD::THD():user_time(0),fatal_error(0),last_insert_id_used(0),
|
||||
query_start_used=0;
|
||||
query_length=col_access=0;
|
||||
query_error=0;
|
||||
#ifdef STOP_IO_WITH_FD_CLOSE
|
||||
active_fd = -1;
|
||||
pthread_mutex_init(&active_fd_lock, NULL);
|
||||
#endif
|
||||
server_id = ::server_id;
|
||||
server_status=SERVER_STATUS_AUTOCOMMIT;
|
||||
next_insert_id=last_insert_id=0;
|
||||
@ -182,6 +186,9 @@ THD::~THD()
|
||||
safeFree(ip);
|
||||
free_root(&mem_root,MYF(0));
|
||||
mysys_var=0; // Safety (shouldn't be needed)
|
||||
#ifdef STOP_IO_WITH_FD_CLOSE
|
||||
pthread_mutex_destroy(&active_fd_lock);
|
||||
#endif
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
@ -21,6 +21,8 @@
|
||||
#pragma interface /* gcc class implementation */
|
||||
#endif
|
||||
|
||||
#include <thr_alarm.h>
|
||||
|
||||
class Query_log_event;
|
||||
class Load_log_event;
|
||||
|
||||
@ -256,6 +258,10 @@ public:
|
||||
#ifndef __WIN__
|
||||
sigset_t signals,block_signals;
|
||||
#endif
|
||||
#ifdef STOP_IO_WITH_FD_CLOSE
|
||||
int active_fd;
|
||||
pthread_mutex_t active_fd_lock;
|
||||
#endif
|
||||
ulonglong next_insert_id,last_insert_id,current_insert_id;
|
||||
ha_rows select_limit,offset_limit,default_select_limit,cuted_fields,
|
||||
max_join_size,sent_row_count;
|
||||
@ -284,6 +290,51 @@ public:
|
||||
THD();
|
||||
~THD();
|
||||
bool store_globals();
|
||||
#ifdef STOP_IO_WITH_FD_CLOSE
|
||||
inline void set_active_fd(int fd)
|
||||
{
|
||||
pthread_mutex_lock(&active_fd_lock);
|
||||
active_fd = fd;
|
||||
pthread_mutex_unlock(&active_fd_lock);
|
||||
}
|
||||
inline void clear_active_fd()
|
||||
{
|
||||
pthread_mutex_lock(&active_fd_lock);
|
||||
active_fd = -1;
|
||||
pthread_mutex_unlock(&active_fd_lock);
|
||||
}
|
||||
inline void close_active_fd()
|
||||
{
|
||||
pthread_mutex_lock(&active_fd_lock);
|
||||
if(active_fd >= 0)
|
||||
{
|
||||
my_close(active_fd, MYF(MY_WME));
|
||||
active_fd = -1;
|
||||
}
|
||||
pthread_mutex_unlock(&active_fd_lock);
|
||||
}
|
||||
#endif
|
||||
inline void prepare_to_die()
|
||||
{
|
||||
thr_alarm_kill(real_id);
|
||||
killed = 1;
|
||||
#ifdef STOP_IO_WITH_FD_CLOSE
|
||||
close_active_fd();
|
||||
#endif
|
||||
if (mysys_var)
|
||||
{
|
||||
pthread_mutex_lock(&mysys_var->mutex);
|
||||
if (!system_thread) // Don't abort locks
|
||||
mysys_var->abort=1;
|
||||
if (mysys_var->current_mutex)
|
||||
{
|
||||
pthread_mutex_lock(mysys_var->current_mutex);
|
||||
pthread_cond_broadcast(mysys_var->current_cond);
|
||||
pthread_mutex_unlock(mysys_var->current_mutex);
|
||||
}
|
||||
pthread_mutex_unlock(&mysys_var->mutex);
|
||||
}
|
||||
}
|
||||
inline const char* enter_cond(pthread_cond_t *cond, pthread_mutex_t* mutex,
|
||||
const char* msg)
|
||||
{
|
||||
|
@ -2778,22 +2778,8 @@ void kill_one_thread(THD *thd, ulong id)
|
||||
if ((thd->master_access & PROCESS_ACL) ||
|
||||
!strcmp(thd->user,tmp->user))
|
||||
{
|
||||
thr_alarm_kill(tmp->real_id);
|
||||
tmp->killed=1;
|
||||
tmp->prepare_to_die();
|
||||
error=0;
|
||||
if (tmp->mysys_var)
|
||||
{
|
||||
pthread_mutex_lock(&tmp->mysys_var->mutex);
|
||||
if (!tmp->system_thread) // Don't abort locks
|
||||
tmp->mysys_var->abort=1;
|
||||
if (tmp->mysys_var->current_mutex)
|
||||
{
|
||||
pthread_mutex_lock(tmp->mysys_var->current_mutex);
|
||||
pthread_cond_broadcast(tmp->mysys_var->current_cond);
|
||||
pthread_mutex_unlock(tmp->mysys_var->current_mutex);
|
||||
}
|
||||
pthread_mutex_unlock(&tmp->mysys_var->mutex);
|
||||
}
|
||||
}
|
||||
else
|
||||
error=ER_KILL_DENIED_ERROR;
|
||||
|
@ -572,6 +572,9 @@ int stop_slave(THD* thd, bool net_report )
|
||||
{
|
||||
abort_slave = 1;
|
||||
thr_alarm_kill(slave_real_id);
|
||||
#ifdef STOP_IO_WITH_FD_CLOSE
|
||||
slave_thd->close_active_fd();
|
||||
#endif
|
||||
// do not abort the slave in the middle of a query, so we do not set
|
||||
// thd->killed for the slave thread
|
||||
thd->proc_info = "waiting for slave to die";
|
||||
|
Loading…
x
Reference in New Issue
Block a user