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
parent ad8f2810
......@@ -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;
......@@ -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";
......
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