diff options
author | unknown <sasha@mysql.sashanet.com> | 2000-12-14 20:17:18 -0700 |
---|---|---|
committer | unknown <sasha@mysql.sashanet.com> | 2000-12-14 20:17:18 -0700 |
commit | 6aac994eb02eace8e14e5d9911af977c99521737 (patch) | |
tree | 6ce66573de32684888564f6510cde5213520f2f3 | |
parent | 230acc45197b7b7eda5dcf33dbad7ed879116e59 (diff) | |
download | mariadb-git-6aac994eb02eace8e14e5d9911af977c99521737.tar.gz |
client/mysqltest.c
fixed bug that created empty result files in no-record mode
mysql-test/t/rpl000007.test
testing non-replication of load data infile when the table is excluded from replication
mysql-test/t/rpl000016.test
test purge master logs
sql/slave.cc
fix memory leaks found by purge master logs test
sql/sql_repl.cc
fixed race condition and delete before close bug in reset_slave()
Overall comments - coverage testing is a very good thing!
client/mysqltest.c:
fixed bug that created empty result files in no-record mode
mysql-test/t/rpl000007.test:
testing non-replication of load data infile when the table is excluded from replication
mysql-test/t/rpl000016.test:
test purge master logs
sql/slave.cc:
fix memory leaks found by purge master logs test
sql/sql_repl.cc:
fixed race condition and delete before close bug in reset_slave()
-rw-r--r-- | client/mysqltest.c | 6 | ||||
-rw-r--r-- | mysql-test/t/rpl000007.test | 5 | ||||
-rw-r--r-- | mysql-test/t/rpl000016.test | 14 | ||||
-rw-r--r-- | sql/slave.cc | 159 | ||||
-rw-r--r-- | sql/sql_repl.cc | 16 |
5 files changed, 126 insertions, 74 deletions
diff --git a/client/mysqltest.c b/client/mysqltest.c index fd1e4df18ba..9917a91a9cb 100644 --- a/client/mysqltest.c +++ b/client/mysqltest.c @@ -1306,11 +1306,11 @@ int main(int argc, char** argv) close_cons(); - if(result_file) + if(result_file && ds_res.len) { - if(!record && ds_res.len) + if(!record) error |= check_result(&ds_res, result_file); - else + else str_to_file(result_file, ds_res.str, ds_res.len); } dyn_string_end(&ds_res); diff --git a/mysql-test/t/rpl000007.test b/mysql-test/t/rpl000007.test index 2a3748868d3..e6892f4c139 100644 --- a/mysql-test/t/rpl000007.test +++ b/mysql-test/t/rpl000007.test @@ -9,8 +9,9 @@ insert into foo values(4); connection master; use test; drop table if exists foo; -create table foo (n int); -insert into foo values(5); +create table foo (s char(20)); +load data infile '../../std_data/words.dat' into table foo; +insert into foo values('five'); drop table if exists bar; create table bar (m int); insert into bar values(15); diff --git a/mysql-test/t/rpl000016.test b/mysql-test/t/rpl000016.test index 6a89797af8a..f7aca9d4d92 100644 --- a/mysql-test/t/rpl000016.test +++ b/mysql-test/t/rpl000016.test @@ -17,3 +17,17 @@ insert into foo values('Could not break slave'),('Tried hard'); connection slave; sleep 0.3; select * from foo; +connection master; +flush logs; +drop table if exists bar; +create table bar(m int); +insert into bar values (34),(67),(123); +flush logs; +sleep 0.3; +show master logs; +purge master logs to 'master-bin.003'; +show master logs; +insert into bar values (65); +connection slave; +sleep 0.3; +select * from bar; diff --git a/sql/slave.cc b/sql/slave.cc index 86dc3e593af..7ba6d69a204 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -259,7 +259,7 @@ int db_ok(const char* db, I_List<i_string> &do_list, } } -static void init_strvar_from_file(char* var, int max_size, IO_CACHE* f, +static int init_strvar_from_file(char* var, int max_size, IO_CACHE* f, char* default_val) { @@ -272,12 +272,18 @@ static void init_strvar_from_file(char* var, int max_size, IO_CACHE* f, while( ((c=my_b_get(f)) != '\n' && c != my_b_EOF)); // if we truncated a line or stopped on last char, remove all chars // up to and including newline + return 0; } else if(default_val) - strmake(var, default_val, max_size); + { + strmake(var, default_val, max_size); + return 0; + } + + return 1; } -static void init_intvar_from_file(int* var, IO_CACHE* f, +static int init_intvar_from_file(int* var, IO_CACHE* f, int default_val) { char buf[32]; @@ -285,9 +291,14 @@ static void init_intvar_from_file(int* var, IO_CACHE* f, if(my_b_gets(f, buf, sizeof(buf))) { *var = atoi(buf); + return 0; } else if(default_val) - *var = default_val; + { + *var = default_val; + return 0; + } + return 1; } @@ -462,6 +473,8 @@ int init_master_info(MASTER_INFO* mi) || init_io_cache(&mi->file, fd, IO_SIZE*2, READ_CACHE, 0L,0, MYF(MY_WME))) { + if(fd >= 0) + my_close(fd, MYF(0)); pthread_mutex_unlock(&mi->lock); return 1; } @@ -487,6 +500,8 @@ int init_master_info(MASTER_INFO* mi) || init_io_cache(&mi->file, fd, IO_SIZE*2, READ_CACHE, 0L, 0, MYF(MY_WME))) { + if(fd >= 0) + my_close(fd, MYF(0)); pthread_mutex_unlock(&mi->lock); return 1; } @@ -494,6 +509,8 @@ int init_master_info(MASTER_INFO* mi) if(!my_b_gets(&mi->file, mi->log_file_name, sizeof(mi->log_file_name))) { sql_print_error("Error reading log file name from master info file "); + end_io_cache(&mi->file); + my_close(fd, MYF(0)); pthread_mutex_unlock(&mi->lock); return 1; } @@ -503,23 +520,30 @@ int init_master_info(MASTER_INFO* mi) if(!my_b_gets(&mi->file, buf, sizeof(buf))) { sql_print_error("Error reading log file position from master info file"); + end_io_cache(&mi->file); + my_close(fd, MYF(0)); pthread_mutex_unlock(&mi->lock); return 1; } mi->pos = atoi(buf); mi->fd = fd; - init_strvar_from_file(mi->host, sizeof(mi->host), &mi->file, - master_host); - init_strvar_from_file(mi->user, sizeof(mi->user), &mi->file, - master_user); - init_strvar_from_file(mi->password, sizeof(mi->password), &mi->file, - master_password); - - init_intvar_from_file((int*)&mi->port, &mi->file, master_port); - init_intvar_from_file((int*)&mi->connect_retry, &mi->file, - master_connect_retry); - + if(init_strvar_from_file(mi->host, sizeof(mi->host), &mi->file, + master_host) || + init_strvar_from_file(mi->user, sizeof(mi->user), &mi->file, + master_user) || + init_strvar_from_file(mi->password, sizeof(mi->password), &mi->file, + master_password) || + init_intvar_from_file((int*)&mi->port, &mi->file, master_port) || + init_intvar_from_file((int*)&mi->connect_retry, &mi->file, + master_connect_retry)) + { + sql_print_error("Error reading master configuration"); + end_io_cache(&mi->file); + my_close(fd, MYF(0)); + pthread_mutex_unlock(&mi->lock); + return 1; + } } mi->inited = 1; @@ -858,65 +882,72 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len) thd->query_id = query_id++; VOID(pthread_mutex_unlock(&LOCK_thread_count)); - enum enum_duplicates handle_dup = DUP_IGNORE; - if(lev->sql_ex.opt_flags && REPLACE_FLAG) - handle_dup = DUP_REPLACE; - sql_exchange ex((char*)lev->fname, lev->sql_ex.opt_flags && - DUMPFILE_FLAG ); - String field_term(&lev->sql_ex.field_term, 1), - enclosed(&lev->sql_ex.enclosed, 1), - line_term(&lev->sql_ex.line_term,1), - escaped(&lev->sql_ex.escaped, 1), - line_start(&lev->sql_ex.line_start, 1); + TABLE_LIST tables; + bzero((char*) &tables,sizeof(tables)); + tables.db = thd->db; + tables.name = tables.real_name = (char*)lev->table_name; + tables.lock_type = TL_WRITE; + // the table will be opened in mysql_load + if(table_rules_on && !tables_ok(thd, &tables)) + { + skip_load_data_infile(net); + } + else + { + enum enum_duplicates handle_dup = DUP_IGNORE; + if(lev->sql_ex.opt_flags && REPLACE_FLAG) + handle_dup = DUP_REPLACE; + sql_exchange ex((char*)lev->fname, lev->sql_ex.opt_flags && + DUMPFILE_FLAG ); + String field_term(&lev->sql_ex.field_term, 1), + enclosed(&lev->sql_ex.enclosed, 1), + line_term(&lev->sql_ex.line_term,1), + escaped(&lev->sql_ex.escaped, 1), + line_start(&lev->sql_ex.line_start, 1); - ex.field_term = &field_term; - if(lev->sql_ex.empty_flags & FIELD_TERM_EMPTY) - ex.field_term->length(0); + ex.field_term = &field_term; + if(lev->sql_ex.empty_flags & FIELD_TERM_EMPTY) + ex.field_term->length(0); - ex.enclosed = &enclosed; - if(lev->sql_ex.empty_flags & ENCLOSED_EMPTY) - ex.enclosed->length(0); + ex.enclosed = &enclosed; + if(lev->sql_ex.empty_flags & ENCLOSED_EMPTY) + ex.enclosed->length(0); - ex.line_term = &line_term; - if(lev->sql_ex.empty_flags & LINE_TERM_EMPTY) - ex.line_term->length(0); + ex.line_term = &line_term; + if(lev->sql_ex.empty_flags & LINE_TERM_EMPTY) + ex.line_term->length(0); - ex.line_start = &line_start; - if(lev->sql_ex.empty_flags & LINE_START_EMPTY) - ex.line_start->length(0); + ex.line_start = &line_start; + if(lev->sql_ex.empty_flags & LINE_START_EMPTY) + ex.line_start->length(0); - ex.escaped = &escaped; - if(lev->sql_ex.empty_flags & ESCAPED_EMPTY) - ex.escaped->length(0); + ex.escaped = &escaped; + if(lev->sql_ex.empty_flags & ESCAPED_EMPTY) + ex.escaped->length(0); - ex.opt_enclosed = (lev->sql_ex.opt_flags & OPT_ENCLOSED_FLAG); - if(lev->sql_ex.empty_flags & FIELD_TERM_EMPTY) - ex.field_term->length(0); + ex.opt_enclosed = (lev->sql_ex.opt_flags & OPT_ENCLOSED_FLAG); + if(lev->sql_ex.empty_flags & FIELD_TERM_EMPTY) + ex.field_term->length(0); - ex.skip_lines = lev->skip_lines; + ex.skip_lines = lev->skip_lines; - TABLE_LIST tables; - bzero((char*) &tables,sizeof(tables)); - tables.db = thd->db; - tables.name = tables.real_name = (char*)lev->table_name; - tables.lock_type = TL_WRITE; - // the table will be opened in mysql_load - List<Item> fields; - lev->set_fields(fields); - thd->slave_proxy_id = thd->thread_id; - thd->net.vio = net->vio; - // mysql_load will use thd->net to read the file - thd->net.pkt_nr = net->pkt_nr; - // make sure the client does get confused - // about the packet sequence - if(mysql_load(thd, &ex, &tables, fields, handle_dup, 1, - TL_WRITE)) - thd->query_error = 1; - if(thd->cuted_fields) - sql_print_error("Slave: load data infile at position %d in log \ + List<Item> fields; + lev->set_fields(fields); + thd->slave_proxy_id = thd->thread_id; + thd->net.vio = net->vio; + // mysql_load will use thd->net to read the file + thd->net.pkt_nr = net->pkt_nr; + // make sure the client does get confused + // about the packet sequence + if(mysql_load(thd, &ex, &tables, fields, handle_dup, 1, + TL_WRITE)) + thd->query_error = 1; + if(thd->cuted_fields) + sql_print_error("Slave: load data infile at position %d in log \ '%s' produced %d warning(s)", glob_mi.pos, RPL_LOG_NAME, thd->cuted_fields ); - net->pkt_nr = thd->net.pkt_nr; + net->pkt_nr = thd->net.pkt_nr; + } } else // we will just ask the master to send us /dev/null if we do not want to // load the data :-) diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc index e27a77422ad..0aaaf027ea3 100644 --- a/sql/sql_repl.cc +++ b/sql/sql_repl.cc @@ -577,16 +577,22 @@ void reset_slave() { MY_STAT stat_area; char fname[FN_REFLEN]; - bool slave_was_running = slave_running; - - if(slave_running) - stop_slave(0,0); + bool slave_was_running ; + pthread_mutex_lock(&LOCK_slave); + if((slave_was_running = slave_running)) + { + pthread_mutex_unlock(&LOCK_slave); + stop_slave(0,0); + } + else + pthread_mutex_unlock(&LOCK_slave); + + end_master_info(&glob_mi); fn_format(fname, master_info_file, mysql_data_home, "", 4+16+32); if(my_stat(fname, &stat_area, MYF(0))) if(my_delete(fname, MYF(MY_WME))) return; - end_master_info(&glob_mi); if(slave_was_running) start_slave(0,0); } |