summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <sasha@mysql.sashanet.com>2001-03-12 20:17:32 -0700
committerunknown <sasha@mysql.sashanet.com>2001-03-12 20:17:32 -0700
commitf87b3ee44deb4221b525a16a376e2e1f77d964d9 (patch)
tree479dd490b5d379c89c00078b36cfb7a02d867866
parent76d77185fe6d4a2d66aed021e3aa42643e6a63a9 (diff)
downloadmariadb-git-f87b3ee44deb4221b525a16a376e2e1f77d964d9.tar.gz
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
-rw-r--r--mysql-test/t/order_by.test40
-rw-r--r--sql/slave.cc18
-rw-r--r--sql/slave.h1
-rw-r--r--sql/sql_class.cc7
-rw-r--r--sql/sql_class.h51
-rw-r--r--sql/sql_parse.cc16
-rw-r--r--sql/sql_repl.cc3
7 files changed, 118 insertions, 18 deletions
diff --git a/mysql-test/t/order_by.test b/mysql-test/t/order_by.test
index 86d66e6b540..4e5cee0d0ff 100644
--- a/mysql-test/t/order_by.test
+++ b/mysql-test/t/order_by.test
@@ -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;
+
diff --git a/sql/slave.cc b/sql/slave.cc
index e0220a28454..37e11d43573 100644
--- a/sql/slave.cc
+++ b/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;
}
diff --git a/sql/slave.h b/sql/slave.h
index e667cac52eb..048cb3f0100 100644
--- a/sql/slave.h
+++ b/sql/slave.h
@@ -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;
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index 30eeb2e5e2c..1bced49be57 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -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;
}
diff --git a/sql/sql_class.h b/sql/sql_class.h
index f9720a3774a..d1b870852ee 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -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)
{
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 31f59c5b850..1884a8825ba 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -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;
diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc
index e354bb65713..7922ad0eb6a 100644
--- a/sql/sql_repl.cc
+++ b/sql/sql_repl.cc
@@ -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";