Commit 0fd577d0 authored by monty@mashka.mysql.fi's avatar monty@mashka.mysql.fi

Merge work:/my/mysql-4.0 into mashka.mysql.fi:/home/my/mysql-4.0

parents 6b6a024e 04723cf7
...@@ -284,6 +284,7 @@ libmysqld/password.c ...@@ -284,6 +284,7 @@ libmysqld/password.c
libmysqld/procedure.cc libmysqld/procedure.cc
libmysqld/records.cc libmysqld/records.cc
libmysqld/repl_failsafe.cc libmysqld/repl_failsafe.cc
libmysqld/set_var.cc
libmysqld/simple-test libmysqld/simple-test
libmysqld/slave.cc libmysqld/slave.cc
libmysqld/sql_acl.cc libmysqld/sql_acl.cc
...@@ -357,6 +358,8 @@ myisam/myisamlog ...@@ -357,6 +358,8 @@ myisam/myisamlog
myisam/myisampack myisam/myisampack
myisam/test1.MYD myisam/test1.MYD
myisam/test1.MYI myisam/test1.MYI
myisam/test2.MYD
myisam/test2.MYI
mysql-4.0.2-alpha-pc-linux-gnu-i686.tar.gz mysql-4.0.2-alpha-pc-linux-gnu-i686.tar.gz
mysql-4.0.2-alpha.tar.gz mysql-4.0.2-alpha.tar.gz
mysql-max-4.0.2-alpha-pc-linux-gnu-i686.tar.gz mysql-max-4.0.2-alpha-pc-linux-gnu-i686.tar.gz
...@@ -424,6 +427,12 @@ sql-bench/copy-db ...@@ -424,6 +427,12 @@ sql-bench/copy-db
sql-bench/crash-me sql-bench/crash-me
sql-bench/gif/* sql-bench/gif/*
sql-bench/graph-compare-results sql-bench/graph-compare-results
sql-bench/innotest1
sql-bench/innotest1a
sql-bench/innotest1b
sql-bench/innotest2
sql-bench/innotest2a
sql-bench/innotest2b
sql-bench/output/* sql-bench/output/*
sql-bench/run-all-tests sql-bench/run-all-tests
sql-bench/server-cfg sql-bench/server-cfg
...@@ -485,12 +494,3 @@ vio/test-ssl ...@@ -485,12 +494,3 @@ vio/test-ssl
vio/test-sslclient vio/test-sslclient
vio/test-sslserver vio/test-sslserver
vio/viotest-ssl vio/viotest-ssl
sql-bench/innotest1
sql-bench/innotest1a
sql-bench/innotest1b
sql-bench/innotest2
sql-bench/innotest2a
sql-bench/innotest2b
myisam/test2.MYD
myisam/test2.MYI
libmysqld/set_var.cc
...@@ -14373,6 +14373,10 @@ If this is enabled, a user can't create new users with the GRANT ...@@ -14373,6 +14373,10 @@ If this is enabled, a user can't create new users with the GRANT
command, if the user doesn't have @code{INSERT} privilege to the command, if the user doesn't have @code{INSERT} privilege to the
@code{mysql.user} table or any column in this table. @code{mysql.user} table or any column in this table.
@item --skip-bdb
Disable usage of BDB tables. This will save memory and may speed up some
things.
@item --skip-concurrent-insert @item --skip-concurrent-insert
Turn off the ability to select and insert at the same time on @code{MyISAM} Turn off the ability to select and insert at the same time on @code{MyISAM}
tables. (This is only to be used if you think you have found a bug in this tables. (This is only to be used if you think you have found a bug in this
...@@ -14392,6 +14396,10 @@ flush-privileges} or @code{mysqladmin reload}.) ...@@ -14392,6 +14396,10 @@ flush-privileges} or @code{mysqladmin reload}.)
Never use host name cache for faster name-ip resolution, but query DNS server Never use host name cache for faster name-ip resolution, but query DNS server
on every connect instead. @xref{DNS}. on every connect instead. @xref{DNS}.
@item --skip-innodb
Disable usage of Innodb tables. This will save memory and disk space and
speed up some things.
@item --skip-external-locking (was --skip-locking) @item --skip-external-locking (was --skip-locking)
Don't use system locking. To use @code{isamchk} or @code{myisamchk} you must Don't use system locking. To use @code{isamchk} or @code{myisamchk} you must
shut down the server. @xref{Stability}. Note that in MySQL Version shut down the server. @xref{Stability}. Note that in MySQL Version
...@@ -38620,6 +38628,9 @@ an auto-extending 10 MB file @file{ibdata1} to the @code{datadir} ...@@ -38620,6 +38628,9 @@ an auto-extending 10 MB file @file{ibdata1} to the @code{datadir}
of MySQL. (In MySQL-4.0.0 and 4.0.1 the datafile is 64 MB and not of MySQL. (In MySQL-4.0.0 and 4.0.1 the datafile is 64 MB and not
auto-extending.) auto-extending.)
If you don't want to use @code{InnoDB} tables, you can add the
@code{skip-innodb} option to your MySQL option file.
But to get good performance you MUST explicitly set the InnoDB parameters But to get good performance you MUST explicitly set the InnoDB parameters
listed in the following examples. listed in the following examples.
...@@ -40571,13 +40582,14 @@ BDB tables: ...@@ -40571,13 +40582,14 @@ BDB tables:
@item @code{--bdb-no-recover} @tab Don't start Berkeley DB in recover mode. @item @code{--bdb-no-recover} @tab Don't start Berkeley DB in recover mode.
@item @code{--bdb-shared-data} @tab Start Berkeley DB in multi-process mode (Don't use @code{DB_PRIVATE} when initialising Berkeley DB) @item @code{--bdb-shared-data} @tab Start Berkeley DB in multi-process mode (Don't use @code{DB_PRIVATE} when initialising Berkeley DB)
@item @code{--bdb-tmpdir=directory} @tab Berkeley DB tempfile name. @item @code{--bdb-tmpdir=directory} @tab Berkeley DB tempfile name.
@item @code{--skip-bdb} @tab Don't use berkeley db. @item @code{--skip-bdb} @tab Disable usage of BDB tables.
@item @code{-O bdb_max_lock=1000} @tab Set the maximum number of locks possible. @xref{SHOW VARIABLES}. @item @code{-O bdb_max_lock=1000} @tab Set the maximum number of locks possible. @xref{SHOW VARIABLES}.
@end multitable @end multitable
If you use @code{--skip-bdb}, MySQL will not initialise the If you use @code{--skip-bdb}, MySQL will not initialise the
Berkeley DB library and this will save a lot of memory. Of course, Berkeley DB library and this will save a lot of memory. Of course,
you cannot use @code{BDB} tables if you are using this option. you cannot use @code{BDB} tables if you are using this option. If you try
to create an BDB table, MySQL will instead create a MyISAM table.
Normally you should start @code{mysqld} without @code{--bdb-no-recover} if you Normally you should start @code{mysqld} without @code{--bdb-no-recover} if you
intend to use BDB tables. This may, however, give you problems when you intend to use BDB tables. This may, however, give you problems when you
...@@ -50368,6 +50380,8 @@ Fixed some problems with @code{CREATE TABLE ... SELECT function()}. ...@@ -50368,6 +50380,8 @@ Fixed some problems with @code{CREATE TABLE ... SELECT function()}.
@code{mysqld} now has the option @code{--temp-pool} enabled by default as this @code{mysqld} now has the option @code{--temp-pool} enabled by default as this
gives better performance with some operating systems. gives better performance with some operating systems.
@item @item
Fixed hang in @code{CHANGE MASTER TO} if the slave thread died very quickly.
@item
Big cleanup in replication code (less logging, better error messages, etc..) Big cleanup in replication code (less logging, better error messages, etc..)
@item @item
If the @code{--code-file} option is specified, the server calls If the @code{--code-file} option is specified, the server calls
...@@ -112,6 +112,7 @@ typedef struct st_status ...@@ -112,6 +112,7 @@ typedef struct st_status
static HashTable ht; static HashTable ht;
static char **defaults_argv;
enum enum_info_type { INFO_INFO,INFO_ERROR,INFO_RESULT}; enum enum_info_type { INFO_INFO,INFO_ERROR,INFO_RESULT};
typedef enum enum_info_type INFO_TYPE; typedef enum enum_info_type INFO_TYPE;
...@@ -317,15 +318,19 @@ int main(int argc,char *argv[]) ...@@ -317,15 +318,19 @@ int main(int argc,char *argv[])
status.add_to_history=1; status.add_to_history=1;
status.exit_status=1; status.exit_status=1;
load_defaults("my",load_default_groups,&argc,&argv); load_defaults("my",load_default_groups,&argc,&argv);
defaults_argv=argv;
if (get_options(argc, (char **) argv)) if (get_options(argc, (char **) argv))
{ {
free_defaults(defaults_argv);
my_end(0); my_end(0);
exit(1); exit(1);
} }
free_defaults(argv);
if (status.batch && !status.line_buff && if (status.batch && !status.line_buff &&
!(status.line_buff=batch_readline_init(max_allowed_packet+512,stdin))) !(status.line_buff=batch_readline_init(max_allowed_packet+512,stdin)))
{
free_defaults(defaults_argv);
exit(1); exit(1);
}
glob_buffer.realloc(512); glob_buffer.realloc(512);
mysql_server_init(0, NULL, (char**) server_default_groups); mysql_server_init(0, NULL, (char**) server_default_groups);
completion_hash_init(&ht, 128); completion_hash_init(&ht, 128);
...@@ -420,6 +425,7 @@ sig_handler mysql_end(int sig) ...@@ -420,6 +425,7 @@ sig_handler mysql_end(int sig)
my_free(default_prompt,MYF(MY_ALLOW_ZERO_PTR)); my_free(default_prompt,MYF(MY_ALLOW_ZERO_PTR));
my_free(current_prompt,MYF(MY_ALLOW_ZERO_PTR)); my_free(current_prompt,MYF(MY_ALLOW_ZERO_PTR));
mysql_server_end(); mysql_server_end();
free_defaults(defaults_argv);
my_end(info_flag ? MY_CHECK_ERROR | MY_GIVE_INFO : 0); my_end(info_flag ? MY_CHECK_ERROR | MY_GIVE_INFO : 0);
exit(status.exit_status); exit(status.exit_status);
} }
......
...@@ -254,7 +254,10 @@ int main(int argc,char *argv[]) ...@@ -254,7 +254,10 @@ int main(int argc,char *argv[])
load_defaults("my",load_default_groups,&argc,&argv); load_defaults("my",load_default_groups,&argc,&argv);
save_argv = argv; /* Save for free_defaults */ save_argv = argv; /* Save for free_defaults */
if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option))) if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
{
free_defaults(save_argv);
exit(ho_error); exit(ho_error);
}
if (argc == 0) if (argc == 0)
{ {
......
...@@ -471,9 +471,15 @@ int main(int argc, char **argv) ...@@ -471,9 +471,15 @@ int main(int argc, char **argv)
/* argv is changed in the program */ /* argv is changed in the program */
argv_to_free= argv; argv_to_free= argv;
if (get_options(&argc, &argv)) if (get_options(&argc, &argv))
{
free_defaults(argv_to_free);
return(1); return(1);
}
if (!(sock= db_connect(current_host,current_db,current_user,opt_password))) if (!(sock= db_connect(current_host,current_db,current_user,opt_password)))
{
free_defaults(argv_to_free);
return(1); /* purecov: deadcode */ return(1); /* purecov: deadcode */
}
if (lock_tables) if (lock_tables)
lock_table(sock, argc, argv); lock_table(sock, argc, argv);
for (; *argv != NULL; argv++) for (; *argv != NULL; argv++)
......
...@@ -1042,11 +1042,11 @@ int do_let(struct st_query* q) ...@@ -1042,11 +1042,11 @@ int do_let(struct st_query* q)
if (!*p) if (!*p)
die("Missing variable name in let\n"); die("Missing variable name in let\n");
var_name = p; var_name = p;
while(*p && (*p != '=' || isspace(*p))) while (*p && (*p != '=' || isspace(*p)))
p++; p++;
var_name_end = p; var_name_end = p;
if (*p == '=') p++; if (*p == '=') p++;
while(*p && isspace(*p)) while (*p && isspace(*p))
p++; p++;
var_val_start = p; var_val_start = p;
return var_set(var_name, var_name_end, var_val_start, q->end); return var_set(var_name, var_name_end, var_val_start, q->end);
...@@ -1054,9 +1054,10 @@ int do_let(struct st_query* q) ...@@ -1054,9 +1054,10 @@ int do_let(struct st_query* q)
int do_rpl_probe(struct st_query* q __attribute__((unused))) int do_rpl_probe(struct st_query* q __attribute__((unused)))
{ {
DBUG_ENTER("do_rpl_probe");
if (mysql_rpl_probe(&cur_con->mysql)) if (mysql_rpl_probe(&cur_con->mysql))
die("Failed in mysql_rpl_probe(): %s", mysql_error(&cur_con->mysql)); die("Failed in mysql_rpl_probe(): '%s'", mysql_error(&cur_con->mysql));
return 0; DBUG_RETURN(0);
} }
int do_enable_rpl_parse(struct st_query* q __attribute__((unused))) int do_enable_rpl_parse(struct st_query* q __attribute__((unused)))
...@@ -1077,7 +1078,7 @@ int do_sleep(struct st_query* q, my_bool real_sleep) ...@@ -1077,7 +1078,7 @@ int do_sleep(struct st_query* q, my_bool real_sleep)
char* p=q->first_argument; char* p=q->first_argument;
struct timeval t; struct timeval t;
int dec_mul = 1000000; int dec_mul = 1000000;
while(*p && isspace(*p)) p++; while (*p && isspace(*p)) p++;
if (!*p) if (!*p)
die("Missing argument in sleep\n"); die("Missing argument in sleep\n");
t.tv_usec = 0; t.tv_usec = 0;
...@@ -1097,7 +1098,7 @@ int do_sleep(struct st_query* q, my_bool real_sleep) ...@@ -1097,7 +1098,7 @@ int do_sleep(struct st_query* q, my_bool real_sleep)
else else
{ {
t.tv_sec = atoi(p); t.tv_sec = atoi(p);
while(*p && *p != '.' && !isspace(*p)) while (*p && *p != '.' && !isspace(*p))
p++; p++;
if (*p == '.') if (*p == '.')
{ {
...@@ -1308,7 +1309,7 @@ int select_connection(struct st_query* q) ...@@ -1308,7 +1309,7 @@ int select_connection(struct st_query* q)
if (!*p) if (!*p)
die("Missing connection name in connect\n"); die("Missing connection name in connect\n");
name = p; name = p;
while(*p && !isspace(*p)) while (*p && !isspace(*p))
p++; p++;
*p = 0; *p = 0;
...@@ -1334,7 +1335,7 @@ int close_connection(struct st_query* q) ...@@ -1334,7 +1335,7 @@ int close_connection(struct st_query* q)
if (!*p) if (!*p)
die("Missing connection name in connect\n"); die("Missing connection name in connect\n");
name = p; name = p;
while(*p && !isspace(*p)) while (*p && !isspace(*p))
p++; p++;
*p = 0; *p = 0;
...@@ -1790,7 +1791,7 @@ int read_query(struct st_query** q_ptr) ...@@ -1790,7 +1791,7 @@ int read_query(struct st_query** q_ptr)
} }
} }
while(*p && isspace(*p)) p++ ; while (*p && isspace(*p)) p++ ;
if (*p == '@') if (*p == '@')
{ {
p++; p++;
...@@ -2503,7 +2504,7 @@ int main(int argc, char** argv) ...@@ -2503,7 +2504,7 @@ int main(int argc, char** argv)
if (!processed) if (!processed)
{ {
current_line_inc = 0; current_line_inc = 0;
switch(q->type) { switch (q->type) {
case Q_WHILE: do_while(q); break; case Q_WHILE: do_while(q); break;
case Q_END_BLOCK: do_done(q); break; case Q_END_BLOCK: do_done(q); break;
default: current_line_inc = 1; break; default: current_line_inc = 1; break;
......
...@@ -1160,14 +1160,15 @@ static void expand_error(MYSQL* mysql, int error) ...@@ -1160,14 +1160,15 @@ static void expand_error(MYSQL* mysql, int error)
static int get_master(MYSQL* mysql, MYSQL_RES* res, MYSQL_ROW row) static int get_master(MYSQL* mysql, MYSQL_RES* res, MYSQL_ROW row)
{ {
MYSQL* master; MYSQL* master;
DBUG_ENTER("get_master");
if (mysql_num_fields(res) < 3) if (mysql_num_fields(res) < 3)
return 1; /* safety */ DBUG_RETURN(1); /* safety */
/* use the same username and password as the original connection */ /* use the same username and password as the original connection */
if (!(master = spawn_init(mysql, row[0], atoi(row[2]), 0, 0))) if (!(master = spawn_init(mysql, row[0], atoi(row[2]), 0, 0)))
return 1; DBUG_RETURN(1);
mysql->master = master; mysql->master = master;
return 0; DBUG_RETURN(0);
} }
...@@ -1183,18 +1184,19 @@ static int get_slaves_from_master(MYSQL* mysql) ...@@ -1183,18 +1184,19 @@ static int get_slaves_from_master(MYSQL* mysql)
int error = 1; int error = 1;
int has_auth_info; int has_auth_info;
int port_ind; int port_ind;
DBUG_ENTER("get_slaves_from_master");
if (!mysql->net.vio && !mysql_real_connect(mysql,0,0,0,0,0,0,0)) if (!mysql->net.vio && !mysql_real_connect(mysql,0,0,0,0,0,0,0))
{ {
expand_error(mysql, CR_PROBE_MASTER_CONNECT); expand_error(mysql, CR_PROBE_MASTER_CONNECT);
return 1; DBUG_RETURN(1);
} }
if (mysql_query(mysql, "SHOW SLAVE HOSTS") || if (mysql_query(mysql, "SHOW SLAVE HOSTS") ||
!(res = mysql_store_result(mysql))) !(res = mysql_store_result(mysql)))
{ {
expand_error(mysql, CR_PROBE_SLAVE_HOSTS); expand_error(mysql, CR_PROBE_SLAVE_HOSTS);
return 1; DBUG_RETURN(1);
} }
switch (mysql_num_fields(res)) { switch (mysql_num_fields(res)) {
...@@ -1238,15 +1240,17 @@ static int get_slaves_from_master(MYSQL* mysql) ...@@ -1238,15 +1240,17 @@ static int get_slaves_from_master(MYSQL* mysql)
err: err:
if (res) if (res)
mysql_free_result(res); mysql_free_result(res);
return error; DBUG_RETURN(error);
} }
int STDCALL mysql_rpl_probe(MYSQL* mysql) int STDCALL mysql_rpl_probe(MYSQL* mysql)
{ {
MYSQL_RES* res = 0; MYSQL_RES *res= 0;
MYSQL_ROW row; MYSQL_ROW row;
int error = 1; int error = 1;
DBUG_ENTER("mysql_rpl_probe");
/* /*
First determine the replication role of the server we connected to First determine the replication role of the server we connected to
the most reliable way to do this is to run SHOW SLAVE STATUS and see the most reliable way to do this is to run SHOW SLAVE STATUS and see
...@@ -1259,7 +1263,7 @@ int STDCALL mysql_rpl_probe(MYSQL* mysql) ...@@ -1259,7 +1263,7 @@ int STDCALL mysql_rpl_probe(MYSQL* mysql)
!(res = mysql_store_result(mysql))) !(res = mysql_store_result(mysql)))
{ {
expand_error(mysql, CR_PROBE_SLAVE_STATUS); expand_error(mysql, CR_PROBE_SLAVE_STATUS);
return 1; DBUG_RETURN(1);
} }
row= mysql_fetch_row(res); row= mysql_fetch_row(res);
...@@ -1284,7 +1288,7 @@ int STDCALL mysql_rpl_probe(MYSQL* mysql) ...@@ -1284,7 +1288,7 @@ int STDCALL mysql_rpl_probe(MYSQL* mysql)
err: err:
if (res) if (res)
mysql_free_result(res); mysql_free_result(res);
return error; DBUG_RETURN(error);
} }
...@@ -1979,7 +1983,11 @@ static my_bool mysql_reconnect(MYSQL *mysql) ...@@ -1979,7 +1983,11 @@ static my_bool mysql_reconnect(MYSQL *mysql)
if (!mysql_real_connect(&tmp_mysql,mysql->host,mysql->user,mysql->passwd, if (!mysql_real_connect(&tmp_mysql,mysql->host,mysql->user,mysql->passwd,
mysql->db, mysql->port, mysql->unix_socket, mysql->db, mysql->port, mysql->unix_socket,
mysql->client_flag)) mysql->client_flag))
{
mysql->net.last_errno= tmp_mysql.net.last_errno;
strmov(mysql->net.last_error, tmp_mysql.net.last_error);
DBUG_RETURN(1); DBUG_RETURN(1);
}
tmp_mysql.free_me=mysql->free_me; tmp_mysql.free_me=mysql->free_me;
mysql->free_me=0; mysql->free_me=0;
mysql_close(mysql); mysql_close(mysql);
...@@ -2060,7 +2068,7 @@ mysql_close(MYSQL *mysql) ...@@ -2060,7 +2068,7 @@ mysql_close(MYSQL *mysql)
mysql->status=MYSQL_STATUS_READY; /* Force command */ mysql->status=MYSQL_STATUS_READY; /* Force command */
mysql->reconnect=0; mysql->reconnect=0;
simple_command(mysql,COM_QUIT,NullS,0,1); simple_command(mysql,COM_QUIT,NullS,0,1);
end_server(mysql); end_server(mysql); /* Sets mysql->net.vio= 0 */
} }
my_free((gptr) mysql->host_info,MYF(MY_ALLOW_ZERO_PTR)); my_free((gptr) mysql->host_info,MYF(MY_ALLOW_ZERO_PTR));
my_free(mysql->user,MYF(MY_ALLOW_ZERO_PTR)); my_free(mysql->user,MYF(MY_ALLOW_ZERO_PTR));
...@@ -2082,7 +2090,6 @@ mysql_close(MYSQL *mysql) ...@@ -2082,7 +2090,6 @@ mysql_close(MYSQL *mysql)
/* Clear pointers for better safety */ /* Clear pointers for better safety */
mysql->host_info=mysql->user=mysql->passwd=mysql->db=0; mysql->host_info=mysql->user=mysql->passwd=mysql->db=0;
bzero((char*) &mysql->options,sizeof(mysql->options)); bzero((char*) &mysql->options,sizeof(mysql->options));
mysql->net.vio = 0;
/* free/close slave list */ /* free/close slave list */
if (mysql->rpl_pivot) if (mysql->rpl_pivot)
......
...@@ -10,12 +10,14 @@ change master to master_host='127.0.0.1',master_port=MASTER_PORT, ...@@ -10,12 +10,14 @@ change master to master_host='127.0.0.1',master_port=MASTER_PORT,
master_user='root'; master_user='root';
reset master; reset master;
slave start; slave start;
drop table if exists t1; drop table if exists t1, t2, t3, t4;
create temporary table temp_table (a char(80) not null);
insert into temp_table values ("testing temporary tables");
create table t1 (s text); create table t1 (s text);
insert into t1 values('Could not break slave'),('Tried hard'); insert into t1 values('Could not break slave'),('Tried hard');
show slave status; show slave status;
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
127.0.0.1 root MASTER_PORT 60 master-bin.001 234 slave-relay-bin.001 275 master-bin.001 Yes Yes 0 0 234 275 127.0.0.1 root MASTER_PORT 60 master-bin.001 417 slave-relay-bin.001 458 master-bin.001 Yes Yes 0 0 417 458
select * from t1; select * from t1;
s s
Could not break slave Could not break slave
...@@ -30,6 +32,11 @@ Log_name ...@@ -30,6 +32,11 @@ Log_name
master-bin.001 master-bin.001
master-bin.002 master-bin.002
master-bin.003 master-bin.003
create table t3 select * from temp_table;
select * from t3;
a
testing temporary tables
drop table temp_table, t3;
insert into t2 values(1234); insert into t2 values(1234);
set insert_id=1234; set insert_id=1234;
insert into t2 values(NULL); insert into t2 values(NULL);
...@@ -42,7 +49,7 @@ master-bin.003 ...@@ -42,7 +49,7 @@ master-bin.003
insert into t2 values (65); insert into t2 values (65);
show slave status; show slave status;
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
127.0.0.1 root MASTER_PORT 60 master-bin.003 155 slave-relay-bin.001 755 master-bin.003 Yes Yes 0 0 155 755 127.0.0.1 root MASTER_PORT 60 master-bin.003 290 slave-relay-bin.001 1073 master-bin.003 Yes Yes 0 0 290 1073
select * from t2; select * from t2;
m m
34 34
...@@ -50,8 +57,11 @@ m ...@@ -50,8 +57,11 @@ m
67 67
123 123
1234 1234
create temporary table temp_table (a char(80) not null);
insert into temp_table values ("testing temporary tables part 2");
drop table if exists t3; drop table if exists t3;
create table t3 (n int); create table t3 (n int);
create table t4 select * from temp_table;
show master logs; show master logs;
Log_name Log_name
master-bin.003 master-bin.003
...@@ -60,12 +70,13 @@ master-bin.005 ...@@ -60,12 +70,13 @@ master-bin.005
master-bin.006 master-bin.006
show master status; show master status;
File Position Binlog_do_db Binlog_ignore_db File Position Binlog_do_db Binlog_ignore_db
master-bin.006 445 master-bin.006 838
slave stop; select * from t4;
slave start; a
testing temporary tables part 2
show slave status; show slave status;
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
127.0.0.1 root MASTER_PORT 60 master-bin.006 445 slave-relay-bin.004 1229 master-bin.006 Yes Yes 0 0 445 1229 127.0.0.1 root MASTER_PORT 60 master-bin.006 838 slave-relay-bin.001 8034 master-bin.006 Yes Yes 0 0 838 8034
lock tables t3 read; lock tables t3 read;
select count(*) from t3 where n >= 4; select count(*) from t3 where n >= 4;
count(*) count(*)
......
#
# Running test with abort-slave-event-count=1
# This will force slave to reconnect after every event
#
require_manager; require_manager;
connect (master,localhost,root,,test,0,master.sock); connect (master,localhost,root,,test,0,master.sock);
connect (slave,localhost,root,,test,0,slave.sock); connect (slave,localhost,root,,test,0,slave.sock);
......
...@@ -9,13 +9,14 @@ sync_with_master; ...@@ -9,13 +9,14 @@ sync_with_master;
--replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT --replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT
show slave status; show slave status;
change master to master_log_pos=73; change master to master_log_pos=73;
sleep 5;
slave stop; slave stop;
change master to master_log_pos=73; change master to master_log_pos=73;
--replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT --replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT
show slave status; show slave status;
slave start; slave start;
sleep 2; sleep 5;
--replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT --replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT
show slave status; show slave status;
change master to master_log_pos=173; change master to master_log_pos=173;
......
#
# Test are run with max_binlog_size=2048 to force automatic rotation of the
# binary log
# Tests done:
# - Check that slaves reports correct failures if master.info has strange
# modes/information
# - Automatic binary log rotation
# - Ensure that temporary tables works over flush logs and binary log
# changes
# - Test creating a duplicate key error and recover from it
#
connect (master,localhost,root,,test,0,master.sock); connect (master,localhost,root,,test,0,master.sock);
connect (slave,localhost,root,,test,0,slave.sock); connect (slave,localhost,root,,test,0,slave.sock);
system cat /dev/null > var/slave-data/master.info; system cat /dev/null > var/slave-data/master.info;
system chmod 000 var/slave-data/master.info; system chmod 000 var/slave-data/master.info;
connection slave; connection slave;
!slave start; --error 1201
slave start;
system chmod 600 var/slave-data/master.info; system chmod 600 var/slave-data/master.info;
!slave start; --error 1201
slave start;
--replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT --replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT
!eval change master to master_host='127.0.0.1',master_port=$MASTER_MYPORT, !eval change master to master_host='127.0.0.1',master_port=$MASTER_MYPORT,
master_user='root'; master_user='root';
...@@ -18,7 +31,14 @@ reset master; ...@@ -18,7 +31,14 @@ reset master;
connection slave; connection slave;
slave start; slave start;
connection master; connection master;
drop table if exists t1;
drop table if exists t1, t2, t3, t4;
#
# Test FLUSH LOGS
#
create temporary table temp_table (a char(80) not null);
insert into temp_table values ("testing temporary tables");
create table t1 (s text); create table t1 (s text);
insert into t1 values('Could not break slave'),('Tried hard'); insert into t1 values('Could not break slave'),('Tried hard');
save_master_pos; save_master_pos;
...@@ -32,15 +52,24 @@ flush logs; ...@@ -32,15 +52,24 @@ flush logs;
drop table if exists t2; drop table if exists t2;
create table t2(m int not null auto_increment primary key); create table t2(m int not null auto_increment primary key);
insert into t2 values (34),(67),(123); insert into t2 values (34),(67),(123);
save_master_pos;
flush logs; flush logs;
show master logs; show master logs;
create table t3 select * from temp_table;
#now lets make some duplicate key mess and see if we can recover from it save_master_pos;
#first insert a value on the slave
connection slave; connection slave;
sync_with_master; sync_with_master;
select * from t3;
connection master;
drop table temp_table, t3;
#
# Now lets make some duplicate key mess and see if we can recover from it
#
# First insert a value on the slave
connection slave;
insert into t2 values(1234); insert into t2 values(1234);
#same value on the master #same value on the master
...@@ -73,7 +102,14 @@ sync_with_master; ...@@ -73,7 +102,14 @@ sync_with_master;
--replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT --replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT
show slave status; show slave status;
select * from t2; select * from t2;
#
# Test forcing the replication log to rotate
#
connection master; connection master;
create temporary table temp_table (a char(80) not null);
insert into temp_table values ("testing temporary tables part 2");
let $1=100; let $1=100;
drop table if exists t3; drop table if exists t3;
create table t3 (n int); create table t3 (n int);
...@@ -85,13 +121,16 @@ while ($1) ...@@ -85,13 +121,16 @@ while ($1)
dec $1; dec $1;
} }
enable_query_log; enable_query_log;
create table t4 select * from temp_table;
show master logs; show master logs;
show master status; show master status;
save_master_pos; save_master_pos;
connection slave; connection slave;
slave stop; #slave stop;
slave start; #slave start;
sync_with_master; sync_with_master;
select * from t4;
--replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT --replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT
show slave status; show slave status;
# because of concurrent insert, the table may not be up to date # because of concurrent insert, the table may not be up to date
......
...@@ -12,7 +12,7 @@ $opt_f= 0; ...@@ -12,7 +12,7 @@ $opt_f= 0;
$opt_t= 0; $opt_t= 0;
$opt_a = ""; $opt_a = "";
$BSD = -f '/vmunix' || $ENV{"OS"} eq "SunOS4"; $BSD = -f '/vmunix' || $ENV{"OS"} eq "SunOS4" || $^O eq 'darwin';
$LINUX = $^O eq 'linux'; $LINUX = $^O eq 'linux';
$pscmd = $BSD ? "/bin/ps -auxww" : $LINUX ? "/bin/ps axuw" : "/bin/ps -ef"; $pscmd = $BSD ? "/bin/ps -auxww" : $LINUX ? "/bin/ps axuw" : "/bin/ps -ef";
......
...@@ -33,7 +33,6 @@ ...@@ -33,7 +33,6 @@
MYSQL_LOG mysql_log,mysql_update_log,mysql_slow_log,mysql_bin_log; MYSQL_LOG mysql_log,mysql_update_log,mysql_slow_log,mysql_bin_log;
extern I_List<i_string> binlog_do_db, binlog_ignore_db; extern I_List<i_string> binlog_do_db, binlog_ignore_db;
extern ulong max_binlog_size;
static bool test_if_number(const char *str, static bool test_if_number(const char *str,
long *res, bool allow_wildcards); long *res, bool allow_wildcards);
......
...@@ -414,10 +414,8 @@ my_bool mc_mysql_reconnect(MYSQL *mysql) ...@@ -414,10 +414,8 @@ my_bool mc_mysql_reconnect(MYSQL *mysql)
mysql->db, mysql->port, mysql->unix_socket, mysql->db, mysql->port, mysql->unix_socket,
mysql->client_flag, mysql->net.read_timeout)) mysql->client_flag, mysql->net.read_timeout))
{ {
#ifdef NOT_USED mysql->net.last_errno= tmp_mysql.net.last_errno;
mysql->net.last_errno=CR_RECONNECT_FAILED; strmov(mysql->net.last_error, tmp_mysql.net.last_error);
strmov(mysql->net.last_error, ER(mysql->net.last_errno));
#endif
DBUG_RETURN(1); DBUG_RETURN(1);
} }
tmp_mysql.free_me=mysql->free_me; tmp_mysql.free_me=mysql->free_me;
...@@ -888,7 +886,6 @@ mc_mysql_close(MYSQL *mysql) ...@@ -888,7 +886,6 @@ mc_mysql_close(MYSQL *mysql)
/* Clear pointers for better safety */ /* Clear pointers for better safety */
mysql->host_info=mysql->user=mysql->passwd=mysql->db=0; mysql->host_info=mysql->user=mysql->passwd=mysql->db=0;
bzero((char*) &mysql->options,sizeof(mysql->options)); bzero((char*) &mysql->options,sizeof(mysql->options));
mysql->net.vio = 0;
#ifdef HAVE_OPENSSL #ifdef HAVE_OPENSSL
mysql_ssl_clear(mysql); mysql_ssl_clear(mysql);
#endif /* HAVE_OPENSSL */ #endif /* HAVE_OPENSSL */
...@@ -976,12 +973,12 @@ mc_unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields, ...@@ -976,12 +973,12 @@ mc_unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields,
DBUG_RETURN(result); DBUG_RETURN(result);
} }
int int mc_mysql_send_query(MYSQL* mysql, const char* query, uint length)
mc_mysql_send_query(MYSQL* mysql, const char* query, uint length)
{ {
return mc_simple_command(mysql, COM_QUERY, query, length, 1); return mc_simple_command(mysql, COM_QUERY, query, length, 1);
} }
int mc_mysql_read_query_result(MYSQL *mysql) int mc_mysql_read_query_result(MYSQL *mysql)
{ {
uchar *pos; uchar *pos;
......
...@@ -443,14 +443,18 @@ int terminate_slave_thread(THD* thd, pthread_mutex_t* term_lock, ...@@ -443,14 +443,18 @@ int terminate_slave_thread(THD* thd, pthread_mutex_t* term_lock,
} }
int start_slave_thread(pthread_handler h_func, pthread_mutex_t* start_lock, int start_slave_thread(pthread_handler h_func, pthread_mutex_t *start_lock,
pthread_mutex_t *cond_lock, pthread_mutex_t *cond_lock,
pthread_cond_t* start_cond, pthread_cond_t *start_cond,
volatile bool* slave_running, volatile bool *slave_running,
volatile ulong *slave_run_id,
MASTER_INFO* mi) MASTER_INFO* mi)
{ {
pthread_t th; pthread_t th;
ulong start_id;
DBUG_ASSERT(mi->inited); DBUG_ASSERT(mi->inited);
DBUG_ENTER("start_slave_thread");
if (start_lock) if (start_lock)
pthread_mutex_lock(start_lock); pthread_mutex_lock(start_lock);
if (!server_id) if (!server_id)
...@@ -460,7 +464,7 @@ int start_slave_thread(pthread_handler h_func, pthread_mutex_t* start_lock, ...@@ -460,7 +464,7 @@ int start_slave_thread(pthread_handler h_func, pthread_mutex_t* start_lock,
if (start_lock) if (start_lock)
pthread_mutex_unlock(start_lock); pthread_mutex_unlock(start_lock);
sql_print_error("Server id not set, will not start slave"); sql_print_error("Server id not set, will not start slave");
return ER_BAD_SLAVE; DBUG_RETURN(ER_BAD_SLAVE);
} }
if (*slave_running) if (*slave_running)
...@@ -469,39 +473,36 @@ int start_slave_thread(pthread_handler h_func, pthread_mutex_t* start_lock, ...@@ -469,39 +473,36 @@ int start_slave_thread(pthread_handler h_func, pthread_mutex_t* start_lock,
pthread_cond_broadcast(start_cond); pthread_cond_broadcast(start_cond);
if (start_lock) if (start_lock)
pthread_mutex_unlock(start_lock); pthread_mutex_unlock(start_lock);
return ER_SLAVE_MUST_STOP; DBUG_RETURN(ER_SLAVE_MUST_STOP);
} }
start_id= *slave_run_id;
DBUG_PRINT("info",("Creating new slave thread"));
if (pthread_create(&th, &connection_attrib, h_func, (void*)mi)) if (pthread_create(&th, &connection_attrib, h_func, (void*)mi))
{ {
if (start_lock) if (start_lock)
pthread_mutex_unlock(start_lock); pthread_mutex_unlock(start_lock);
return ER_SLAVE_THREAD; DBUG_RETURN(ER_SLAVE_THREAD);
} }
if (start_cond && cond_lock) if (start_cond && cond_lock)
{ {
THD* thd = current_thd; THD* thd = current_thd;
while (!*slave_running) while (start_id == *slave_run_id)
{ {
DBUG_PRINT("sleep",("Waiting for slave thread to start"));
const char* old_msg = thd->enter_cond(start_cond,cond_lock, const char* old_msg = thd->enter_cond(start_cond,cond_lock,
"Waiting for slave thread to start"); "Waiting for slave thread to start");
pthread_cond_wait(start_cond,cond_lock); pthread_cond_wait(start_cond,cond_lock);
thd->exit_cond(old_msg); thd->exit_cond(old_msg);
/*
TODO: in a very rare case of init_slave_thread failing, it is
possible that we can get stuck here since slave_running will not
be set. We need to change slave_running to int and have -1 as
error code.
*/
if (thd->killed) if (thd->killed)
{ {
pthread_mutex_unlock(cond_lock); pthread_mutex_unlock(cond_lock);
return ER_SERVER_SHUTDOWN; DBUG_RETURN(ER_SERVER_SHUTDOWN);
} }
} }
} }
if (start_lock) if (start_lock)
pthread_mutex_unlock(start_lock); pthread_mutex_unlock(start_lock);
return 0; DBUG_RETURN(0);
} }
...@@ -535,13 +536,15 @@ int start_slave_threads(bool need_slave_mutex, bool wait_for_start, ...@@ -535,13 +536,15 @@ int start_slave_threads(bool need_slave_mutex, bool wait_for_start,
if (thread_mask & SLAVE_IO) if (thread_mask & SLAVE_IO)
error=start_slave_thread(handle_slave_io,lock_io,lock_cond_io, error=start_slave_thread(handle_slave_io,lock_io,lock_cond_io,
cond_io,&mi->slave_running, cond_io,
&mi->slave_running, &mi->slave_run_id,
mi); mi);
if (!error && (thread_mask & SLAVE_SQL)) if (!error && (thread_mask & SLAVE_SQL))
{ {
error=start_slave_thread(handle_slave_sql,lock_sql,lock_cond_sql, error=start_slave_thread(handle_slave_sql,lock_sql,lock_cond_sql,
cond_sql, cond_sql,
&mi->rli.slave_running,mi); &mi->rli.slave_running, &mi->rli.slave_run_id,
mi);
if (error) if (error)
terminate_slave_threads(mi, thread_mask & SLAVE_IO, 0); terminate_slave_threads(mi, thread_mask & SLAVE_IO, 0);
} }
...@@ -1807,23 +1810,30 @@ This may also be a network problem, or just a bug in the master or slave code.\ ...@@ -1807,23 +1810,30 @@ This may also be a network problem, or just a bug in the master or slave code.\
/* slave I/O thread */ /* slave I/O thread */
pthread_handler_decl(handle_slave_io,arg) pthread_handler_decl(handle_slave_io,arg)
{ {
THD *thd; // needs to be first for thread_stack
MYSQL *mysql;
MASTER_INFO *mi = (MASTER_INFO*)arg;
char llbuff[22];
uint retry_count;
// needs to call my_thread_init(), otherwise we get a coredump in DBUG_ stuff
my_thread_init();
#ifndef DBUG_OFF #ifndef DBUG_OFF
slave_begin: slave_begin:
#endif #endif
THD *thd; // needs to be first for thread_stack
MYSQL *mysql = NULL ;
MASTER_INFO* mi = (MASTER_INFO*)arg;
char llbuff[22];
uint retry_count= 0;
DBUG_ASSERT(mi->inited); DBUG_ASSERT(mi->inited);
mysql= NULL ;
retry_count= 0;
pthread_mutex_lock(&mi->run_lock); pthread_mutex_lock(&mi->run_lock);
/* Inform waiting threads that slave has started */
mi->slave_run_id++;
#ifndef DBUG_OFF #ifndef DBUG_OFF
mi->events_till_abort = abort_slave_event_count; mi->events_till_abort = abort_slave_event_count;
#endif #endif
// 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_ ! thd= new THD; // note that contructor of THD uses DBUG_ !
DBUG_ENTER("handle_slave_io"); DBUG_ENTER("handle_slave_io");
THD_CHECK_SENTRY(thd); THD_CHECK_SENTRY(thd);
...@@ -2071,26 +2081,32 @@ err: ...@@ -2071,26 +2081,32 @@ err:
pthread_handler_decl(handle_slave_sql,arg) pthread_handler_decl(handle_slave_sql,arg)
{ {
#ifndef DBUG_OFF
slave_begin:
#endif
THD *thd; /* needs to be first for thread_stack */ THD *thd; /* needs to be first for thread_stack */
char llbuff[22],llbuff1[22]; char llbuff[22],llbuff1[22];
RELAY_LOG_INFO* rli = &((MASTER_INFO*)arg)->rli; RELAY_LOG_INFO* rli = &((MASTER_INFO*)arg)->rli;
const char* errmsg=0; const char *errmsg;
// needs to call my_thread_init(), otherwise we get a coredump in DBUG_ stuff
my_thread_init();
#ifndef DBUG_OFF
slave_begin:
#endif
DBUG_ASSERT(rli->inited); DBUG_ASSERT(rli->inited);
pthread_mutex_lock(&rli->run_lock); pthread_mutex_lock(&rli->run_lock);
DBUG_ASSERT(!rli->slave_running); DBUG_ASSERT(!rli->slave_running);
errmsg= 0;
#ifndef DBUG_OFF #ifndef DBUG_OFF
rli->events_till_abort = abort_slave_event_count; rli->events_till_abort = abort_slave_event_count;
#endif #endif
// 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_ !
DBUG_ENTER("handle_slave_sql"); DBUG_ENTER("handle_slave_sql");
thd = new THD; // note that contructor of THD uses DBUG_ !
THD_CHECK_SENTRY(thd); THD_CHECK_SENTRY(thd);
/* Inform waiting threads that slave has started */
rli->slave_run_id++;
pthread_detach_this_thread(); pthread_detach_this_thread();
if (init_slave_thread(thd, SLAVE_THD_SQL)) if (init_slave_thread(thd, SLAVE_THD_SQL))
{ {
......
...@@ -154,6 +154,7 @@ typedef struct st_relay_log_info ...@@ -154,6 +154,7 @@ typedef struct st_relay_log_info
*/ */
volatile uint32 slave_skip_counter; volatile uint32 slave_skip_counter;
volatile ulong abort_pos_wait; /* Incremented on change master */ volatile ulong abort_pos_wait; /* Incremented on change master */
volatile ulong slave_run_id; /* Incremented on slave start */
pthread_mutex_t log_space_lock; pthread_mutex_t log_space_lock;
pthread_cond_t log_space_cond; pthread_cond_t log_space_cond;
THD * sql_thd; THD * sql_thd;
...@@ -171,8 +172,8 @@ typedef struct st_relay_log_info ...@@ -171,8 +172,8 @@ typedef struct st_relay_log_info
st_relay_log_info() st_relay_log_info()
:info_fd(-1),cur_log_fd(-1), cur_log_old_open_count(0), abort_pos_wait(0), :info_fd(-1),cur_log_fd(-1), cur_log_old_open_count(0), abort_pos_wait(0),
inited(0), abort_slave(0), slave_running(0), log_pos_current(0), slave_run_id(0), inited(0), abort_slave(0), slave_running(0),
skip_log_purge(0) log_pos_current(0), skip_log_purge(0)
{ {
relay_log_name[0] = master_log_name[0] = 0; relay_log_name[0] = master_log_name[0] = 0;
bzero(&info_file,sizeof(info_file)); bzero(&info_file,sizeof(info_file));
...@@ -283,11 +284,13 @@ typedef struct st_master_info ...@@ -283,11 +284,13 @@ typedef struct st_master_info
bool inited; bool inited;
bool old_format; /* master binlog is in 3.23 format */ bool old_format; /* master binlog is in 3.23 format */
volatile bool abort_slave, slave_running; volatile bool abort_slave, slave_running;
volatile ulong slave_run_id;
bool ignore_stop_event; bool ignore_stop_event;
st_master_info():fd(-1), io_thd(0), inited(0), old_format(0),abort_slave(0), st_master_info()
slave_running(0) :fd(-1), io_thd(0), inited(0), old_format(0),abort_slave(0),
slave_running(0), slave_run_id(0)
{ {
host[0] = 0; user[0] = 0; password[0] = 0; host[0] = 0; user[0] = 0; password[0] = 0;
bzero(&file, sizeof(file)); bzero(&file, sizeof(file));
...@@ -360,7 +363,8 @@ int start_slave_threads(bool need_slave_mutex, bool wait_for_start, ...@@ -360,7 +363,8 @@ int start_slave_threads(bool need_slave_mutex, bool wait_for_start,
int start_slave_thread(pthread_handler h_func, pthread_mutex_t* start_lock, int start_slave_thread(pthread_handler h_func, pthread_mutex_t* start_lock,
pthread_mutex_t *cond_lock, pthread_mutex_t *cond_lock,
pthread_cond_t* start_cond, pthread_cond_t* start_cond,
volatile bool* slave_running, volatile bool *slave_running,
volatile ulong *slave_run_id,
MASTER_INFO* mi); MASTER_INFO* mi);
/* If fd is -1, dump to NET */ /* If fd is -1, dump to NET */
......
...@@ -477,13 +477,12 @@ public: ...@@ -477,13 +477,12 @@ public:
} }
inline void close_active_vio() inline void close_active_vio()
{ {
pthread_mutex_lock(&LOCK_delete); safe_mutex_assert_owner(&LOCK_delete);
if (active_vio) if (active_vio)
{ {
vio_close(active_vio); vio_close(active_vio);
active_vio = 0; active_vio = 0;
} }
pthread_mutex_unlock(&LOCK_delete);
} }
#endif #endif
void awake(bool prepare_to_die); void awake(bool prepare_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