From d5fa169fd1edc2bf9adfbb1e7acb1b163f27e693 Mon Sep 17 00:00:00 2001 From: "gluh@gluh.mysql.r18.ru" <> Date: Wed, 11 Feb 2004 12:30:20 +0400 Subject: [PATCH 01/65] Fix for bug#2021: Wron error message from the client --- BitKeeper/etc/logging_ok | 1 + libmysql/libmysql.c | 6 ++---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index 777c590ce62..b91c6519e48 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -5,6 +5,7 @@ bar@bar.mysql.r18.ru bar@bar.udmsearch.izhnet.ru bell@sanja.is.com.ua bk@admin.bk +gluh@gluh.mysql.r18.ru greg@gcw.ath.cx greg@mysql.com guilhem@mysql.com diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index c50193c5e2c..eff8c87ee3f 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -438,11 +438,7 @@ simple_command(MYSQL *mysql,enum enum_server_command command, const char *arg, if (mysql->net.vio == 0) { /* Do reconnect if possible */ if (mysql_reconnect(mysql)) - { - net->last_errno=CR_SERVER_GONE_ERROR; - strmov(net->last_error,ER(net->last_errno)); goto end; - } } if (mysql->status != MYSQL_STATUS_READY) { @@ -1610,6 +1606,8 @@ static my_bool mysql_reconnect(MYSQL *mysql) { /* Allov reconnect next time */ mysql->server_status&= ~SERVER_STATUS_IN_TRANS; + mysql->net.last_errno= CR_SERVER_GONE_ERROR; + strmov(mysql->net.last_error, ER(mysql->net.last_errno)); DBUG_RETURN(1); } mysql_init(&tmp_mysql); From 3f50b5204ccf2f68fc22964ac37994d502307b9f Mon Sep 17 00:00:00 2001 From: "vva@eagle.mysql.r18.ru" <> Date: Mon, 16 Feb 2004 18:58:15 +0400 Subject: [PATCH 02/65] fixed bug #2762 "grammar error in myisam/mi_check.c" --- myisam/mi_check.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/myisam/mi_check.c b/myisam/mi_check.c index 89fcfe74cea..e6fe2aa706e 100644 --- a/myisam/mi_check.c +++ b/myisam/mi_check.c @@ -115,7 +115,9 @@ int chk_status(MI_CHECK *param, register MI_INFO *info) /* Don't count this as a real warning, as check can correct this ! */ uint save=param->warning_printed; mi_check_print_warning(param, - "%d clients is using or hasn't closed the table properly", + share->state.open_count==1 ? + "%d client is using or hasn't closed the table properly" : + "%d clients are using or haven't closed the table properly", share->state.open_count); /* If this will be fixed by the check, forget the warning */ if (param->testflag & T_UPDATE_STATE) From bcd14123bc160f0ebbed0a13cdad2a88c0cbd2f2 Mon Sep 17 00:00:00 2001 From: "serg@serg.mylan" <> Date: Sun, 22 Feb 2004 00:19:36 +0100 Subject: [PATCH 03/65] ftb +(+(many -parens)) bug fixed --- myisam/ft_boolean_search.c | 8 +++++--- mysql-test/r/fulltext.result | 4 ++++ mysql-test/t/fulltext.test | 4 +++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/myisam/ft_boolean_search.c b/myisam/ft_boolean_search.c index c7128464228..799022a5a0d 100644 --- a/myisam/ft_boolean_search.c +++ b/myisam/ft_boolean_search.c @@ -55,8 +55,9 @@ static double _nwghts[11]= static double *nwghts=_nwghts+5; /* nwghts[i] = -0.5*1.5**i */ #define FTB_FLAG_TRUNC 1 /* MUST be 1 */ -#define FTB_FLAG_YES 2 /* These two - YES and NO */ -#define FTB_FLAG_NO 4 /* should NEVER be set both */ +#define FTB_FLAG_YES 2 /* no two from these three */ +#define FTB_FLAG_NO 4 /* YES, NO, WONLY */ +#define FTB_FLAG_WONLY 8 /* should be ever set both */ typedef struct st_ftb_expr FTB_EXPR; struct st_ftb_expr @@ -444,7 +445,8 @@ static void _ftb_climb_the_tree(FTB *ftb, FTB_WORD *ftbw, FT_SEG_ITERATOR *ftsi_ ftbe->cur_weight += weight; if (ftbe->yesses < ythresh) break; - yn= (ftbe->yesses++ == ythresh) ? ftbe->flags : 0 ; + if (!(yn & FTB_FLAG_WONLY)) + yn= (ftbe->yesses++ == ythresh) ? ftbe->flags : FTB_FLAG_WONLY ; weight*= ftbe->weight; } } diff --git a/mysql-test/r/fulltext.result b/mysql-test/r/fulltext.result index 651baad266e..738941f63c7 100644 --- a/mysql-test/r/fulltext.result +++ b/mysql-test/r/fulltext.result @@ -117,6 +117,10 @@ MySQL has now support for full-text search select * from t1 where MATCH a,b AGAINST ('"text i"' IN BOOLEAN MODE); a b Full-text indexes are called collections +select * from t1 where MATCH a,b AGAINST ('+(support collections) +foobar*' IN BOOLEAN MODE); +a b +select * from t1 where MATCH a,b AGAINST ('+(+(support collections)) +foobar*' IN BOOLEAN MODE); +a b select * from t1 where MATCH a AGAINST ("search" IN BOOLEAN MODE); a b Full-text search in MySQL implements vector space model diff --git a/mysql-test/t/fulltext.test b/mysql-test/t/fulltext.test index 02657ba3775..774a3b42619 100644 --- a/mysql-test/t/fulltext.test +++ b/mysql-test/t/fulltext.test @@ -18,7 +18,6 @@ select * from t1 where MATCH(a,b) AGAINST ("collections"); select * from t1 where MATCH(a,b) AGAINST ("indexes"); select * from t1 where MATCH(a,b) AGAINST ("indexes collections"); - # add_ft_keys() tests explain select * from t1 where MATCH(a,b) AGAINST ("collections"); @@ -54,6 +53,9 @@ select * from t1 where MATCH a,b AGAINST ('"text search" -"now support"' IN BOOL select * from t1 where MATCH a,b AGAINST ('"text search" +"now support"' IN BOOLEAN MODE); select * from t1 where MATCH a,b AGAINST ('"text i"' IN BOOLEAN MODE); +select * from t1 where MATCH a,b AGAINST ('+(support collections) +foobar*' IN BOOLEAN MODE); +select * from t1 where MATCH a,b AGAINST ('+(+(support collections)) +foobar*' IN BOOLEAN MODE); + # boolean w/o index: select * from t1 where MATCH a AGAINST ("search" IN BOOLEAN MODE); From 5afaf4eaaaa83a976e99fee7a6cc2329cd846c4d Mon Sep 17 00:00:00 2001 From: "guilhem@mysql.com" <> Date: Sun, 22 Feb 2004 11:22:51 +0100 Subject: [PATCH 04/65] Complement to ChangeSet 1.1616.23.1 Fix for BUG#1858 "SQL-Thread stops working when using optimize table". A test for this. --- mysql-test/r/rpl_optimize.result | 27 ++++++++++++++++++++ mysql-test/t/rpl_optimize.test | 43 ++++++++++++++++++++++++++++++++ sql/sql_base.cc | 3 ++- 3 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 mysql-test/r/rpl_optimize.result create mode 100644 mysql-test/t/rpl_optimize.test diff --git a/mysql-test/r/rpl_optimize.result b/mysql-test/r/rpl_optimize.result new file mode 100644 index 00000000000..5ed541516dc --- /dev/null +++ b/mysql-test/r/rpl_optimize.result @@ -0,0 +1,27 @@ +slave stop; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; +reset master; +reset slave; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; +slave start; +create table t1 (a int not null auto_increment primary key, b int, key(b)); +INSERT INTO t1 (a) VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); +INSERT INTO t1 (a) SELECT null FROM t1; +INSERT INTO t1 (a) SELECT null FROM t1; +INSERT INTO t1 (a) SELECT null FROM t1; +INSERT INTO t1 (a) SELECT null FROM t1; +INSERT INTO t1 (a) SELECT null FROM t1; +INSERT INTO t1 (a) SELECT null FROM t1; +INSERT INTO t1 (a) SELECT null FROM t1; +INSERT INTO t1 (a) SELECT null FROM t1; +INSERT INTO t1 (a) SELECT null FROM t1; +INSERT INTO t1 (a) SELECT null FROM t1; +INSERT INTO t1 (a) SELECT null FROM t1; +INSERT INTO t1 (a) SELECT null FROM t1; +INSERT INTO t1 (a) SELECT null FROM t1; +update t1 set b=(a/2*rand()); +delete from t1 order by b limit 10000; +optimize table t1; +Table Op Msg_type Msg_text +test.t1 optimize status OK +drop table t1; diff --git a/mysql-test/t/rpl_optimize.test b/mysql-test/t/rpl_optimize.test new file mode 100644 index 00000000000..9f02b715885 --- /dev/null +++ b/mysql-test/t/rpl_optimize.test @@ -0,0 +1,43 @@ +# Test for BUG#1858 "OPTIMIZE TABLE done by a client +# thread stops the slave SQL thread". +# You can replace OPTIMIZE by REPAIR. + +source include/master-slave.inc; + +create table t1 (a int not null auto_increment primary key, b int, key(b)); +INSERT INTO t1 (a) VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); +INSERT INTO t1 (a) SELECT null FROM t1; +INSERT INTO t1 (a) SELECT null FROM t1; +INSERT INTO t1 (a) SELECT null FROM t1; +INSERT INTO t1 (a) SELECT null FROM t1; +INSERT INTO t1 (a) SELECT null FROM t1; +INSERT INTO t1 (a) SELECT null FROM t1; +INSERT INTO t1 (a) SELECT null FROM t1; +INSERT INTO t1 (a) SELECT null FROM t1; +INSERT INTO t1 (a) SELECT null FROM t1; +INSERT INTO t1 (a) SELECT null FROM t1; +INSERT INTO t1 (a) SELECT null FROM t1; +INSERT INTO t1 (a) SELECT null FROM t1; +INSERT INTO t1 (a) SELECT null FROM t1; +save_master_pos; +# a few updates to force OPTIMIZE to do something +update t1 set b=(a/2*rand()); +delete from t1 order by b limit 10000; + +connection slave; +sync_with_master; +optimize table t1; +connection master; +save_master_pos; +connection slave; +# Bug was that when the INSERT terminated on slave, +# the slave SQL thread got killed by OPTIMIZE. +sync_with_master; # won't work if slave SQL thread stopped + +connection master; # cleanup +drop table t1; +connection slave; +sync_with_master; + +# If the machine is so fast that slave syncs before OPTIMIZE +# starts, this test wil demonstrate nothing but will pass. diff --git a/sql/sql_base.cc b/sql/sql_base.cc index efb008f4a6e..e45471dabb8 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -2364,7 +2364,8 @@ bool remove_table_from_cache(THD *thd, const char *db, const char *table_name, if (table->db_stat) result=1; /* Kill delayed insert threads */ - if (in_use->system_thread && ! in_use->killed) + if ((in_use->system_thread & SYSTEM_THREAD_DELAYED_INSERT) && + ! in_use->killed) { in_use->killed=1; pthread_mutex_lock(&in_use->mysys_var->mutex); From 568121c6fffa28e0899ac75a44f6a66cc73dcb9a Mon Sep 17 00:00:00 2001 From: "marko@hundin.mysql.fi" <> Date: Mon, 23 Feb 2004 12:33:43 +0200 Subject: [PATCH 05/65] configure.in: Removed the unused odbc directory --- innobase/configure.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/innobase/configure.in b/innobase/configure.in index 29309a2c0a5..a0606f10692 100644 --- a/innobase/configure.in +++ b/innobase/configure.in @@ -116,7 +116,7 @@ AC_OUTPUT(Makefile os/Makefile ut/Makefile btr/Makefile dnl eval/Makefile fil/Makefile fsp/Makefile fut/Makefile dnl ha/Makefile ibuf/Makefile include/Makefile dnl lock/Makefile log/Makefile dnl - mach/Makefile mem/Makefile mtr/Makefile odbc/Makefile dnl + mach/Makefile mem/Makefile mtr/Makefile dnl page/Makefile pars/Makefile que/Makefile dnl read/Makefile rem/Makefile row/Makefile dnl srv/Makefile sync/Makefile thr/Makefile trx/Makefile dnl From 74dc9f16bbc32dba7dcf702eb1657935d20eb1e4 Mon Sep 17 00:00:00 2001 From: "Sinisa@sinisa.nasamreza.org" <> Date: Mon, 23 Feb 2004 14:02:32 +0200 Subject: [PATCH 06/65] A fix for double free of memory in mysqlbinlog. --- client/mysqlbinlog.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc index 71819070a85..1be4b3754d0 100644 --- a/client/mysqlbinlog.cc +++ b/client/mysqlbinlog.cc @@ -938,7 +938,7 @@ int main(int argc, char** argv) { if (init_tmpdir(&tmpdir, 0)) exit(1); - dirname_for_local_load= my_tmpdir(&tmpdir); + dirname_for_local_load= my_strdup(my_tmpdir(&tmpdir),MY_WME); } if (load_processor.init()) From 624dd4db7bbc392c149eb5a2ca39c1f2a8bc326d Mon Sep 17 00:00:00 2001 From: "heikki@hundin.mysql.fi" <> Date: Tue, 24 Feb 2004 17:17:02 +0200 Subject: [PATCH 07/65] ut0dbg.h: If there is an assertion failur refer the user to section 6.1 of the InnoDB online manual about forcing recovery --- innobase/include/ut0dbg.h | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/innobase/include/ut0dbg.h b/innobase/include/ut0dbg.h index 802557099fc..54df031067f 100644 --- a/innobase/include/ut0dbg.h +++ b/innobase/include/ut0dbg.h @@ -35,7 +35,11 @@ extern ulint* ut_dbg_null_ptr; fprintf(stderr,\ "\nInnoDB: We intentionally generate a memory trap.\n");\ fprintf(stderr,\ - "InnoDB: Send a detailed bug report to mysql@lists.mysql.com\n");\ + "InnoDB: Send a detailed bug report to mysql@lists.mysql.com\n"\ + "InnoDB: If you get repeated assertion failures or crashes, even\n"\ + "InnoDB: immediately after the mysqld startup, there may be\n"\ + "InnoDB: corruption in the InnoDB tablespace. See section 6.1 of\n"\ + "InnoDB: http://www.innodb.com/ibman.php about forcing recovery.\n");\ ut_dbg_stop_threads = TRUE;\ dbg_i = *(ut_dbg_null_ptr);\ if (dbg_i) {\ @@ -66,7 +70,11 @@ format characters */ fprintf(stderr,\ "\nInnoDB: We intentionally generate a memory trap.\n");\ fprintf(stderr,\ - "InnoDB: Send a detailed bug report to mysql@lists.mysql.com\n");\ + "InnoDB: Send a detailed bug report to mysql@lists.mysql.com\n"\ + "InnoDB: If you get repeated assertion failures or crashes, even\n"\ + "InnoDB: immediately after the mysqld startup, there may be\n"\ + "InnoDB: corruption in the InnoDB tablespace. See section 6.1 of\n"\ + "InnoDB: http://www.innodb.com/ibman.php about forcing recovery.\n");\ ut_dbg_stop_threads = TRUE;\ dbg_i = *(ut_dbg_null_ptr);\ if (dbg_i) {\ @@ -90,7 +98,11 @@ format characters */ fprintf(stderr,\ "InnoDB: We intentionally generate a memory trap.\n");\ fprintf(stderr,\ - "InnoDB: Send a detailed bug report to mysql@lists.mysql.com\n");\ + "InnoDB: Send a detailed bug report to mysql@lists.mysql.com\n"\ + "InnoDB: If you get repeated assertion failures or crashes, even\n"\ + "InnoDB: immediately after the mysqld startup, there may be\n"\ + "InnoDB: corruption in the InnoDB tablespace. See section 6.1 of\n"\ + "InnoDB: http://www.innodb.com/ibman.php about forcing recovery.\n");\ ut_dbg_stop_threads = TRUE;\ dbg_i = *(ut_dbg_null_ptr);\ printf("%lu", dbg_i);\ From b35e1f01bbc4341a074d1fde355ffade6a4aab51 Mon Sep 17 00:00:00 2001 From: "heikki@hundin.mysql.fi" <> Date: Tue, 24 Feb 2004 17:38:47 +0200 Subject: [PATCH 08/65] ha_innodb.cc: Add diagnostic code to analyze an assertion failure in ha_innodb.cc on line 2020 reported by a user (Bug #2903) --- sql/ha_innodb.cc | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index 172f5b969cb..ec384478777 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -2016,8 +2016,27 @@ ha_innobase::write_row( DBUG_ENTER("ha_innobase::write_row"); - ut_a(prebuilt->trx == - (trx_t*) current_thd->transaction.all.innobase_tid); + if (prebuilt->trx != + (trx_t*) current_thd->transaction.all.innobase_tid) { + char err_buf[2000]; + + fprintf(stderr, +"InnoDB: Error: the transaction object for the table handle is at\n" +"InnoDB: %lx, but for the current thread it is at %lx\n", + (ulong)prebuilt->trx, + (ulong)current_thd->transaction.all.innobase_tid); + + ut_sprintf_buf(err_buf, ((byte*)prebuilt) - 100, 200); + fprintf(stderr, +"InnoDB: Dump of 200 bytes around prebuilt: %.1000s\n", err_buf); + + ut_sprintf_buf(err_buf, + ((byte*)(&(current_thd->transaction.all))) - 100, 200); + fprintf(stderr, +"InnoDB: Dump of 200 bytes around transaction.all: %.1000s\n", err_buf); + + ut_a(0); + } statistic_increment(ha_write_count, &LOCK_status); From a9d58d3e96fec4c61802a4550b12b74ca5cb220f Mon Sep 17 00:00:00 2001 From: "serg@serg.mylan" <> Date: Tue, 24 Feb 2004 23:07:45 +0100 Subject: [PATCH 09/65] --set-character-set and --character-sets-dir in myisamchk now work --- myisam/myisamchk.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/myisam/myisamchk.c b/myisam/myisamchk.c index f1deda41f8b..691e3855c73 100644 --- a/myisam/myisamchk.c +++ b/myisam/myisamchk.c @@ -165,7 +165,7 @@ static struct my_option my_long_options[] = 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, {"character-sets-dir", OPT_CHARSETS_DIR, "Directory where character sets are.", - (gptr*) &set_charset_name, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + (gptr*) &charsets_dir, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"check", 'c', "Check table for errors.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, @@ -243,7 +243,7 @@ static struct my_option my_long_options[] = 0, GET_ULL, OPT_ARG, 0, 0, 0, 0, 0, 0}, {"set-character-set", OPT_SET_CHARSET, "Change the character set used by the index", - 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + (gptr*) &set_charset_name, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"set-variable", 'O', "Change the value of a variable. Please note that this option is deprecated; you can set variables directly with --variable-name=value.", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, From fafc130b61a6e29ae8a1e1876adaba2b6a2092eb Mon Sep 17 00:00:00 2001 From: "arjen@bitbike.com" <> Date: Wed, 25 Feb 2004 09:46:43 +1000 Subject: [PATCH 10/65] Inserted comment about lost root pwd procedure in Docs relying on command order in mysqladmin. --- BitKeeper/etc/logging_ok | 1 + client/mysqladmin.c | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index d4a2b4a146d..c51d344aef5 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -6,6 +6,7 @@ Miguel@light.local Sinisa@sinisa.nasamreza.org ahlentz@co3064164-a.rochd1.qld.optusnet.com.au akishkin@work.mysql.com +arjen@bitbike.com arjen@co3064164-a.bitbike.com arjen@fred.bitbike.com arjen@george.bitbike.com diff --git a/client/mysqladmin.c b/client/mysqladmin.c index 95bc17e880b..09e6bf98f1c 100644 --- a/client/mysqladmin.c +++ b/client/mysqladmin.c @@ -420,6 +420,14 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) { const char *status; +/* + MySQL documentation relies on the fact that mysqladmin will + execute commands in the order specified, e.g. + mysqladmin -u root flush-privileges password "newpassword" + to reset a lost root password. + If this behaviour is ever changed, Docs should be notified. +*/ + for (; argc > 0 ; argv++,argc--) { switch (find_type(argv[0],&command_typelib,2)) { From 75ad9e5caaf52db73f194ecf4f39e09c9c18e14c Mon Sep 17 00:00:00 2001 From: "marko@hundin.mysql.fi" <> Date: Wed, 25 Feb 2004 12:44:53 +0200 Subject: [PATCH 11/65] trx0undo.c: Removed bogus assertion --- innobase/trx/trx0undo.c | 1 - 1 file changed, 1 deletion(-) diff --git a/innobase/trx/trx0undo.c b/innobase/trx/trx0undo.c index 34f56dba130..0b82a929878 100644 --- a/innobase/trx/trx0undo.c +++ b/innobase/trx/trx0undo.c @@ -1445,7 +1445,6 @@ trx_undo_reuse_cached( } ut_ad(undo->size == 1); - ut_ad(undo->hdr_page_no == undo->top_page_no); if (undo->id >= TRX_RSEG_N_SLOTS) { fprintf(stderr, "InnoDB: Error: undo->id is %lu\n", undo->id); From 3d750efcb1dc3566df708261b61e8f55b8a46b56 Mon Sep 17 00:00:00 2001 From: "serg@serg.mylan" <> Date: Thu, 26 Feb 2004 01:05:04 +0100 Subject: [PATCH 12/65] do not look for string characters "'` inside comments - bug#539 --- client/mysql.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/mysql.cc b/client/mysql.cc index 15770d2eb52..bcb2e1a6e1a 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -1010,7 +1010,7 @@ static bool add_line(String &buffer,char *line,char *in_string) { // Add found char to buffer if (inchar == *in_string) *in_string=0; - else if (!*in_string && (inchar == '\'' || inchar == '"' || inchar == '`')) + else if (!in_comment && !*in_string && (inchar == '\'' || inchar == '"' || inchar == '`')) *in_string=(char) inchar; *out++ = (char) inchar; if (inchar == '*' && !*in_string) From 709a5d6a8b5b3dc43d45eec27bda9d3f9bc38b57 Mon Sep 17 00:00:00 2001 From: "ulli@morbus.(none)" <> Date: Thu, 26 Feb 2004 19:09:49 +0100 Subject: [PATCH 13/65] fix for bug #2905 - "mysqladmin.c & co fail to use MYSQL_PORT as the default value of the TCP/IP port" --- BitKeeper/etc/logging_ok | 1 + client/mysqladmin.c | 2 +- client/mysqltest.c | 2 +- client/thread_test.c | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index c51d344aef5..dda23f91e70 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -125,6 +125,7 @@ tonu@hundin.mysql.fi tonu@volk.internalnet tonu@x153.internalnet tonu@x3.internalnet +ulli@morbus.(none) venu@work.mysql.com vva@eagle.mysql.r18.ru vva@genie.(none) diff --git a/client/mysqladmin.c b/client/mysqladmin.c index 09e6bf98f1c..6bd2d3caad1 100644 --- a/client/mysqladmin.c +++ b/client/mysqladmin.c @@ -134,7 +134,7 @@ static struct my_option my_long_options[] = NO_ARG, 0, 0, 0, 0, 0, 0}, #endif {"port", 'P', "Port number to use for connection.", (gptr*) &tcp_port, - (gptr*) &tcp_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + (gptr*) &tcp_port, 0, GET_UINT, REQUIRED_ARG, MYSQL_PORT, 0, 0, 0, 0, 0}, {"relative", 'r', "Show difference between current and previous values when used with -i. Currently works only with extended-status.", (gptr*) &opt_relative, (gptr*) &opt_relative, 0, GET_BOOL, NO_ARG, 0, 0, 0, diff --git a/client/mysqltest.c b/client/mysqltest.c index 13f575eaf0a..f41f697ad26 100644 --- a/client/mysqltest.c +++ b/client/mysqltest.c @@ -1879,7 +1879,7 @@ static struct my_option my_long_options[] = {"password", 'p', "Password to use when connecting to server.", 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, {"port", 'P', "Port number to use for connection.", (gptr*) &port, - (gptr*) &port, 0, GET_INT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + (gptr*) &port, 0, GET_INT, REQUIRED_ARG, MYSQL_PORT, 0, 0, 0, 0, 0}, {"quiet", 's', "Suppress all normal output.", (gptr*) &silent, (gptr*) &silent, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"record", 'r', "Record output of test_file into result file.", diff --git a/client/thread_test.c b/client/thread_test.c index 2900ab712e2..66ca45bf1cf 100644 --- a/client/thread_test.c +++ b/client/thread_test.c @@ -104,7 +104,7 @@ static struct my_option my_long_options[] = {"query", 'Q', "Query to execute in each threads", (gptr*) &query, (gptr*) &query, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"port", 'P', "Port number to use for connection", (gptr*) &tcp_port, - (gptr*) &tcp_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + (gptr*) &tcp_port, 0, GET_UINT, REQUIRED_ARG, MYSQL_PORT, 0, 0, 0, 0, 0}, {"socket", 'S', "Socket file to use for connection", (gptr*) &unix_socket, (gptr*) &unix_socket, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"test-count", 'c', "Run test count times (default %d)", From 86932a0b79cb2866fee4f70388d52ff7076ac7f4 Mon Sep 17 00:00:00 2001 From: "heikki@hundin.mysql.fi" <> Date: Fri, 27 Feb 2004 16:54:16 +0200 Subject: [PATCH 14/65] row0upd.c: Fix bug: in a FOREIGN KEY, ON UPDATE CASCADE was not triggered if the update changed a string to another value identical in alphabetical ordering, e.g., abc -> aBc --- innobase/row/row0upd.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/innobase/row/row0upd.c b/innobase/row/row0upd.c index e3725c8b39e..ae373dfc621 100644 --- a/innobase/row/row0upd.c +++ b/innobase/row/row0upd.c @@ -77,8 +77,8 @@ index record. This is only used in foreign key checks and we can assume that index does not contain column prefixes. */ static ibool -row_upd_changes_first_fields( -/*=========================*/ +row_upd_changes_first_fields_binary( +/*================================*/ /* out: TRUE if changes */ dtuple_t* entry, /* in: old value of index entry */ dict_index_t* index, /* in: index of entry */ @@ -196,7 +196,7 @@ row_upd_check_references_constraints( if (foreign->referenced_index == index && (node->is_delete - || row_upd_changes_first_fields(entry, index, + || row_upd_changes_first_fields_binary(entry, index, node->update, foreign->n_fields))) { if (foreign->foreign_table == NULL) { @@ -1048,8 +1048,8 @@ index record. This is only used in foreign key checks and we can assume that index does not contain column prefixes. */ static ibool -row_upd_changes_first_fields( -/*=========================*/ +row_upd_changes_first_fields_binary( +/*================================*/ /* out: TRUE if changes */ dtuple_t* entry, /* in: index entry */ dict_index_t* index, /* in: index of entry */ @@ -1074,15 +1074,16 @@ row_upd_changes_first_fields( col = dict_field_get_col(ind_field); col_pos = dict_col_get_clust_pos(col); + ut_a(ind_field->prefix_len == 0); + for (j = 0; j < n_upd_fields; j++) { upd_field = upd_get_nth_field(update, j); if (col_pos == upd_field->field_no - && (ind_field->prefix_len > 0 - || 0 != cmp_dfield_dfield( + && !dfield_datas_are_binary_equal( dtuple_get_nth_field(entry, i), - &(upd_field->new_val)))) { + &(upd_field->new_val))) { return(TRUE); } } From f4ebcaff4d1a3255afdcfbbe88f4f700f5d12f21 Mon Sep 17 00:00:00 2001 From: "Greg@greg-laptop." <> Date: Fri, 27 Feb 2004 16:51:01 +0100 Subject: [PATCH 15/65] Changes to fix errors encountered in test builds on Windows. --- BitKeeper/etc/logging_ok | 1 + VC++Files/innobase/innobase.dsp | 4 ---- VC++Files/libmysql/libmysql.dsp | 4 ++++ sql/log_event.cc | 2 +- sql/opt_range.cc | 4 ++-- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index c51d344aef5..8db23877ee5 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -2,6 +2,7 @@ Administrador@light. Administrator@co3064164-a. Administrator@co3064164-a.rochd1.qld.optushome.com.au Administrator@fred. +Greg@greg-laptop. Miguel@light.local Sinisa@sinisa.nasamreza.org ahlentz@co3064164-a.rochd1.qld.optusnet.com.au diff --git a/VC++Files/innobase/innobase.dsp b/VC++Files/innobase/innobase.dsp index 83419fc53cc..c50911063ab 100644 --- a/VC++Files/innobase/innobase.dsp +++ b/VC++Files/innobase/innobase.dsp @@ -280,10 +280,6 @@ SOURCE=.\mtr\mtr0mtr.c # End Source File # Begin Source File -SOURCE=.\odbc\odbc0odbc.c -# End Source File -# Begin Source File - SOURCE=.\os\os0file.c # End Source File # Begin Source File diff --git a/VC++Files/libmysql/libmysql.dsp b/VC++Files/libmysql/libmysql.dsp index 923cac29c37..ed8f27ef579 100644 --- a/VC++Files/libmysql/libmysql.dsp +++ b/VC++Files/libmysql/libmysql.dsp @@ -463,6 +463,10 @@ SOURCE=..\strings\strxmov.c # End Source File # Begin Source File +SOURCE=..\strings\strxnmov.c +# End Source File +# Begin Source File + SOURCE=..\mysys\thr_mutex.c # End Source File # Begin Source File diff --git a/sql/log_event.cc b/sql/log_event.cc index 1c10a9a798c..61a1ee24973 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -1556,7 +1556,7 @@ Create_file_log_event::Create_file_log_event(const char* buf, int len, We must make copy of 'buf' as this event may have to live over a rotate log entry when used in mysqlbinlog */ - if (!(event_buf= my_memdup(buf, len, MYF(MY_WME))) || + if (!(event_buf= my_memdup((byte*) buf, len, MYF(MY_WME))) || (copy_log_event(event_buf, len, old_format))) DBUG_VOID_RETURN; diff --git a/sql/opt_range.cc b/sql/opt_range.cc index 0ed5c447486..071c83bb6d2 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -2414,9 +2414,9 @@ get_quick_keys(PARAM *param,QUICK_SELECT *quick,KEY_PART *key, } /* Get range for retrieving rows in QUICK_SELECT::get_next */ - if (!(range= new QUICK_RANGE(param->min_key, + if (!(range= new QUICK_RANGE((const char *) param->min_key, (uint) (tmp_min_key - param->min_key), - param->max_key, + (const char *) param->max_key, (uint) (tmp_max_key - param->max_key), flag))) return 1; // out of memory From e175101a10eb4029e145f348436b2bc9c84f4b15 Mon Sep 17 00:00:00 2001 From: "Greg@greg-laptop." <> Date: Sat, 28 Feb 2004 15:11:16 +0100 Subject: [PATCH 16/65] Fix problem with NT named pipes code (per e-mail thread). --- sql/mysqld.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 4484771d4ed..b4c5ce33277 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -1176,7 +1176,7 @@ static void server_init(void) pipe_name[sizeof(pipe_name)-1]= 0; /* Safety if too long string */ strxnmov(pipe_name, sizeof(pipe_name)-1, "\\\\.\\pipe\\", - unix_socket, NullS); + mysql_unix_port, NullS); bzero((char*) &saPipeSecurity, sizeof(saPipeSecurity) ); bzero((char*) &sdPipeDescriptor, sizeof(sdPipeDescriptor) ); if (!InitializeSecurityDescriptor(&sdPipeDescriptor, From e022ba60634621c698ef0c093085234123eec50e Mon Sep 17 00:00:00 2001 From: "guilhem@mysql.com" <> Date: Mon, 1 Mar 2004 00:46:31 +0100 Subject: [PATCH 17/65] Fix for BUG#3017 "wrong Relay_Log_Pos if Rotate is in the middle of a transaction in relay log" increment 'pending' instead of 'relay_log_pos'. --- mysql-test/r/rpl_trunc_binlog.result | 2 +- sql/log_event.cc | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/mysql-test/r/rpl_trunc_binlog.result b/mysql-test/r/rpl_trunc_binlog.result index 272fa210807..27b7c3c5677 100644 --- a/mysql-test/r/rpl_trunc_binlog.result +++ b/mysql-test/r/rpl_trunc_binlog.result @@ -10,4 +10,4 @@ reset slave; start slave; 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 -127.0.0.1 root MASTER_PORT 1 master-bin.002 4 slave-relay-bin.002 161 master-bin.001 Yes No 0 Rolling back unfinished transaction (no COMMIT or ROLLBACK) from relay log. Probably cause is that the master died while writing the transaction to it's binary log. 0 79 # +127.0.0.1 root MASTER_PORT 1 master-bin.002 4 slave-relay-bin.002 120 master-bin.001 Yes No 0 Rolling back unfinished transaction (no COMMIT or ROLLBACK) from relay log. A probable cause is that the master died while writing the transaction to its binary log. 0 79 # diff --git a/sql/log_event.cc b/sql/log_event.cc index 61a1ee24973..038c17ffaba 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -2121,7 +2121,7 @@ int Start_log_event::exec_event(struct st_relay_log_info* rli) slave_print_error(rli, 0, "\ Rolling back unfinished transaction (no COMMIT or ROLLBACK) from relay log. \ -Probably cause is that the master died while writing the transaction to it's \ +A probable cause is that the master died while writing the transaction to its \ binary log."); return(1); } @@ -2221,13 +2221,15 @@ int Rotate_log_event::exec_event(struct st_relay_log_info* rli) In that case, we don't want to touch the coordinates which correspond to the beginning of the transaction. */ - if (!rli->inside_transaction) + if (rli->inside_transaction) + rli->inc_pending(get_event_len()); + else { memcpy(rli->master_log_name, new_log_ident, ident_len+1); rli->master_log_pos= pos; + rli->relay_log_pos += get_event_len(); DBUG_PRINT("info", ("master_log_pos: %lu", (ulong) rli->master_log_pos)); } - rli->relay_log_pos += get_event_len(); pthread_mutex_unlock(&rli->data_lock); pthread_cond_broadcast(&rli->data_cond); flush_relay_log_info(rli); From bce65d4b76a31bcdc2739afbda7ae6290237f7e4 Mon Sep 17 00:00:00 2001 From: "guilhem@mysql.com" <> Date: Mon, 1 Mar 2004 15:15:58 +0100 Subject: [PATCH 18/65] Fix for BUG#3015 "(binlog, position) stored by InnoDB for a replication slave can be wrong". This code contains conditional #if to distinguish between versions; it should be merged into 4.1 and 5.0. --- sql/ha_innodb.cc | 14 ++++++-------- sql/log_event.cc | 30 +++++++++++++++++++++++++++--- sql/slave.h | 14 +++++++++----- 3 files changed, 42 insertions(+), 16 deletions(-) diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index ec384478777..4d1bbacc3ed 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -938,19 +938,17 @@ innobase_commit_low( return; } - /* TODO: Guilhem should check if master_log_name, pending - etc. are right if the master log gets rotated! Possible bug here. - Comment by Heikki March 4, 2003. */ - if (current_thd->slave_thread) { /* Update the replication position info inside InnoDB */ trx->mysql_master_log_file_name = active_mi->rli.master_log_name; - trx->mysql_master_log_pos = ((ib_longlong) - (active_mi->rli.master_log_pos + - active_mi->rli.event_len + - active_mi->rli.pending)); + trx->mysql_master_log_pos = (ib_longlong) +#if MYSQL_VERSION_ID < 40100 + (active_mi->rli.future_master_log_pos); +#else + (active_mi->rli.future_group_master_log_pos); +#endif } trx_commit_for_mysql(trx); diff --git a/sql/log_event.cc b/sql/log_event.cc index 038c17ffaba..603c8431b03 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -1792,10 +1792,15 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli) /* InnoDB internally stores the master log position it has processed so far; - position to store is really pos + pending + event_len - since we must store the pos of the END of the current log event + position to store is of the END of the current log event. */ - rli->event_len= get_event_len(); +#if MYSQL_VERSION_ID < 40100 + rli->future_master_log_pos= log_pos + get_event_len(); +#elif MYSQL_VERSION_ID < 50000 + rli->future_group_master_log_pos= log_pos + get_event_len(); +#else + rli->future_group_master_log_pos= log_pos; +#endif thd->query_error= 0; // clear error thd->clear_error(); @@ -1935,6 +1940,17 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli, thd->query_error = 0; thd->clear_error(); + if (!use_rli_only_for_errors) + { +#if MYSQL_VERSION_ID < 40100 + rli->future_master_log_pos= log_pos + get_event_len(); +#elif MYSQL_VERSION_ID < 50000 + rli->future_group_master_log_pos= log_pos + get_event_len(); +#else + rli->future_group_master_log_pos= log_pos; +#endif + } + /* We test replicate_*_db rules. Note that we have already prepared the file to load, even if we are going to ignore and delete it now. So it is possible @@ -2392,6 +2408,14 @@ int Execute_load_log_event::exec_event(struct st_relay_log_info* rli) lev->exec_event is the place where the table is loaded (it calls mysql_load()). */ + +#if MYSQL_VERSION_ID < 40100 + rli->future_master_log_pos= log_pos + get_event_len(); +#elif MYSQL_VERSION_ID < 50000 + rli->future_group_master_log_pos= log_pos + get_event_len(); +#else + rli->future_group_master_log_pos= log_pos; +#endif if (lev->exec_event(0,rli,1)) { /* diff --git a/sql/slave.h b/sql/slave.h index ed34c12985a..8331e722a51 100644 --- a/sql/slave.h +++ b/sql/slave.h @@ -177,12 +177,16 @@ typedef struct st_relay_log_info bool ignore_log_space_limit; /* - InnoDB internally stores the master log position it has processed - so far; the position to store is really the sum of - pos + pending + event_len here since we must store the pos of the - END of the current log event + When it commits, InnoDB internally stores the master log position it has + processed so far; the position to store is the one of the end of the + committing event (the COMMIT query event, or the event if in autocommit + mode). */ - int event_len; +#if MYSQL_VERSION_ID < 40100 + ulonglong future_master_log_pos; +#else + ulonglong future_group_master_log_pos; +#endif /* Needed for problems when slave stops and we want to restart it From 08b11e2f66ea3a7b77b250c41181ed64f43799a4 Mon Sep 17 00:00:00 2001 From: "konstantin@mysql.com" <> Date: Tue, 2 Mar 2004 16:01:50 +0300 Subject: [PATCH 19/65] WL#1510: "Implement support for "commercial" binaries on handshake": - server-side variable 'license' added --- sql/set_var.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sql/set_var.cc b/sql/set_var.cc index 475beb798e6..9b605cacb97 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -329,6 +329,11 @@ static sys_var_rand_seed2 sys_rand_seed2("rand_seed2"); static sys_var_thd_ulong sys_default_week_format("default_week_format", &SV::default_week_format); +/* Global read-only variable describing server license */ + +static const char license[]= "GPL"; + + /* List of all variables for initialisation and storage in hash This is sorted in alphabetical order to make it easy to add new variables @@ -508,6 +513,7 @@ struct show_var_st init_vars[]= { {sys_key_buffer_size.name, (char*) &sys_key_buffer_size, SHOW_SYS}, {"language", language, SHOW_CHAR}, {"large_files_support", (char*) &opt_large_files, SHOW_BOOL}, + {"license", (char*) license, SHOW_CHAR}, {sys_local_infile.name, (char*) &sys_local_infile, SHOW_SYS}, #ifdef HAVE_MLOCKALL {"locked_in_memory", (char*) &locked_in_memory, SHOW_BOOL}, From 6fbf1efdc2b8fe54e2508b7468d5a879d71ced47 Mon Sep 17 00:00:00 2001 From: "monty@mashka.mysql.fi" <> Date: Thu, 4 Mar 2004 10:57:30 +0200 Subject: [PATCH 20/65] Indented comment properly --- client/mysqladmin.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/client/mysqladmin.c b/client/mysqladmin.c index 6bd2d3caad1..9fbf7e2d64d 100644 --- a/client/mysqladmin.c +++ b/client/mysqladmin.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000 MySQL AB +/* Copyright (C) 2000-2004 MySQL AB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -409,6 +409,7 @@ static my_bool sql_connect(MYSQL *mysql, uint wait) } } + /* Execute a command. Return 0 on ok @@ -420,13 +421,13 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) { const char *status; -/* - MySQL documentation relies on the fact that mysqladmin will - execute commands in the order specified, e.g. - mysqladmin -u root flush-privileges password "newpassword" - to reset a lost root password. - If this behaviour is ever changed, Docs should be notified. -*/ + /* + MySQL documentation relies on the fact that mysqladmin will + execute commands in the order specified, e.g. + mysqladmin -u root flush-privileges password "newpassword" + to reset a lost root password. + If this behaviour is ever changed, Docs should be notified. + */ for (; argc > 0 ; argv++,argc--) { From 995b74ee0db22aeacbfe8f4d19cef94b2fa4000d Mon Sep 17 00:00:00 2001 From: "heikki@hundin.mysql.fi" <> Date: Thu, 4 Mar 2004 15:32:16 +0200 Subject: [PATCH 21/65] srv0srv.c: Protect the reading of the latest foreign key error explantion buffer with a mutex; in theory, a race condition could cause SHOW INNODB STATUS print garbage characters after the error info; remove the sprintf of the latest UNIQUE KEY error, since the buffer really was always empty --- innobase/srv/srv0srv.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/innobase/srv/srv0srv.c b/innobase/srv/srv0srv.c index cea17e9f223..2bb3e8ea60c 100644 --- a/innobase/srv/srv0srv.c +++ b/innobase/srv/srv0srv.c @@ -1434,6 +1434,13 @@ srv_sprintf_innodb_monitor( buf = buf + strlen(buf); ut_a(buf < buf_end + 1500); + /* Conceptually, srv_innodb_monitor_mutex has a very high latching + order level in sync0sync.h, while dict_foreign_err_mutex has a very + low level 135. Therefore we can reserve the latter mutex here without + a danger of a deadlock of threads. */ + + mutex_enter(&dict_foreign_err_mutex); + if (*dict_foreign_err_buf != '\0') { buf += sprintf(buf, "------------------------\n" @@ -1445,18 +1452,7 @@ srv_sprintf_innodb_monitor( } } - ut_a(buf < buf_end + 1500); - - if (*dict_unique_err_buf != '\0') { - buf += sprintf(buf, -"---------------------------------------------------------------\n" -"LATEST UNIQUE KEY ERROR (is masked in REPLACE or INSERT IGNORE)\n" -"---------------------------------------------------------------\n"); - - if (buf_end - buf > 6000) { - buf+= sprintf(buf, "%.4000s", dict_unique_err_buf); - } - } + mutex_exit(&dict_foreign_err_mutex); ut_a(buf < buf_end + 1500); From c4b55a2aeac630a70013f310577b890ba17fb037 Mon Sep 17 00:00:00 2001 From: "serg@serg.mylan" <> Date: Thu, 4 Mar 2004 14:47:33 +0100 Subject: [PATCH 22/65] drop tables in windows-compatible order --- mysql-test/r/merge.result | 2 +- mysql-test/t/merge.test | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/merge.result b/mysql-test/r/merge.result index 650fdb1c77b..7b2b9a47b0f 100644 --- a/mysql-test/r/merge.result +++ b/mysql-test/r/merge.result @@ -560,7 +560,7 @@ select * from t6; a 1 2 -drop table if exists t1, t2, t3, t4, t5, t6; +drop table if exists t6, t5, t4, t3, t2, t1; DROP TABLE IF EXISTS t1, t2; CREATE TABLE t1 ( fileset_id tinyint(3) unsigned NOT NULL default '0', diff --git a/mysql-test/t/merge.test b/mysql-test/t/merge.test index b625e780f1f..76382a9cd99 100644 --- a/mysql-test/t/merge.test +++ b/mysql-test/t/merge.test @@ -202,7 +202,7 @@ insert into t4 values (1); insert into t5 values (2); create temporary table t6 (a int not null) TYPE=MERGE UNION=(t4,t5); select * from t6; -drop table if exists t1, t2, t3, t4, t5, t6; +drop table if exists t6, t5, t4, t3, t2, t1; # # testing merge::records_in_range and optimizer From 9beae2895f904f52169ba5b75386b2fee423a45b Mon Sep 17 00:00:00 2001 From: "guilhem@mysql.com" <> Date: Thu, 4 Mar 2004 15:44:24 +0100 Subject: [PATCH 23/65] Fix for BUG#3063 "Don't mark an auto DROP TEMP TABLE as 'killed' in the binlog"; even if the thread was killed, we write the DROP with error_code=0. This will remove unneeded stops on slave, and will lose nothing: if a real update was killed, this real update will be logged with the nonzero error code and will cause the stop on slave. --- sql/sql_base.cc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/sql/sql_base.cc b/sql/sql_base.cc index e45471dabb8..95ef7acb5ab 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -582,6 +582,16 @@ void close_temporary_tables(THD *thd) /* The -1 is to remove last ',' */ thd->clear_error(); Query_log_event qinfo(thd, query, (ulong)(end-query)-1, 0); + /* + Imagine the thread had created a temp table, then was doing a SELECT, and + the SELECT was killed. Then it's not clever to mark the statement above as + "killed", because it's not really a statement updating data, and there + are 99.99% chances it will succeed on slave. + If a real update (one updating a persistent table) was killed on the + master, then this real update will be logged with error_code=killed, + rightfully causing the slave to stop. + */ + qinfo.error_code= 0; mysql_bin_log.write(&qinfo); } thd->temporary_tables=0; From b9c4ee353df8eb5257202fac419298b469e624e3 Mon Sep 17 00:00:00 2001 From: "monty@mysql.com" <> Date: Thu, 4 Mar 2004 18:16:10 +0200 Subject: [PATCH 24/65] Rollback UPDATE/DELETE statements on kill nsure that rows in a multi-row INSERT DELAYED are inserted atomicly --- mysql-test/mysql-test-run.sh | 9 ++++++++- sql/sql_delete.cc | 9 +++++---- sql/sql_insert.cc | 11 +++++++++-- sql/sql_list.h | 5 +++++ sql/sql_update.cc | 4 ++++ 5 files changed, 31 insertions(+), 7 deletions(-) diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index 5b39b167d7d..cbb4987040d 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -17,7 +17,14 @@ MY_TZ=GMT-3 TZ=$MY_TZ; export TZ # for UNIX_TIMESTAMP tests to work # For query_cache test -ulimit -n 1024 +case "$SYSTEM" in + SCO_SV | UnixWare | OpenUNIX ) + # do nothing (Causes strange behavior) + ;; + * ) + ulimit -n 1024 + ;; +esac #++ # Program Definitions diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index c8b85d57c0e..b568166a766 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -167,6 +167,8 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order, else table->file->unlock_row(); // Row failed selection, release lock on it } + if (thd->killed && !error) + error= 1; // Aborted thd->proc_info="end"; end_read_record(&info); free_io_cache(table); // Will not do any harm @@ -366,6 +368,7 @@ bool multi_delete::send_data(List &values) DBUG_RETURN(0); } + void multi_delete::send_error(uint errcode,const char *err) { DBUG_ENTER("multi_delete::send_error"); @@ -450,15 +453,13 @@ int multi_delete::do_deletes(bool from_send_error) if ((local_error=table->file->delete_row(table->record[0]))) { table->file->print_error(local_error,MYF(0)); - if (transactional_tables) - { - DBUG_RETURN(local_error); - } break; } deleted++; } end_read_record(&info); + if (thd->killed && !local_error) + local_error= 1; if (local_error == -1) // End of file local_error = 0; } diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index bf3112bdf10..c6dcfd2c7dd 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -1236,8 +1236,15 @@ bool delayed_insert::handle_inserts(void) pthread_mutex_lock(&mutex); delete row; - /* Let READ clients do something once in a while */ - if (group_count++ == max_rows) + /* + Let READ clients do something once in a while + We should however not break in the middle of a multi-line insert + if we have binary logging enabled as we don't want other commands + on this table until all entries has been processed + */ + if (group_count++ >= max_rows && (row= rows.head()) && + (!(row->log_query & DELAYED_LOG_BIN && using_bin_log) || + row->query)) { group_count=0; if (stacked_inserts || tables_in_use) // Let these wait a while diff --git a/sql/sql_list.h b/sql/sql_list.h index 102fbe8eb93..370642df2d0 100644 --- a/sql/sql_list.h +++ b/sql/sql_list.h @@ -322,6 +322,10 @@ class base_ilist first_link->unlink(); // Unlink from list return first_link; } + inline struct ilink *head() + { + return (first != &last) ? first : 0; + } friend class base_list_iterator; }; @@ -353,6 +357,7 @@ public: inline void append(T* a) { base_ilist::append(a); } inline void push_back(T* a) { base_ilist::push_back(a); } inline T* get() { return (T*) base_ilist::get(); } + inline T* head() { return (T*) base_ilist::head(); } #ifndef _lint friend class I_List_iterator; #endif diff --git a/sql/sql_update.cc b/sql/sql_update.cc index d2ccd02051b..0a8530aa141 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -238,6 +238,8 @@ int mysql_update(THD *thd, } } } + if (thd->killed && !error) + error= 1; // Aborted limit= tmp_limit; end_read_record(&info); /* Change select to use tempfile */ @@ -309,6 +311,8 @@ int mysql_update(THD *thd, else table->file->unlock_row(); } + if (thd->killed && !error) + error= 1; // Aborted end_read_record(&info); free_io_cache(table); // If ORDER BY thd->proc_info="end"; From d03034d3062f528266ac4853ab2f2ba17f01dfdb Mon Sep 17 00:00:00 2001 From: "bell@sanja.is.com.ua" <> Date: Thu, 4 Mar 2004 18:32:55 +0200 Subject: [PATCH 25/65] invalidation of locking for write tables (BUG#2693) fixed linking query_prealloc_size to query cache presence --- mysql-test/r/query_cache.result | 17 +++++++++++++++++ mysql-test/t/query_cache.test | 17 ++++++++++++++++- sql/mysqld.cc | 9 +++++++-- sql/set_var.cc | 4 ++++ sql/sql_cache.cc | 31 +++++++++++++++++++++++++++++++ sql/sql_cache.h | 1 + sql/sql_class.h | 1 + sql/sql_parse.cc | 6 +++++- 8 files changed, 82 insertions(+), 4 deletions(-) diff --git a/mysql-test/r/query_cache.result b/mysql-test/r/query_cache.result index c7554211a1a..a9e9f167e5f 100644 --- a/mysql-test/r/query_cache.result +++ b/mysql-test/r/query_cache.result @@ -687,4 +687,21 @@ select * from t3; delete from t4 where a=1; flush query cache; drop table t1,t2,t3,t4; +set query_cache_wlock_invalidate=1; +create table t1 (a int not null); +create table t2 (a int not null); +select * from t1; +a +select * from t2; +a +show status like "Qcache_queries_in_cache"; +Variable_name Value +Qcache_queries_in_cache 2 +lock table t1 write, t2 read; +show status like "Qcache_queries_in_cache"; +Variable_name Value +Qcache_queries_in_cache 1 +unlock table; +drop table t1,t2; +set query_cache_wlock_invalidate=default; set GLOBAL query_cache_size=0; diff --git a/mysql-test/t/query_cache.test b/mysql-test/t/query_cache.test index ad0dc80e2f7..8a07c0a53a0 100644 --- a/mysql-test/t/query_cache.test +++ b/mysql-test/t/query_cache.test @@ -504,6 +504,21 @@ select * from t3; enable_result_log; delete from t4 where a=1; flush query cache; - drop table t1,t2,t3,t4; + +# +# WRITE LOCK & QC +# +set query_cache_wlock_invalidate=1; +create table t1 (a int not null); +create table t2 (a int not null); +select * from t1; +select * from t2; +show status like "Qcache_queries_in_cache"; +lock table t1 write, t2 read; +show status like "Qcache_queries_in_cache"; +unlock table; +drop table t1,t2; +set query_cache_wlock_invalidate=default; + set GLOBAL query_cache_size=0; diff --git a/sql/mysqld.cc b/sql/mysqld.cc index b4c5ce33277..b63f903263e 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -3228,7 +3228,7 @@ enum options_mysqld { OPT_NET_READ_TIMEOUT, OPT_NET_WRITE_TIMEOUT, OPT_OPEN_FILES_LIMIT, OPT_QUERY_CACHE_LIMIT, OPT_QUERY_CACHE_SIZE, - OPT_QUERY_CACHE_TYPE, OPT_RECORD_BUFFER, + OPT_QUERY_CACHE_TYPE, OPT_QUERY_CACHE_WLOCK_INVALIDATE, OPT_RECORD_BUFFER, OPT_RECORD_RND_BUFFER, OPT_RELAY_LOG_SPACE_LIMIT, OPT_SLAVE_NET_TIMEOUT, OPT_SLAVE_COMPRESSED_PROTOCOL, OPT_SLOW_LAUNCH_TIME, OPT_READONLY, OPT_DEBUGGING, @@ -4015,12 +4015,17 @@ this value; if zero (the default): when the size exceeds max_binlog_size. \ (gptr*) &global_system_variables.query_cache_type, (gptr*) &max_system_variables.query_cache_type, 0, GET_ULONG, REQUIRED_ARG, 1, 0, 2, 0, 1, 0}, + {"query_cache_wlock_invalidate", OPT_QUERY_CACHE_WLOCK_INVALIDATE, + "Invalidate queries in query cache on LOCK for write", + (gptr*) &global_system_variables.query_cache_wlock_invalidate, + (gptr*) &max_system_variables.query_cache_wlock_invalidate, + 0, GET_BOOL, NO_ARG, 0, 0, 1, 0, 1, 0}, +#endif /*HAVE_QUERY_CACHE*/ {"query_prealloc_size", OPT_QUERY_PREALLOC_SIZE, "Persistent buffer for query parsing and execution", (gptr*) &global_system_variables.query_prealloc_size, (gptr*) &max_system_variables.query_prealloc_size, 0, GET_ULONG, REQUIRED_ARG, QUERY_ALLOC_PREALLOC_SIZE, 1024, ~0L, 0, 1024, 0}, -#endif /*HAVE_QUERY_CACHE*/ {"read_buffer_size", OPT_RECORD_BUFFER, "Each thread that does a sequential scan allocates a buffer of this size for each table it scans. If you do many sequential scans, you may want to increase this value.", (gptr*) &global_system_variables.read_buff_size, diff --git a/sql/set_var.cc b/sql/set_var.cc index 9b605cacb97..d0c21ef293a 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -229,6 +229,9 @@ sys_var_long_ptr sys_query_cache_limit("query_cache_limit", sys_var_thd_enum sys_query_cache_type("query_cache_type", &SV::query_cache_type, &query_cache_type_typelib); +sys_var_thd_bool +sys_query_cache_wlock_invalidate("query_cache_wlock_invalidate", + &SV::query_cache_wlock_invalidate); #endif /* HAVE_QUERY_CACHE */ sys_var_long_ptr sys_server_id("server_id",&server_id); sys_var_bool_ptr sys_slave_compressed_protocol("slave_compressed_protocol", @@ -405,6 +408,7 @@ sys_var *sys_variables[]= #ifdef HAVE_QUERY_CACHE &sys_query_cache_limit, &sys_query_cache_type, + &sys_query_cache_wlock_invalidate, #endif /* HAVE_QUERY_CACHE */ &sys_quote_show_create, &sys_rand_seed1, diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc index 63d4e4222b4..77bdcb79a8d 100644 --- a/sql/sql_cache.cc +++ b/sql/sql_cache.cc @@ -1090,6 +1090,37 @@ void Query_cache::invalidate(CHANGED_TABLE_LIST *tables_used) DBUG_VOID_RETURN; } + +/* + Invalidate locked for write + + SYNOPSIS + Query_cache::invalidate_locked_for_write() + tables_used - table list + + NOTE + can be used only for opened tables +*/ +void Query_cache::invalidate_locked_for_write(TABLE_LIST *tables_used) +{ + DBUG_ENTER("Query_cache::invalidate (changed table list)"); + if (query_cache_size > 0 && tables_used) + { + STRUCT_LOCK(&structure_guard_mutex); + if (query_cache_size > 0) + { + DUMP(this); + for (; tables_used; tables_used= tables_used->next) + { + if (tables_used->lock_type & (TL_WRITE_LOW_PRIORITY | TL_WRITE)) + invalidate_table(tables_used->table); + } + } + STRUCT_UNLOCK(&structure_guard_mutex); + } + DBUG_VOID_RETURN; +} + /* Remove all cached queries that uses the given table */ diff --git a/sql/sql_cache.h b/sql/sql_cache.h index 74b1a6cee96..0c6579250ab 100644 --- a/sql/sql_cache.h +++ b/sql/sql_cache.h @@ -360,6 +360,7 @@ protected: void invalidate(THD* thd, TABLE_LIST *tables_used, my_bool using_transactions); void invalidate(CHANGED_TABLE_LIST *tables_used); + void invalidate_locked_for_write(TABLE_LIST *tables_used); void invalidate(THD* thd, TABLE *table, my_bool using_transactions); void invalidate(THD *thd, const char *key, uint32 key_length, my_bool using_transactions); diff --git a/sql/sql_class.h b/sql/sql_class.h index d96c6bb53cc..85724e7c83f 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -336,6 +336,7 @@ struct system_variables my_bool log_warnings; my_bool low_priority_updates; my_bool new_mode; + my_bool query_cache_wlock_invalidate; CONVERT *convert_set; }; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index ac3ccd4fc62..bc69f7136ad 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2307,8 +2307,12 @@ mysql_execute_command(void) goto error; thd->in_lock_tables=1; thd->options|= OPTION_TABLE_LOCK; - if (!(res=open_and_lock_tables(thd,tables))) + if (!(res= open_and_lock_tables(thd, tables))) { +#ifdef HAVE_QUERY_CACHE + if (thd->variables.query_cache_wlock_invalidate) + query_cache.invalidate_locked_for_write(tables); +#endif /*HAVE_QUERY_CACHE*/ thd->locked_tables=thd->lock; thd->lock=0; send_ok(&thd->net); From 58a978b900d2616162c408fcedbb874157819c6d Mon Sep 17 00:00:00 2001 From: "jani@ua72d24.elisa.omakaista.fi" <> Date: Thu, 4 Mar 2004 17:58:36 +0000 Subject: [PATCH 26/65] Fixed Bug#2491, INSERT DELAYED causes binary log unusable by mysqlbinlog (replication is ok) Setting insert delayed threads = 0 at mysql_init_command. --- BitKeeper/etc/logging_ok | 1 + client/mysqlbinlog.cc | 7 +++++-- sql/mysql_priv.h | 2 +- sql/mysqld.cc | 8 +++++--- sql/set_var.cc | 10 +++++++--- sql/sql_class.h | 1 + sql/sql_insert.cc | 4 ++-- 7 files changed, 22 insertions(+), 11 deletions(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index 63db9c29c60..0e69c4151b4 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -46,6 +46,7 @@ jani@rhols221.adsl.netsonic.fi jani@rhols221.arenanet.fi jani@ua126d19.elisa.omakaista.fi jani@ua141d10.elisa.omakaista.fi +jani@ua72d24.elisa.omakaista.fi jcole@abel.spaceapes.com jcole@main.burghcom.com jcole@mugatu.spaceapes.com diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc index 1be4b3754d0..9d9a414ad02 100644 --- a/client/mysqlbinlog.cc +++ b/client/mysqlbinlog.cc @@ -480,7 +480,7 @@ static void die(const char* fmt, ...) static void print_version() { - printf("%s Ver 2.5 for %s at %s\n", my_progname, SYSTEM_TYPE, MACHINE_TYPE); + printf("%s Ver 2.6 for %s at %s\n", my_progname, SYSTEM_TYPE, MACHINE_TYPE); } @@ -562,9 +562,12 @@ static int parse_args(int *argc, char*** argv) static MYSQL* safe_connect() { MYSQL *local_mysql = mysql_init(NULL); + if(!local_mysql) die("Failed on mysql_init"); - + + mysql_options(local_mysql, MYSQL_INIT_COMMAND, + "/*!32210 SET @@session.max_insert_delayed_threads=0*/"); if (!mysql_real_connect(local_mysql, host, user, pass, 0, port, sock, 0)) die("failed on connect: %s", mysql_error(local_mysql)); diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index b3c3c5648bf..2bb6bc7d867 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -688,7 +688,7 @@ extern ulong ha_read_first_count, ha_read_last_count; extern ulong ha_read_rnd_count, ha_read_rnd_next_count; extern ulong ha_commit_count, ha_rollback_count,table_cache_size; extern ulong max_connections,max_connect_errors, connect_timeout; -extern ulong max_insert_delayed_threads, max_user_connections; +extern ulong max_user_connections; extern ulong long_query_count, what_to_log,flush_time,opt_sql_mode; extern ulong query_buff_size, thread_stack,thread_stack_min; extern ulong binlog_cache_size, max_binlog_cache_size, open_files_limit; diff --git a/sql/mysqld.cc b/sql/mysqld.cc index b4c5ce33277..8aa57d1dfa2 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -399,7 +399,7 @@ ulong select_range_check_count, select_range_count, select_scan_count; ulong select_full_range_join_count,select_full_join_count; ulong specialflag=0,opened_tables=0,created_tmp_tables=0, created_tmp_disk_tables=0; -ulong max_connections,max_insert_delayed_threads,max_used_connections, +ulong max_connections, max_used_connections, max_connect_errors, max_user_connections = 0; ulong thread_id=1L,current_pid; ulong slow_launch_threads = 0; @@ -1726,7 +1726,8 @@ extern "C" void *signal_hand(void *arg __attribute__((unused))) This should actually be '+ max_number_of_slaves' instead of +10, but the +10 should be quite safe. */ - init_thr_alarm(max_connections+max_insert_delayed_threads+10); + init_thr_alarm(max_connections + + global_system_variables.max_insert_delayed_threads + 10); #if SIGINT != THR_KILL_SIGNAL if (test_flags & TEST_SIGINT) { @@ -3896,7 +3897,8 @@ The minimum value for this variable is 4096.", REQUIRED_ARG, MAX_CONNECT_ERRORS, 1, ~0L, 0, 1, 0}, {"max_delayed_threads", OPT_MAX_DELAYED_THREADS, "Don't start more than this number of threads to handle INSERT DELAYED statements. If set to zero, which means INSERT DELAYED is not used.", - (gptr*) &max_insert_delayed_threads, (gptr*) &max_insert_delayed_threads, + (gptr*) &global_system_variables.max_insert_delayed_threads, + (gptr*) &max_system_variables.max_insert_delayed_threads, 0, GET_ULONG, REQUIRED_ARG, 20, 0, 16384, 0, 1, 0}, {"max_heap_table_size", OPT_MAX_HEP_TABLE_SIZE, "Don't allow creation of heap tables bigger than this.", diff --git a/sql/set_var.cc b/sql/set_var.cc index 9b605cacb97..539109d994c 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -155,8 +155,10 @@ sys_var_long_ptr sys_max_connections("max_connections", fix_max_connections); sys_var_long_ptr sys_max_connect_errors("max_connect_errors", &max_connect_errors); -sys_var_long_ptr sys_max_delayed_threads("max_delayed_threads", - &max_insert_delayed_threads, +sys_var_thd_ulong sys_max_insert_delayed_threads("max_insert_delayed_threads", + &SV::max_insert_delayed_threads); +sys_var_thd_ulong sys_max_delayed_threads("max_delayed_threads", + &SV::max_insert_delayed_threads, fix_max_connections); sys_var_thd_ulong sys_max_heap_table_size("max_heap_table_size", &SV::max_heap_table_size); @@ -381,6 +383,7 @@ sys_var *sys_variables[]= &sys_max_connect_errors, &sys_max_connections, &sys_max_delayed_threads, + &sys_max_insert_delayed_threads, &sys_max_heap_table_size, &sys_max_join_size, &sys_max_relay_log_size, @@ -771,7 +774,8 @@ static void fix_max_relay_log_size(THD *thd, enum_var_type type) static void fix_max_connections(THD *thd, enum_var_type type) { - resize_thr_alarm(max_connections + max_insert_delayed_threads + 10); + resize_thr_alarm(max_connections + + global_system_variables.max_insert_delayed_threads + 10); } diff --git a/sql/sql_class.h b/sql/sql_class.h index d96c6bb53cc..4a74e3535ad 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -310,6 +310,7 @@ struct system_variables ulong max_heap_table_size; ulong max_sort_length; ulong max_tmp_tables; + ulong max_insert_delayed_threads; ulong myisam_repair_threads; ulong myisam_sort_buff_size; ulong net_buffer_length; diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index bf3112bdf10..c2f889c42e3 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -139,7 +139,7 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, List &fields, */ if ((lock_type == TL_WRITE_DELAYED && ((specialflag & (SPECIAL_NO_NEW_FUNC | SPECIAL_SAFE_MODE)) || - thd->slave_thread || !max_insert_delayed_threads)) || + thd->slave_thread || !thd->variables.max_insert_delayed_threads)) || (lock_type == TL_WRITE_CONCURRENT_INSERT && duplic == DUP_REPLACE)) lock_type=TL_WRITE; @@ -655,7 +655,7 @@ static TABLE *delayed_get_table(THD *thd,TABLE_LIST *table_list) if (!(tmp=find_handler(thd,table_list))) { /* Don't create more than max_insert_delayed_threads */ - if (delayed_insert_threads >= max_insert_delayed_threads) + if (delayed_insert_threads >= thd->variables.max_insert_delayed_threads) DBUG_RETURN(0); thd->proc_info="Creating delayed handler"; pthread_mutex_lock(&LOCK_delayed_create); From cba6ff7597ed1cde60e2c77e4814428b73d212bc Mon Sep 17 00:00:00 2001 From: "vva@eagle.mysql.r18.ru" <> Date: Thu, 4 Mar 2004 22:11:33 +0400 Subject: [PATCH 27/65] fixed Bug #3051 "FLOOR returns invalid" --- mysql-test/r/func_math.result | 6 ++++++ mysql-test/t/func_math.test | 8 ++++++++ sql/item_func.cc | 3 ++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/func_math.result b/mysql-test/r/func_math.result index 5e774fe9886..e183b479a6c 100644 --- a/mysql-test/r/func_math.result +++ b/mysql-test/r/func_math.result @@ -32,3 +32,9 @@ ASIN(0.8+0.2) 1.570796 ASIN(1.2-0.2) 1.570796 +floor(log(4)/log(2)) +2 +floor(log(8)/log(2)) +3 +floor(log(16)/log(2)) +4 diff --git a/mysql-test/t/func_math.test b/mysql-test/t/func_math.test index 42ba8c73f69..c39c966547b 100644 --- a/mysql-test/t/func_math.test +++ b/mysql-test/t/func_math.test @@ -24,3 +24,11 @@ SELECT ACOS(0.2*5.0); SELECT ACOS(0.5*2.0); SELECT ASIN(0.8+0.2); SELECT ASIN(1.2-0.2); + +# +# Bug #3051 FLOOR returns invalid +# + +select floor(log(4)/log(2)); +select floor(log(8)/log(2)); +select floor(log(16)/log(2)); diff --git a/sql/item_func.cc b/sql/item_func.cc index 037f7861630..dcd4e4a020c 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -572,7 +572,8 @@ longlong Item_func_ceiling::val_int() longlong Item_func_floor::val_int() { - double value=args[0]->val(); + // the volatile's for BUG #3051 to calm optimizer down (because of gcc's bug) + volatile double value=args[0]->val(); null_value=args[0]->null_value; return (longlong) floor(value); } From 34a332c086c93cdd8fe11476a42265779e3ca593 Mon Sep 17 00:00:00 2001 From: "jani@ua72d24.elisa.omakaista.fi" <> Date: Thu, 4 Mar 2004 18:30:28 +0000 Subject: [PATCH 28/65] Added option chroot to mysqlhotcopy. Useful in case mysqld was started with chroot. --- scripts/mysqlhotcopy.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/mysqlhotcopy.sh b/scripts/mysqlhotcopy.sh index 654e5466e12..ab06215c3ac 100644 --- a/scripts/mysqlhotcopy.sh +++ b/scripts/mysqlhotcopy.sh @@ -37,7 +37,7 @@ WARNING: THIS PROGRAM IS STILL IN BETA. Comments/patches welcome. # Documentation continued at end of file -my $VERSION = "1.20"; +my $VERSION = "1.21"; my $opt_tmpdir = $ENV{TMPDIR} || "/tmp"; @@ -73,6 +73,7 @@ Usage: $0 db_name[./table_regex/] [new_db_name | directory] --resetslave reset the master.info once all tables are locked --tmpdir=# temporary directory (instead of $opt_tmpdir) --record_log_pos=# record slave and master status in specified db.table + --chroot=# base directory of chroot jail in which mysqld operates Try \'perldoc $0 for more complete documentation\' _OPTIONS @@ -117,6 +118,7 @@ GetOptions( \%opt, "resetslave", "tmpdir|t=s", "dryrun|n", + "chroot=s", ) or usage("Invalid option"); # @db_desc @@ -210,6 +212,7 @@ while ( my ($var,$value) = $sth_vars->fetchrow_array ) { } my $datadir = $mysqld_vars{'datadir'} || die "datadir not in mysqld variables"; + $datadir= $opt{chroot}.$datadir if ($opt{chroot}); $datadir =~ s:/$::; From 29bc7b03a0de9ba6fab4f1e9a47f867fcbe278cc Mon Sep 17 00:00:00 2001 From: "vva@eagle.mysql.r18.ru" <> Date: Fri, 5 Mar 2004 22:13:33 +0400 Subject: [PATCH 29/65] fixed Bug #2985 "Table truncated when creating another table name with Spaces" added to check_db_name, check_table_name and check_column_name test for end space --- mysql-test/r/create.result | 6 ++++++ mysql-test/t/create.test | 12 ++++++++++++ sql/sql_db.cc | 2 +- sql/sql_parse.cc | 12 ++++-------- sql/table.cc | 28 ++++++++++++++++++++++++++-- 5 files changed, 49 insertions(+), 11 deletions(-) diff --git a/mysql-test/r/create.result b/mysql-test/r/create.result index 627913939fb..22743782484 100644 --- a/mysql-test/r/create.result +++ b/mysql-test/r/create.result @@ -216,3 +216,9 @@ a b 0 2 3 4 drop table t1; +create table `t1 `(a int); +Incorrect table name 't1 ' +create database `db1 `; +Incorrect database name 'db1 ' +create table t1(`a ` int); +Incorrect column name 'a ' diff --git a/mysql-test/t/create.test b/mysql-test/t/create.test index 8aee586268f..94c2f24dffc 100644 --- a/mysql-test/t/create.test +++ b/mysql-test/t/create.test @@ -179,3 +179,15 @@ create table if not exists t1 select 3 as 'a',4 as 'b'; create table if not exists t1 select 3 as 'a',3 as 'b'; select * from t1; drop table t1; + +# +# Test for Bug #2985 +# "Table truncated when creating another table name with Spaces" +# + +--error 1103 +create table `t1 `(a int); +--error 1102 +create database `db1 `; +--error 1166; +create table t1(`a ` int); diff --git a/sql/sql_db.cc b/sql/sql_db.cc index ca9989d986c..a0b2ebdbff8 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -376,7 +376,7 @@ bool mysql_change_db(THD *thd,const char *name) ulong db_access; DBUG_ENTER("mysql_change_db"); - if (!dbname || !(db_length=strip_sp(dbname))) + if (!dbname || !(db_length= strlength(dbname))) { x_free(dbname); /* purecov: inspected */ send_error(&thd->net,ER_NO_DB_ERROR); /* purecov: inspected */ diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index ac3ccd4fc62..bab59a162be 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1123,8 +1123,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, statistic_increment(com_stat[SQLCOM_CREATE_DB],&LOCK_status); // null test to handle EOM - if (!db || !strip_sp(db) || !(alias= thd->strdup(db)) || - check_db_name(db)) + if (!db || !(alias= thd->strdup(db)) || check_db_name(db)) { net_printf(&thd->net,ER_WRONG_DB_NAME, db ? db : "NULL"); break; @@ -1140,8 +1139,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, statistic_increment(com_stat[SQLCOM_DROP_DB],&LOCK_status); char *db=thd->strdup(packet), *alias; // null test to handle EOM - if (!db || !strip_sp(db) || !(alias= thd->strdup(db)) || - check_db_name(db)) + if (!db || !(alias= thd->strdup(db)) || check_db_name(db)) { net_printf(&thd->net,ER_WRONG_DB_NAME, db ? db : "NULL"); break; @@ -2320,8 +2318,7 @@ mysql_execute_command(void) case SQLCOM_CREATE_DB: { char *alias; - if (!strip_sp(lex->name) || !(alias=thd->strdup(lex->name)) || - check_db_name(lex->name)) + if (!(alias=thd->strdup(lex->name)) || check_db_name(lex->name)) { net_printf(&thd->net,ER_WRONG_DB_NAME, lex->name); break; @@ -2350,8 +2347,7 @@ mysql_execute_command(void) case SQLCOM_DROP_DB: { char *alias; - if (!strip_sp(lex->name) || !(alias=thd->strdup(lex->name)) || - check_db_name(lex->name)) + if (!(alias=thd->strdup(lex->name)) || check_db_name(lex->name)) { net_printf(&thd->net,ER_WRONG_DB_NAME, lex->name); break; diff --git a/sql/table.cc b/sql/table.cc index a90220fa55b..ffe901b9061 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -1139,7 +1139,8 @@ char *get_field(MEM_ROOT *mem, TABLE *table, uint fieldnr) bool check_db_name(char *name) { - char *start=name; + char *start=name; + bool space= false; if (lower_case_table_names) casedn_str(name); @@ -1147,6 +1148,7 @@ bool check_db_name(char *name) while (*name) { #if defined(USE_MB) && defined(USE_MB_IDENT) + space= my_isspace(default_charset_info, *name); if (use_mb(default_charset_info)) { int len=my_ismbchar(default_charset_info, name, name+MBMAXLEN); @@ -1156,19 +1158,24 @@ bool check_db_name(char *name) continue; } } +#else + space= *name==' '; #endif if (*name == '/' || *name == '\\' || *name == FN_LIBCHAR || *name == FN_EXTCHAR) return 1; name++; } - return (uint) (name - start) > NAME_LEN; + if (space) + return 1; + return name[-1]==' ' || (uint) (name - start) > NAME_LEN; } /* Allow anything as a table name, as long as it doesn't contain an a '/', or a '.' character + or ' ' at the end returns 1 on error */ @@ -1178,10 +1185,17 @@ bool check_table_name(const char *name, uint length) const char *end= name+length; if (!length || length > NAME_LEN) return 1; +#if defined(USE_MB) && defined(USE_MB_IDENT) + bool space= false; +#else + if (name[length-1]==' ') + return 1; +#endif while (name != end) { #if defined(USE_MB) && defined(USE_MB_IDENT) + space= my_isspace(default_charset_info, *name); if (use_mb(default_charset_info)) { int len=my_ismbchar(default_charset_info, name, end); @@ -1196,16 +1210,22 @@ bool check_table_name(const char *name, uint length) return 1; name++; } +#if defined(USE_MB) && defined(USE_MB_IDENT) + if (space) + return 1; +#endif return 0; } bool check_column_name(const char *name) { const char *start= name; + bool space= false; while (*name) { #if defined(USE_MB) && defined(USE_MB_IDENT) + space= my_isspace(default_charset_info, *name); if (use_mb(default_charset_info)) { int len=my_ismbchar(default_charset_info, name, name+MBMAXLEN); @@ -1215,11 +1235,15 @@ bool check_column_name(const char *name) continue; } } +#else + space= *name==' '; #endif if (*name == NAMES_SEP_CHAR) return 1; name++; } + if (space) + return 1; /* Error if empty or too long column name */ return (name == start || (uint) (name - start) > NAME_LEN); } From ef971bb6048db5fc99cddaff1673c8a001705111 Mon Sep 17 00:00:00 2001 From: "monty@mysql.com" <> Date: Sat, 6 Mar 2004 10:43:35 +0200 Subject: [PATCH 30/65] Ensure that one can't from the command line set a variable too small. (Bug #2710) Allow one to force lower_case_table_names to 0, even if the file system is case insensitive. This fixes some issues on Mac OS X (Bug #2994) Added variables "lower_case_file_system", "version_compile_os" and "license" --- mysql-test/r/lowercase0.require | 3 ++ mysql-test/r/lowercase_table3.result | 10 +++++ mysql-test/r/true.require | 2 + ...master.opt => lowercase_table3-master.opt} | 0 mysql-test/t/lowercase_table3.test | 37 +++++++++++++++++++ mysys/my_getopt.c | 15 +++----- sql/mysql_priv.h | 2 +- sql/mysqld.cc | 22 +++++++++-- sql/set_var.cc | 17 +++++++-- sql/set_var.h | 25 +++++++++++++ sql/sql_select.cc | 4 +- 11 files changed, 120 insertions(+), 17 deletions(-) create mode 100644 mysql-test/r/lowercase0.require create mode 100644 mysql-test/r/lowercase_table3.result create mode 100644 mysql-test/r/true.require rename mysql-test/t/{lowercase_table2-master.opt => lowercase_table3-master.opt} (100%) create mode 100644 mysql-test/t/lowercase_table3.test diff --git a/mysql-test/r/lowercase0.require b/mysql-test/r/lowercase0.require new file mode 100644 index 00000000000..a63906557f8 --- /dev/null +++ b/mysql-test/r/lowercase0.require @@ -0,0 +1,3 @@ +Variable_name Value +lower_case_file_system ON +lower_case_table_names 0 diff --git a/mysql-test/r/lowercase_table3.result b/mysql-test/r/lowercase_table3.result new file mode 100644 index 00000000000..0676c42e12b --- /dev/null +++ b/mysql-test/r/lowercase_table3.result @@ -0,0 +1,10 @@ +DROP TABLE IF EXISTS t1,T1; +CREATE TABLE t1 (a int); +SELECT * from T1; +a +drop table t1; +flush tables; +CREATE TABLE t1 (a int) type=INNODB; +SELECT * from T1; +Table 'test.T1' doesn't exist +drop table t1; diff --git a/mysql-test/r/true.require b/mysql-test/r/true.require new file mode 100644 index 00000000000..09aae1ed1d0 --- /dev/null +++ b/mysql-test/r/true.require @@ -0,0 +1,2 @@ +TRUE +1 diff --git a/mysql-test/t/lowercase_table2-master.opt b/mysql-test/t/lowercase_table3-master.opt similarity index 100% rename from mysql-test/t/lowercase_table2-master.opt rename to mysql-test/t/lowercase_table3-master.opt diff --git a/mysql-test/t/lowercase_table3.test b/mysql-test/t/lowercase_table3.test new file mode 100644 index 00000000000..83ffaaad2d1 --- /dev/null +++ b/mysql-test/t/lowercase_table3.test @@ -0,0 +1,37 @@ +# +# Test of force of lower-case-table-names=0 +# (User has case insensitive file system and want's to preserve case of +# table names) +# + +--source include/have_innodb.inc +--require r/lowercase0.require +disable_query_log; +show variables like "lower_case_%"; +--require r/true.require +select @@version_compile_os NOT IN ("NT","WIN2000","Win95/Win98","XP") as "TRUE"; +enable_query_log; + +--disable_warnings +DROP TABLE IF EXISTS t1,T1; +--enable_warnings + +# +# This is actually an error, but ok as the user has forced this +# by using --lower-case-table-names=0 + +CREATE TABLE t1 (a int); +SELECT * from T1; +drop table t1; +flush tables; + +# +# InnoDB should in this case be case sensitive +# Note that this is not true on windows as no this OS, InnoDB is always +# storing things in lower case. +# + +CREATE TABLE t1 (a int) type=INNODB; +--error 1146 +SELECT * from T1; +drop table t1; diff --git a/mysys/my_getopt.c b/mysys/my_getopt.c index a8c57b4cd1d..8e1276990c0 100644 --- a/mysys/my_getopt.c +++ b/mysys/my_getopt.c @@ -576,18 +576,15 @@ static longlong eval_num_suffix (char *argument, int *error, char *option_name) static longlong getopt_ll(char *arg, const struct my_option *optp, int *err) { longlong num; + ulonglong block_size= (optp->block_size ? (ulonglong) optp->block_size : 1L); num= eval_num_suffix(arg, err, (char*) optp->name); - if (num < (longlong) optp->min_value) - num= (longlong) optp->min_value; - else if (num > 0 && (ulonglong) num > (ulonglong) (ulong) optp->max_value - && optp->max_value) /* if max value is not set -> no upper limit */ + if (num > 0 && (ulonglong) num > (ulonglong) (ulong) optp->max_value && + optp->max_value) /* if max value is not set -> no upper limit */ num= (longlong) (ulong) optp->max_value; - num= ((num - (longlong) optp->sub_size) / (optp->block_size ? - (ulonglong) optp->block_size : - 1L)); - return (longlong) (num * (optp->block_size ? (ulonglong) optp->block_size : - 1L)); + num= ((num - (longlong) optp->sub_size) / block_size); + num= (longlong) (num * block_size); + return max(num, optp->min_value); } /* diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index b3c3c5648bf..3eaa5dcc60e 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -710,7 +710,7 @@ extern uint volatile thread_count, thread_running, global_read_lock; extern my_bool opt_sql_bin_update, opt_safe_user_create, opt_no_mix_types; extern my_bool opt_safe_show_db, opt_local_infile; extern my_bool opt_slave_compressed_protocol, use_temp_pool; -extern my_bool opt_readonly; +extern my_bool opt_readonly, lower_case_file_system; extern my_bool opt_enable_named_pipe, opt_sync_frm; extern MYSQL_LOG mysql_log,mysql_update_log,mysql_slow_log,mysql_bin_log; diff --git a/sql/mysqld.cc b/sql/mysqld.cc index b4c5ce33277..06bd0a5b10d 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -287,8 +287,10 @@ char log_error_file[FN_REFLEN]; bool opt_log, opt_update_log, opt_bin_log, opt_slow_log; bool opt_error_log= IF_WIN(1,0); bool opt_disable_networking=0, opt_skip_show_db=0; +bool lower_case_table_names_used= 0; my_bool opt_enable_named_pipe= 0, opt_debugging= 0; my_bool opt_local_infile, opt_external_locking, opt_slave_compressed_protocol; +my_bool lower_case_file_system= 0; uint delay_key_write_options= (uint) DELAY_KEY_WRITE_ON; uint lower_case_table_names; @@ -2106,10 +2108,23 @@ int main(int argc, char **argv) get corrupted if accesses with names of different case. */ if (!lower_case_table_names && - test_if_case_insensitive(mysql_real_data_home) == 1) + (lower_case_file_system= + (test_if_case_insensitive(mysql_real_data_home) == 1))) { - sql_print_error("Warning: Setting lower_case_table_names=2 because file system for %s is case insensitive", mysql_real_data_home); - lower_case_table_names= 2; + if (lower_case_table_names_used) + { + sql_print_error("\ +Warning: You have forced lower_case_table_names to 0 through a command line \ +option, even if your file system '%s' is case insensitive. This means that \ +you can corrupt an MyISAM table by accessing it with different cases. You \ +should consider changing lower_case_table_names to 1 or 2", + mysql_real_data_home); + } + else + { + sql_print_error("Warning: Setting lower_case_table_names=2 because file system for %s is case insensitive", mysql_real_data_home); + lower_case_table_names= 2; + } } #ifdef HAVE_OPENSSL @@ -4845,6 +4860,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), break; case OPT_LOWER_CASE_TABLE_NAMES: lower_case_table_names= argument ? atoi(argument) : 1; + lower_case_table_names_used= 1; break; } return 0; diff --git a/sql/set_var.cc b/sql/set_var.cc index 9b605cacb97..11eaa081a9d 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -329,9 +329,16 @@ static sys_var_rand_seed2 sys_rand_seed2("rand_seed2"); static sys_var_thd_ulong sys_default_week_format("default_week_format", &SV::default_week_format); +static const char license[]= "GPL"; + +/* Read only variables */ + +sys_var_const_str sys_os("version_compile_os", SYSTEM_TYPE); +sys_var_const_str sys_license("license", license); + /* Global read-only variable describing server license */ -static const char license[]= "GPL"; + /* @@ -368,6 +375,7 @@ sys_var *sys_variables[]= &sys_join_buffer_size, &sys_key_buffer_size, &sys_last_insert_id, + &sys_license, &sys_local_infile, &sys_log_binlog, &sys_log_off, @@ -434,6 +442,7 @@ sys_var *sys_variables[]= &sys_trans_alloc_block_size, &sys_trans_prealloc_size, &sys_tx_isolation, + &sys_os, #ifdef HAVE_INNOBASE_DB &sys_innodb_max_dirty_pages_pct, #endif @@ -512,8 +521,8 @@ struct show_var_st init_vars[]= { {sys_join_buffer_size.name, (char*) &sys_join_buffer_size, SHOW_SYS}, {sys_key_buffer_size.name, (char*) &sys_key_buffer_size, SHOW_SYS}, {"language", language, SHOW_CHAR}, - {"large_files_support", (char*) &opt_large_files, SHOW_BOOL}, - {"license", (char*) license, SHOW_CHAR}, + {"large_files_support", (char*) &opt_large_files, SHOW_BOOL}, + {sys_license.name, (char*) &sys_license, SHOW_SYS}, {sys_local_infile.name, (char*) &sys_local_infile, SHOW_SYS}, #ifdef HAVE_MLOCKALL {"locked_in_memory", (char*) &locked_in_memory, SHOW_BOOL}, @@ -526,6 +535,7 @@ struct show_var_st init_vars[]= { {sys_log_warnings.name, (char*) &sys_log_warnings, SHOW_SYS}, {sys_long_query_time.name, (char*) &sys_long_query_time, SHOW_SYS}, {sys_low_priority_updates.name, (char*) &sys_low_priority_updates, SHOW_SYS}, + {"lower_case_file_system", (char*) &lower_case_file_system, SHOW_BOOL}, {"lower_case_table_names", (char*) &lower_case_table_names, SHOW_INT}, {sys_max_allowed_packet.name,(char*) &sys_max_allowed_packet, SHOW_SYS}, {sys_max_binlog_cache_size.name,(char*) &sys_max_binlog_cache_size, SHOW_SYS}, @@ -606,6 +616,7 @@ struct show_var_st init_vars[]= { {sys_trans_prealloc_size.name, (char*) &sys_trans_prealloc_size, SHOW_SYS}, {"version", server_version, SHOW_CHAR}, {"version_comment", (char*) MYSQL_COMPILATION_COMMENT, SHOW_CHAR}, + {sys_os.name, (char*) &sys_os, SHOW_SYS}, {sys_net_wait_timeout.name, (char*) &sys_net_wait_timeout, SHOW_SYS}, {NullS, NullS, SHOW_LONG} }; diff --git a/sql/set_var.h b/sql/set_var.h index e22c55276a7..08e3f20fdb4 100644 --- a/sql/set_var.h +++ b/sql/set_var.h @@ -156,6 +156,31 @@ public: }; +class sys_var_const_str :public sys_var +{ +public: + char *value; // Pointer to const value + sys_var_const_str(const char *name_arg, const char *value_arg) + :sys_var(name_arg), value((char*) value_arg) + {} + bool check(THD *thd, set_var *var) + { + return 1; + } + bool update(THD *thd, set_var *var) + { + return 1; + } + SHOW_TYPE type() { return SHOW_CHAR; } + byte *value_ptr(THD *thd, enum_var_type type) { return (byte*) value; } + bool check_update_type(Item_result type) + { + return 1; + } + bool check_default(enum_var_type type) { return 1; } +}; + + class sys_var_enum :public sys_var { uint *value; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index ae493c0cb16..012be95c381 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -1374,7 +1374,7 @@ make_join_statistics(JOIN *join,TABLE_LIST *tables,COND *conds, sizeof(POSITION)*join->const_tables); join->best_read=1.0; } - DBUG_RETURN(get_best_combination(join)); + DBUG_RETURN(join->thd->killed || get_best_combination(join)); } @@ -1904,6 +1904,8 @@ find_best(JOIN *join,table_map rest_tables,uint idx,double record_count, ha_rows rec; double tmp; THD *thd= join->thd; + if (thd->killed) // Abort + return; if (!rest_tables) { From 2c31370a30be4dc82b3688da0b60c7ad66fee1fe Mon Sep 17 00:00:00 2001 From: "guilhem@mysql.com" <> Date: Mon, 8 Mar 2004 14:47:13 +0100 Subject: [PATCH 31/65] Fix for BUG#3081 "if an INSERT DELAYED is killed, it is binlogged as killed but it's not needed". INSERT DELAYED works only for one-row inserts (in latest 4.0 versions at least). So killing a delayed_insert thread does not spoil replication: the rows which actually went into the table are exactly those listed in the binlog. So when the delayed_insert thread is killed, don't log it as 'killed', because it causes superfluous stops on the slave. --- sql/log_event.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sql/log_event.cc b/sql/log_event.cc index 603c8431b03..d2957165e77 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -820,7 +820,9 @@ Query_log_event::Query_log_event(THD* thd_arg, const char* query_arg, ulong query_length, bool using_trans) :Log_event(thd_arg, 0, using_trans), data_buf(0), query(query_arg), db(thd_arg->db), q_len((uint32) query_length), - error_code(thd_arg->killed ? ER_SERVER_SHUTDOWN: thd_arg->net.last_errno), + error_code(thd_arg->killed ? + ((thd_arg->system_thread & SYSTEM_THREAD_DELAYED_INSERT) ? + 0 : ER_SERVER_SHUTDOWN) : thd_arg->net.last_errno), thread_id(thd_arg->thread_id), /* save the original thread id; we already know the server id */ slave_proxy_id(thd_arg->slave_proxy_id) From ae18d8d64c37d9d176e76f0b5b7d7fcc75a7c7c7 Mon Sep 17 00:00:00 2001 From: "paul@ice.snake.net" <> Date: Mon, 8 Mar 2004 15:52:06 -0600 Subject: [PATCH 32/65] Patch for #3068: [Prompt without seconds when set from INI file]. (Fix hours/seconds always to display with two digits.) --- client/mysql.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/client/mysql.cc b/client/mysql.cc index bcb2e1a6e1a..695cb1f28be 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -2676,6 +2676,8 @@ static const char* construct_prompt() processed_prompt.append(' '); break; case 'R': + if (t->tm_hour < 10) + processed_prompt.append('0'); add_int_to_prompt(t->tm_hour); break; case 'r': @@ -2683,6 +2685,8 @@ static const char* construct_prompt() getHour = t->tm_hour % 12; if (getHour == 0) getHour=12; + if (getHour < 10) + processed_prompt.append('0'); add_int_to_prompt(getHour); break; case 'm': @@ -2708,6 +2712,8 @@ static const char* construct_prompt() processed_prompt.append(strtok(dateTime,"\n")); break; case 's': + if (t->tm_sec < 10) + processed_prompt.append('0'); add_int_to_prompt(t->tm_sec); break; case 'w': From 025be296b28ac107a80730df186bacfbff1634dd Mon Sep 17 00:00:00 2001 From: "paul@ice.snake.net" <> Date: Mon, 8 Mar 2004 15:58:45 -0600 Subject: [PATCH 33/65] Touch up error message. --- sql/mysqld.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 6699a502604..3ca4da29de4 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -2115,10 +2115,10 @@ int main(int argc, char **argv) if (lower_case_table_names_used) { sql_print_error("\ -Warning: You have forced lower_case_table_names to 0 through a command line \ -option, even if your file system '%s' is case insensitive. This means that \ -you can corrupt an MyISAM table by accessing it with different cases. You \ -should consider changing lower_case_table_names to 1 or 2", +Warning: You have forced lower_case_table_names to 0 through a command-line \ +option, even though your file system '%s' is case insensitive. This means \ +that you can corrupt a MyISAM table by accessing it with different cases. \ +You should consider changing lower_case_table_names to 1 or 2", mysql_real_data_home); } else From 0bbbdb0530ed3d10634b752a0aebf8b26e683cf8 Mon Sep 17 00:00:00 2001 From: "Sinisa@sinisa.nasamreza.org" <> Date: Tue, 9 Mar 2004 17:00:00 +0200 Subject: [PATCH 34/65] mysqldump.c: This is to fix mysqldump problem when local-infile option is present under [client] options header. It will not start. This must be fixed as other programs use that option under [client] options header. --- client/mysqldump.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/client/mysqldump.c b/client/mysqldump.c index 34f9b7998d7..a96f24dc97b 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -72,13 +72,13 @@ static char *add_load_option(char *ptr, const char *object, static char *field_escape(char *to,const char *from,uint length); static my_bool verbose=0,tFlag=0,cFlag=0,dFlag=0,quick=0, extended_insert = 0, - lock_tables=0,ignore_errors=0,flush_logs=0,replace=0, - ignore=0,opt_drop=0,opt_keywords=0,opt_lock=0,opt_compress=0, - opt_delayed=0,create_options=0,opt_quoted=0,opt_databases=0, - opt_alldbs=0,opt_create_db=0,opt_first_slave=0, - opt_autocommit=0,opt_master_data,opt_disable_keys=0,opt_xml=0, - opt_delete_master_logs=0, tty_password=0, - opt_single_transaction=0, opt_comments= 0; + lock_tables=0,ignore_errors=0,flush_logs=0,replace=0, + ignore=0,opt_drop=0,opt_keywords=0,opt_lock=0,opt_compress=0, + opt_delayed=0,create_options=0,opt_quoted=0,opt_databases=0, + opt_alldbs=0,opt_create_db=0,opt_first_slave=0, + opt_autocommit=0,opt_master_data,opt_disable_keys=0,opt_xml=0, + opt_delete_master_logs=0, tty_password=0, + opt_single_transaction=0, opt_comments= 0, opt_local_infile= 0; static MYSQL mysql_connection,*sock=0; static char insert_pat[12 * 1024],*opt_password=0,*current_user=0, *current_host=0,*path=0,*fields_terminated=0, @@ -170,6 +170,9 @@ static struct my_option my_long_options[] = {"lines-terminated-by", OPT_LTB, "Lines in the i.file are terminated by ...", (gptr*) &lines_terminated, (gptr*) &lines_terminated, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"local-infile", OPT_LOCAL_INFILE, "Enable/disable LOAD DATA LOCAL INFILE.", + (gptr*) &opt_local_infile, + (gptr*) &opt_local_infile, 0, GET_BOOL, OPT_ARG, 0, 0, 0, 0, 0, 0}, {"lock-tables", 'l', "Lock all tables for read.", (gptr*) &lock_tables, (gptr*) &lock_tables, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"master-data", OPT_MASTER_DATA, From 4bbb3573ac68471cb253320f143924a89b9db442 Mon Sep 17 00:00:00 2001 From: "paul@teton.kitebird.com" <> Date: Tue, 9 Mar 2004 11:48:32 -0600 Subject: [PATCH 35/65] Reword comment/help message. Fix comment typos. (Skipp -> Skip) --- extra/replace.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/extra/replace.c b/extra/replace.c index 41312f5e3d4..792684918ea 100644 --- a/extra/replace.c +++ b/extra/replace.c @@ -15,6 +15,12 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* Replace strings in textfile + This program replaces strings in files or from stdin to stdout. + It accepts a list of from-string/to-string pairs and replaces + each occurrence of a from-string with the corresponding to-string. + The first occurrence of a found string is matched. If there is more + than one possibility for the string to replace, longer matches + are preferred before shorter matches. This program replace strings in a file or on stdin/stdout. It accepts a list of from-strings and to-strings and replaces all occurents of from-strings to to-strings. @@ -167,7 +173,7 @@ register char **argv[]; break; case '#': DBUG_PUSH (++pos); - pos= (char*) " "; /* Skipp rest of arguments */ + pos= (char*) " "; /* Skip rest of arguments */ break; case 'V': version=1; @@ -179,12 +185,13 @@ register char **argv[]; if (version) break; puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license\n"); - puts("This program replace strings in a file or on stdin/stdout.\n" - "It accepts a list of from-strings and to-strings and replaces\n" - "all occurents of from-strings to to-strings.\n" - "The first occurents of a found string is matched. Longer matches\n" - "are prefered before shorter matches.\n\n" - "Special characters in from string:\n" + puts("This program replaces strings in files or from stdin to stdout.\n" + "It accepts a list of from-string/to-string pairs and replaces\n" + "each occurrence of a from-string with the corresponding to-string.\n" + "The first occurrence of a found string is matched. If there is\n" + "more than one possibility for the string to replace, longer\n" + "matches are preferred before shorter matches.\n\n" + "A from-string can contain these special characters:\n" " \\^ Match start of line.\n" " \\$ Match end of line.\n" " \\b Match space-character, start of line or end of line.\n" @@ -237,7 +244,7 @@ POINTER_ARRAY *from_array,*to_array; (*argv)++; } if (*argc) - { /* Skipp "--" argument */ + { /* Skip "--" argument */ (*argc)--; (*argv)++; } From 4f601cd9ef5e0e23e831dd09cedb054c1e41a704 Mon Sep 17 00:00:00 2001 From: "heikki@hundin.mysql.fi" <> Date: Wed, 10 Mar 2004 11:05:02 +0200 Subject: [PATCH 36/65] buf0lru.c: Add typecasts to ulong because ulint is __int64 in Win 64-bits Better error message to the .err log if we have to crash the server because the buffer pool is exhausted by the lock table or the adaptive hash index --- innobase/buf/buf0lru.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/innobase/buf/buf0lru.c b/innobase/buf/buf0lru.c index a8729efb999..1d49833969f 100644 --- a/innobase/buf/buf0lru.c +++ b/innobase/buf/buf0lru.c @@ -227,9 +227,13 @@ loop: fprintf(stderr, " InnoDB: ERROR: over 9 / 10 of the buffer pool is occupied by\n" -"InnoDB: lock heaps or the adaptive hash index!\n" +"InnoDB: lock heaps or the adaptive hash index! Check that your\n" +"InnoDB: transactions do not set too many row locks.\n" +"InnoDB: Your buffer pool size is %lu MB. Maybe you should make\n" +"InnoDB: the buffer pool bigger?\n" "InnoDB: We intentionally generate a seg fault to print a stack trace\n" -"InnoDB: on Linux!\n"); +"InnoDB: on Linux!\n", + (ulong)(buf_pool->curr_size / (1024 * 1024 / UNIV_PAGE_SIZE))); ut_a(0); @@ -250,7 +254,7 @@ loop: "InnoDB: the buffer pool bigger?\n" "InnoDB: Starting the InnoDB Monitor to print diagnostics, including\n" "InnoDB: lock heap and hash index sizes.\n", - buf_pool->curr_size / (1024 * 1024 / UNIV_PAGE_SIZE)); + (ulong)(buf_pool->curr_size / (1024 * 1024 / UNIV_PAGE_SIZE))); srv_print_innodb_monitor = TRUE; os_event_set(srv_lock_timeout_thread_event); From 4ee44751d9ebcca3aa0f6c1f97f732abd7311810 Mon Sep 17 00:00:00 2001 From: "monty@mysql.com" <> Date: Wed, 10 Mar 2004 13:46:11 +0200 Subject: [PATCH 37/65] Fixed memory leak in DROP DATABASE when using RAID tables (Bug #2882) --- BUILD/compile-pentium-debug-max | 2 +- configure.in | 6 +-- include/my_sys.h | 6 +-- mysql-test/install_test_db.sh | 2 +- mysql-test/mysql-test-run.sh | 4 +- mysql-test/r/lowercase_table2.result | 15 +++++++ mysql-test/r/lowercase_table3.result | 2 +- mysql-test/r/multi_update.result | 26 +++++++++++ mysql-test/t/lowercase_table2.test | 11 +++++ mysql-test/t/lowercase_table3.test | 2 +- mysql-test/t/multi_update.test | 23 ++++++++++ mysys/mf_iocache.c | 6 +-- mysys/mf_pack.c | 30 +++++++++---- mysys/test_fn.c | 3 +- sql/ha_myisam.cc | 1 + sql/lock.cc | 5 +++ sql/log.cc | 2 +- sql/log_event.cc | 6 +-- sql/mf_iocache.cc | 7 --- sql/mysqld.cc | 45 +++++++++++-------- sql/opt_range.cc | 6 +-- sql/repl_failsafe.cc | 2 +- sql/slave.cc | 55 ++++++++++++++++------- sql/slave.h | 2 +- sql/sql_base.cc | 4 ++ sql/sql_db.cc | 65 +++++++++++++++------------- sql/sql_handler.cc | 2 +- sql/sql_repl.cc | 14 +++--- sql/sql_select.cc | 17 ++++++-- sql/sql_table.cc | 7 +-- sql/sql_yacc.yy | 2 +- sql/table.cc | 3 +- 32 files changed, 265 insertions(+), 118 deletions(-) diff --git a/BUILD/compile-pentium-debug-max b/BUILD/compile-pentium-debug-max index 1684686ce8c..af9bed1569f 100755 --- a/BUILD/compile-pentium-debug-max +++ b/BUILD/compile-pentium-debug-max @@ -8,6 +8,6 @@ c_warnings="$c_warnings $debug_extra_warnings" cxx_warnings="$cxx_warnings $debug_extra_warnings" extra_configs="$pentium_configs $debug_configs" -extra_configs="$extra_configs --with-berkeley-db --with-innodb --with-embedded-server --with-openssl" +extra_configs="$extra_configs --with-berkeley-db --with-innodb --with-embedded-server --with-openssl --with-vio --with-raid" . "$path/FINISH.sh" diff --git a/configure.in b/configure.in index c05329a1680..a50d89c8655 100644 --- a/configure.in +++ b/configure.in @@ -1012,7 +1012,7 @@ case $SYSTEM_TYPE in *darwin5*) if test "$ac_cv_prog_gcc" = "yes" then - FLAGS="-traditional-cpp -DHAVE_DARWIN_THREADS -D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ -DHAVE_BROKEN_REALPATH -DFN_NO_CASE_SENCE" + FLAGS="-traditional-cpp -DHAVE_DARWIN_THREADS -D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ -DHAVE_BROKEN_REALPATH" CFLAGS="$CFLAGS $FLAGS" CXXFLAGS="$CXXFLAGS $FLAGS" MAX_C_OPTIMIZE="-O" @@ -1022,7 +1022,7 @@ case $SYSTEM_TYPE in *darwin6*) if test "$ac_cv_prog_gcc" = "yes" then - FLAGS="-DHAVE_DARWIN_THREADS -D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ -DHAVE_BROKEN_REALPATH -DFN_NO_CASE_SENCE" + FLAGS="-DHAVE_DARWIN_THREADS -D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ -DHAVE_BROKEN_REALPATH" CFLAGS="$CFLAGS $FLAGS" CXXFLAGS="$CXXFLAGS $FLAGS" MAX_C_OPTIMIZE="-O" @@ -1031,7 +1031,7 @@ case $SYSTEM_TYPE in *darwin7*) if test "$ac_cv_prog_gcc" = "yes" then - FLAGS="-DHAVE_DARWIN_THREADS -D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ -DFN_NO_CASE_SENCE" + FLAGS="-DHAVE_DARWIN_THREADS -D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ" CFLAGS="$CFLAGS $FLAGS" CXXFLAGS="$CXXFLAGS $FLAGS" MAX_C_OPTIMIZE="-O" diff --git a/include/my_sys.h b/include/my_sys.h index 75e22629a19..8f0040055d6 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -612,7 +612,7 @@ extern void pack_dirname(my_string to,const char *from); extern uint unpack_dirname(my_string to,const char *from); extern uint cleanup_dirname(my_string to,const char *from); extern uint system_filename(my_string to,const char *from); -extern my_string unpack_filename(my_string to,const char *from); +extern uint unpack_filename(my_string to,const char *from); extern my_string intern_filename(my_string to,const char *from); extern my_string directory_file_name(my_string dst, const char *src); extern int pack_filename(my_string to, const char *name, size_s max_length); @@ -682,9 +682,9 @@ extern int my_b_safe_write(IO_CACHE *info,const byte *Buffer,uint Count); extern int my_block_write(IO_CACHE *info, const byte *Buffer, uint Count, my_off_t pos); -extern int _flush_io_cache(IO_CACHE *info, int need_append_buffer_lock); +extern int my_b_flush_io_cache(IO_CACHE *info, int need_append_buffer_lock); -#define flush_io_cache(info) _flush_io_cache((info),1) +#define flush_io_cache(info) my_b_flush_io_cache((info),1) extern int end_io_cache(IO_CACHE *info); extern uint my_b_fill(IO_CACHE *info); diff --git a/mysql-test/install_test_db.sh b/mysql-test/install_test_db.sh index 8f90301d2d8..dcac79a6cf4 100644 --- a/mysql-test/install_test_db.sh +++ b/mysql-test/install_test_db.sh @@ -208,7 +208,7 @@ then fi mysqld_boot=" $execdir/mysqld --no-defaults --bootstrap --skip-grant-tables \ - --basedir=$basedir --datadir=$ldata --skip-innodb --skip-bdb $EXTRA_ARG" + --basedir=$basedir --datadir=$ldata --skip-innodb --skip-bdb --skip-warnings $EXTRA_ARG" echo "running $mysqld_boot" if $mysqld_boot << END_OF_DATA diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index cbb4987040d..d362e885dee 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -315,6 +315,8 @@ while test $# -gt 0; do $ECHO "Note: you will get more meaningful output on a source distribution compiled with debugging option when running tests with --gdb option" fi DO_GDB=1 + EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT --gdb" + EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT --gdb" # This needs to be checked properly # USE_MANAGER=1 USE_RUNNING_SERVER="" @@ -1025,7 +1027,7 @@ start_slave() if [ x$DO_DDD = x1 ] then - $ECHO "set args $master_args" > $GDB_SLAVE_INIT + $ECHO "set args $slave_args" > $GDB_SLAVE_INIT manager_launch $slave_ident ddd -display $DISPLAY --debugger \ "gdb -x $GDB_SLAVE_INIT" $SLAVE_MYSQLD elif [ x$DO_GDB = x1 ] diff --git a/mysql-test/r/lowercase_table2.result b/mysql-test/r/lowercase_table2.result index e582978c126..737d49fc340 100644 --- a/mysql-test/r/lowercase_table2.result +++ b/mysql-test/r/lowercase_table2.result @@ -106,3 +106,18 @@ SELECT * from T1; a 1 DROP TABLE T1; +create table T1 (EVENT_ID int auto_increment primary key, LOCATION char(20)); +insert into T1 values (NULL,"Mic-4"),(NULL,"Mic-5"),(NULL,"Mic-6"); +SELECT LOCATION FROM T1 WHERE EVENT_ID=2 UNION ALL SELECT LOCATION FROM T1 WHERE EVENT_ID=3; +LOCATION +Mic-5 +Mic-6 +SELECT LOCATION FROM T1 WHERE EVENT_ID=2 UNION ALL SELECT LOCATION FROM T1 WHERE EVENT_ID=3; +LOCATION +Mic-5 +Mic-6 +SELECT LOCATION FROM T1 WHERE EVENT_ID=2 UNION ALL SELECT LOCATION FROM T1 WHERE EVENT_ID=3; +LOCATION +Mic-5 +Mic-6 +drop table T1; diff --git a/mysql-test/r/lowercase_table3.result b/mysql-test/r/lowercase_table3.result index 0676c42e12b..362d17e0461 100644 --- a/mysql-test/r/lowercase_table3.result +++ b/mysql-test/r/lowercase_table3.result @@ -6,5 +6,5 @@ drop table t1; flush tables; CREATE TABLE t1 (a int) type=INNODB; SELECT * from T1; -Table 'test.T1' doesn't exist +Can't open file: 'T1.InnoDB'. (errno: 1) drop table t1; diff --git a/mysql-test/r/multi_update.result b/mysql-test/r/multi_update.result index 31be96fc0fd..21035c8bc60 100644 --- a/mysql-test/r/multi_update.result +++ b/mysql-test/r/multi_update.result @@ -360,3 +360,29 @@ where 0=1; delete t1, t2 from t2,t1 where t1.id1=t2.id2 and 0=1; drop table t1,t2; +CREATE TABLE t1 ( a int ); +CREATE TABLE t2 ( a int ); +DELETE t1 FROM t1, t2 AS t3; +DELETE t4 FROM t1, t1 AS t4; +Not unique table/alias: 't4' +DELETE t3 FROM t1 AS t3, t1 AS t4; +Not unique table/alias: 't3' +DELETE t1 FROM t1 AS t3, t2 AS t4; +INSERT INTO t1 values (1),(2); +INSERT INTO t2 values (1),(2); +DELETE t1 FROM t1 AS t2, t2 AS t1 where t1.a=t2.a and t1.a=1; +SELECT * from t1; +a +2 +SELECT * from t2; +a +1 +2 +DELETE t2 FROM t1 AS t2, t2 AS t1 where t1.a=t2.a and t1.a=2; +SELECT * from t1; +a +2 +SELECT * from t2; +a +1 +DROP TABLE t1,t2; diff --git a/mysql-test/t/lowercase_table2.test b/mysql-test/t/lowercase_table2.test index 86bb26f0cf9..8f542a7af78 100644 --- a/mysql-test/t/lowercase_table2.test +++ b/mysql-test/t/lowercase_table2.test @@ -78,3 +78,14 @@ RENAME TABLE T2 TO T1; SHOW TABLES LIKE "T1"; SELECT * from T1; DROP TABLE T1; + +# +# Test problem with temporary tables (Bug #2858) +# + +create table T1 (EVENT_ID int auto_increment primary key, LOCATION char(20)); +insert into T1 values (NULL,"Mic-4"),(NULL,"Mic-5"),(NULL,"Mic-6"); +SELECT LOCATION FROM T1 WHERE EVENT_ID=2 UNION ALL SELECT LOCATION FROM T1 WHERE EVENT_ID=3; +SELECT LOCATION FROM T1 WHERE EVENT_ID=2 UNION ALL SELECT LOCATION FROM T1 WHERE EVENT_ID=3; +SELECT LOCATION FROM T1 WHERE EVENT_ID=2 UNION ALL SELECT LOCATION FROM T1 WHERE EVENT_ID=3; +drop table T1; diff --git a/mysql-test/t/lowercase_table3.test b/mysql-test/t/lowercase_table3.test index 83ffaaad2d1..735a0b390f9 100644 --- a/mysql-test/t/lowercase_table3.test +++ b/mysql-test/t/lowercase_table3.test @@ -32,6 +32,6 @@ flush tables; # CREATE TABLE t1 (a int) type=INNODB; ---error 1146 +--error 1016 SELECT * from T1; drop table t1; diff --git a/mysql-test/t/multi_update.test b/mysql-test/t/multi_update.test index be82870cccd..283637912a1 100644 --- a/mysql-test/t/multi_update.test +++ b/mysql-test/t/multi_update.test @@ -302,3 +302,26 @@ delete t1, t2 from t2,t1 where t1.id1=t2.id2 and 0=1; drop table t1,t2; + +# +# Test alias (this is not correct in 4.0) +# + +CREATE TABLE t1 ( a int ); +CREATE TABLE t2 ( a int ); +DELETE t1 FROM t1, t2 AS t3; +--error 1066 +DELETE t4 FROM t1, t1 AS t4; +--error 1066 +DELETE t3 FROM t1 AS t3, t1 AS t4; +#--error 1066 +DELETE t1 FROM t1 AS t3, t2 AS t4; +INSERT INTO t1 values (1),(2); +INSERT INTO t2 values (1),(2); +DELETE t1 FROM t1 AS t2, t2 AS t1 where t1.a=t2.a and t1.a=1; +SELECT * from t1; +SELECT * from t2; +DELETE t2 FROM t1 AS t2, t2 AS t1 where t1.a=t2.a and t1.a=2; +SELECT * from t1; +SELECT * from t2; +DROP TABLE t1,t2; diff --git a/mysys/mf_iocache.c b/mysys/mf_iocache.c index d96d4c0db3c..c5bd7db9677 100644 --- a/mysys/mf_iocache.c +++ b/mysys/mf_iocache.c @@ -962,7 +962,7 @@ int my_b_append(register IO_CACHE *info, const byte *Buffer, uint Count) Buffer+=rest_length; Count-=rest_length; info->write_pos+=rest_length; - if (_flush_io_cache(info,0)) + if (my_b_flush_io_cache(info,0)) { unlock_append_buffer(info); return 1; @@ -1069,12 +1069,12 @@ int my_block_write(register IO_CACHE *info, const byte *Buffer, uint Count, #endif -int _flush_io_cache(IO_CACHE *info, int need_append_buffer_lock) +int my_b_flush_io_cache(IO_CACHE *info, int need_append_buffer_lock) { uint length; my_bool append_cache; my_off_t pos_in_file; - DBUG_ENTER("_flush_io_cache"); + DBUG_ENTER("my_b_flush_io_cache"); if (!(append_cache = (info->type == SEQ_READ_APPEND))) need_append_buffer_lock=0; diff --git a/mysys/mf_pack.c b/mysys/mf_pack.c index e2e811fe89a..95a1d68507e 100644 --- a/mysys/mf_pack.c +++ b/mysys/mf_pack.c @@ -347,11 +347,25 @@ static my_string NEAR_F expand_tilde(my_string *path) return (my_string) 0; } - /* fix filename so it can be used by open, create .. */ - /* to may be == from */ - /* Returns to */ -my_string unpack_filename(my_string to, const char *from) +/* + Fix filename so it can be used by open, create + + SYNOPSIS + unpack_filename() + to Store result here. Must be at least of size FN_REFLEN. + from Filename in unix format (with ~) + + RETURN + # length of to + + NOTES + to may be == from + ~ will only be expanded if total length < FN_REFLEN +*/ + + +uint unpack_filename(my_string to, const char *from) { uint length,n_length; char buff[FN_REFLEN]; @@ -362,17 +376,17 @@ my_string unpack_filename(my_string to, const char *from) if (n_length+strlen(from+length) < FN_REFLEN) { (void) strmov(buff+n_length,from+length); - (void) system_filename(to,buff); /* Fix to usably filename */ + length= system_filename(to,buff); /* Fix to usably filename */ } else - (void) system_filename(to,from); /* Fix to usably filename */ - DBUG_RETURN(to); + length= system_filename(to,from); /* Fix to usably filename */ + DBUG_RETURN(length); } /* unpack_filename */ /* Convert filename (unix standard) to system standard */ /* Used before system command's like open(), create() .. */ - /* Returns to */ + /* Returns length of to */ uint system_filename(my_string to, const char *from) { diff --git a/mysys/test_fn.c b/mysys/test_fn.c index 5a0546392ab..d0fb9f59fd6 100644 --- a/mysys/test_fn.c +++ b/mysys/test_fn.c @@ -59,7 +59,8 @@ int main(int argc __attribute__((unused)), char **argv) printf("org : '%s'\n",*pos); printf("pack: '%s'\n",fn_format(buff,*pos,"","",8)); printf("unpack: '%s'\n",fn_format(buff2,*pos,"","",4)); - if (strcmp(unpack_filename(buff,buff),buff2) != 0) + unpack_filename(buff,buff); + if (strcmp(buff,buff2) != 0) { printf("error on cmp: '%s' != '%s'\n",buff,buff2); } diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc index d630e9774a5..d5bbf9b5a92 100644 --- a/sql/ha_myisam.cc +++ b/sql/ha_myisam.cc @@ -1210,6 +1210,7 @@ int ha_myisam::create(const char *name, register TABLE *table_arg, create_info.data_file_name= info->data_file_name; create_info.index_file_name=info->index_file_name; + /* TODO: Check that the following fn_format is really needed */ error=mi_create(fn_format(buff,name,"","",2+4), table_arg->keys,keydef, (uint) (recinfo_pos-recinfo), recinfo, diff --git a/sql/lock.cc b/sql/lock.cc index 41a76007289..5010d115a6c 100644 --- a/sql/lock.cc +++ b/sql/lock.cc @@ -490,11 +490,14 @@ int lock_table_name(THD *thd, TABLE_LIST *table_list) char *db= table_list->db ? table_list->db : (thd->db ? thd->db : (char*) ""); uint key_length; DBUG_ENTER("lock_table_name"); + DBUG_PRINT("enter",("db: %s name: %s", db, table_list->real_name)); + safe_mutex_assert_owner(&LOCK_open); key_length=(uint) (strmov(strmov(key,db)+1,table_list->real_name) -key)+ 1; + /* Only insert the table if we haven't insert it already */ for (table=(TABLE*) hash_search(&open_cache,(byte*) key,key_length) ; table ; @@ -526,6 +529,7 @@ int lock_table_name(THD *thd, TABLE_LIST *table_list) DBUG_RETURN(0); } + void unlock_table_name(THD *thd, TABLE_LIST *table_list) { if (table_list->table) @@ -535,6 +539,7 @@ void unlock_table_name(THD *thd, TABLE_LIST *table_list) } } + static bool locked_named_table(THD *thd, TABLE_LIST *table_list) { for (; table_list ; table_list=table_list->next) diff --git a/sql/log.cc b/sql/log.cc index 559d30f28ba..7b402421951 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -695,7 +695,7 @@ int MYSQL_LOG::purge_first_log(struct st_relay_log_info* rli) sizeof(rli->relay_log_name)-1); /* Store where we are in the new file for the execution thread */ - flush_relay_log_info(rli); + flush_relay_log_info(rli, 0); err: pthread_mutex_unlock(&LOCK_index); diff --git a/sql/log_event.cc b/sql/log_event.cc index 603c8431b03..1b8976df8dc 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -231,7 +231,7 @@ int Log_event::exec_event(struct st_relay_log_info* rli) else { rli->inc_pos(get_event_len(),log_pos); - flush_relay_log_info(rli); + flush_relay_log_info(rli, 1); } } return 0; @@ -2201,7 +2201,7 @@ int Stop_log_event::exec_event(struct st_relay_log_info* rli) the target position when in fact we have not. */ rli->inc_pos(get_event_len(), 0); - flush_relay_log_info(rli); + flush_relay_log_info(rli, 0); return 0; } @@ -2248,7 +2248,7 @@ int Rotate_log_event::exec_event(struct st_relay_log_info* rli) } pthread_mutex_unlock(&rli->data_lock); pthread_cond_broadcast(&rli->data_cond); - flush_relay_log_info(rli); + flush_relay_log_info(rli, 0); DBUG_RETURN(0); } diff --git a/sql/mf_iocache.cc b/sql/mf_iocache.cc index c79317cfeb3..5c63820a6ae 100644 --- a/sql/mf_iocache.cc +++ b/sql/mf_iocache.cc @@ -30,14 +30,7 @@ flush_io_cache(). */ -#define MAP_TO_USE_RAID #include "mysql_priv.h" -#ifdef HAVE_AIOWAIT -#include -#include -static void my_aiowait(my_aio_result *result); -#endif -#include extern "C" { diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 6699a502604..6037155794b 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -1040,8 +1040,8 @@ static void set_user(const char *user) { /* Don't give a warning, if real user is same as given with --user */ struct passwd *user_info= getpwnam(user); - - if (!user_info || user_id != user_info->pw_uid) + if ((!user_info || user_id != user_info->pw_uid) && + global_system_variables.log_warnings) fprintf(stderr, "Warning: One can only use the --user switch if running as root\n"); } @@ -2108,22 +2108,25 @@ int main(int argc, char **argv) insensitive names. If this is not done the users MyISAM tables will get corrupted if accesses with names of different case. */ + DBUG_PRINT("info", ("lower_case_table_names: %d", lower_case_table_names)); if (!lower_case_table_names && (lower_case_file_system= (test_if_case_insensitive(mysql_real_data_home) == 1))) { if (lower_case_table_names_used) { - sql_print_error("\ + if (global_system_variables.log_warnings) + sql_print_error("\ Warning: You have forced lower_case_table_names to 0 through a command line \ option, even if your file system '%s' is case insensitive. This means that \ you can corrupt an MyISAM table by accessing it with different cases. You \ should consider changing lower_case_table_names to 1 or 2", - mysql_real_data_home); + mysql_real_data_home); } else { - sql_print_error("Warning: Setting lower_case_table_names=2 because file system for %s is case insensitive", mysql_real_data_home); + if (global_system_variables.log_warnings) + sql_print_error("Warning: Setting lower_case_table_names=2 because file system for %s is case insensitive", mysql_real_data_home); lower_case_table_names= 2; } } @@ -2187,7 +2190,8 @@ should consider changing lower_case_table_names to 1 or 2", DBUG_PRINT("warning", ("Changed limits: max_connections: %ld table_cache: %ld", max_connections,table_cache_size)); - sql_print_error("Warning: Changed limits: max_connections: %ld table_cache: %ld",max_connections,table_cache_size); + if (global_system_variables.log_warnings) + sql_print_error("Warning: Changed limits: max_connections: %ld table_cache: %ld",max_connections,table_cache_size); } open_files_limit= files; } @@ -2277,7 +2281,8 @@ should consider changing lower_case_table_names to 1 or 2", { if (mlockall(MCL_CURRENT)) { - sql_print_error("Warning: Failed to lock memory. Errno: %d\n",errno); + if (global_system_variables.log_warnings) + sql_print_error("Warning: Failed to lock memory. Errno: %d\n",errno); } else locked_in_memory=1; @@ -2428,7 +2433,7 @@ Now disabling --log-slave-updates."); (!have_tcpip || opt_disable_networking)) { sql_print_error("TCP/IP or --enable-named-pipe should be configured on NT OS"); - unireg_abort(1); + unireg_abort(1); } else { @@ -5032,14 +5037,16 @@ static uint set_maximum_open_files(uint max_file_limit) rlimit.rlim_cur=rlimit.rlim_max=max_file_limit; if (setrlimit(RLIMIT_NOFILE,&rlimit)) { - sql_print_error("Warning: setrlimit couldn't increase number of open files to more than %lu (request: %u)", - old_cur, max_file_limit); /* purecov: inspected */ + if (global_system_variables.log_warnings) + sql_print_error("Warning: setrlimit couldn't increase number of open files to more than %lu (request: %u)", + old_cur, max_file_limit); /* purecov: inspected */ max_file_limit=old_cur; } else { (void) getrlimit(RLIMIT_NOFILE,&rlimit); - if ((uint) rlimit.rlim_cur != max_file_limit) + if ((uint) rlimit.rlim_cur != max_file_limit && + global_system_variables.log_warnings) sql_print_error("Warning: setrlimit returned ok, but didn't change limits. Max open files is %ld (request: %u)", (ulong) rlimit.rlim_cur, max_file_limit); /* purecov: inspected */ @@ -5064,10 +5071,12 @@ static uint set_maximum_open_files(uint max_file_limit) // set new limit cbReqCount = max_file_limit - cbCurMaxFH0; ulrc = DosSetRelMaxFH( &cbReqCount, &cbCurMaxFH); - if (ulrc) { - sql_print_error("Warning: DosSetRelMaxFH couldn't increase number of open files to more than %d", - cbCurMaxFH0); - cbCurMaxFH = cbCurMaxFH0; + if (ulrc) + { + if (global_system_variables.log_warnings) + sql_print_error("Warning: DosSetRelMaxFH couldn't increase number of open files to more than %d", + cbCurMaxFH0); + cbCurMaxFH = cbCurMaxFH0; } return cbCurMaxFH; @@ -5153,6 +5162,7 @@ static int test_if_case_insensitive(const char *dir_name) File file; char buff[FN_REFLEN], buff2[FN_REFLEN]; MY_STAT stat_info; + DBUG_ENTER("test_if_case_insensitive"); fn_format(buff, glob_hostname, dir_name, ".lower-test", MY_UNPACK_FILENAME | MY_REPLACE_EXT | MY_REPLACE_DIR); @@ -5162,13 +5172,14 @@ static int test_if_case_insensitive(const char *dir_name) if ((file= my_create(buff, 0666, O_RDWR, MYF(0))) < 0) { sql_print_error("Warning: Can't create test file %s", buff); - return -1; + DBUG_RETURN(-1); } my_close(file, MYF(0)); if (my_stat(buff2, &stat_info, MYF(0))) result= 1; // Can access file (void) my_delete(buff, MYF(MY_WME)); - return result; + DBUG_PRINT("exit", ("result: %d", result)); + DBUG_RETURN(result); } diff --git a/sql/opt_range.cc b/sql/opt_range.cc index 071c83bb6d2..dfed08479f9 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -2144,6 +2144,7 @@ static ulong count_key_part_usage(SEL_ARG *root, SEL_ARG *key) void SEL_ARG::test_use_count(SEL_ARG *root) { + uint e_count=0; if (this == root && use_count != 1) { sql_print_error("Note: Use_count: Wrong count %lu for root",use_count); @@ -2151,7 +2152,6 @@ void SEL_ARG::test_use_count(SEL_ARG *root) } if (this->type != SEL_ARG::KEY_RANGE) return; - uint e_count=0; for (SEL_ARG *pos=first(); pos ; pos=pos->next) { e_count++; @@ -2168,8 +2168,8 @@ void SEL_ARG::test_use_count(SEL_ARG *root) } } if (e_count != elements) - sql_print_error("Warning: Wrong use count: %u for tree at %lx", e_count, - (gptr) this); + sql_print_error("Warning: Wrong use count: %u (should be %u) for tree at %lx", + e_count, elements, (gptr) this); } #endif diff --git a/sql/repl_failsafe.cc b/sql/repl_failsafe.cc index 6599516044a..61d4cee4c09 100644 --- a/sql/repl_failsafe.cc +++ b/sql/repl_failsafe.cc @@ -920,7 +920,7 @@ int load_master_data(THD* thd) active_mi->rli.master_log_pos = active_mi->master_log_pos; strmake(active_mi->rli.master_log_name,active_mi->master_log_name, sizeof(active_mi->rli.master_log_name)-1); - flush_relay_log_info(&active_mi->rli); + flush_relay_log_info(&active_mi->rli, 0); pthread_cond_broadcast(&active_mi->rli.data_cond); pthread_mutex_unlock(&active_mi->rli.data_lock); thd->proc_info = "starting slave"; diff --git a/sql/slave.cc b/sql/slave.cc index d6510b26271..21337e0476e 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -584,19 +584,26 @@ int start_slave_threads(bool need_slave_mutex, bool wait_for_start, lock_cond_sql = &mi->rli.run_lock; } - if (thread_mask & SLAVE_IO) - error=start_slave_thread(handle_slave_io,lock_io,lock_cond_io, - cond_io, - &mi->slave_running, &mi->slave_run_id, - mi); - if (!error && (thread_mask & SLAVE_SQL)) - { + /* + We must first start the SQL thread, becasue for lock_slave_threads() to work + we must first unlock mi->rli.run_lock and then mi->run_lock + If we don't do this, we will get a deadlock if two threads calls START SLAVE + at the same time. + */ + + if (thread_mask & SLAVE_SQL) error=start_slave_thread(handle_slave_sql,lock_sql,lock_cond_sql, cond_sql, &mi->rli.slave_running, &mi->rli.slave_run_id, mi); + if (!error && (thread_mask & SLAVE_IO)) + { + error=start_slave_thread(handle_slave_io,lock_io,lock_cond_io, + cond_io, + &mi->slave_running, &mi->slave_run_id, + mi); if (error) - terminate_slave_threads(mi, thread_mask & SLAVE_IO, 0); + terminate_slave_threads(mi, thread_mask & SLAVE_SQL, 0); } DBUG_RETURN(error); } @@ -1431,7 +1438,7 @@ Failed to open the existing relay log info file '%s' (errno %d)", before flush_relay_log_info */ reinit_io_cache(&rli->info_file, WRITE_CACHE,0L,0,1); - if ((error= flush_relay_log_info(rli))) + if ((error= flush_relay_log_info(rli, 0))) sql_print_error("Failed to flush relay log info file"); if (count_relay_log_space(rli)) { @@ -1650,9 +1657,9 @@ file '%s')", fname); mi->master_log_name, (ulong) mi->master_log_pos)); + mi->rli.mi = mi; if (init_relay_log_info(&mi->rli, slave_info_fname)) goto err; - mi->rli.mi = mi; mi->inited = 1; // now change cache READ -> WRITE - must do this before flush_master_info @@ -2279,7 +2286,7 @@ static int exec_relay_log_event(THD* thd, RELAY_LOG_INFO* rli) rli->inc_pos(ev->get_event_len(), type_code != STOP_EVENT ? ev->log_pos : LL(0), 1/* skip lock*/); - flush_relay_log_info(rli); + flush_relay_log_info(rli, 0); /* Protect against common user error of setting the counter to 1 @@ -3239,6 +3246,7 @@ static int safe_reconnect(THD* thd, MYSQL* mysql, MASTER_INFO* mi, SYNOPSIS flush_relay_log_info() rli Relay log information + flush_cur_log Flush the current log if it's a hot log. NOTES - As this is only called by the slave thread, we don't need to @@ -3251,6 +3259,8 @@ static int safe_reconnect(THD* thd, MYSQL* mysql, MASTER_INFO* mi, If this would not be the case, we would have to ensure that we don't delete the relay log file where the transaction started when we switch to a new relay log file. + - The reason for flushing current log is to ensure that we have saved on + disk the last query the SQL thread read TODO - Change the log file information to a binary format to avoid calling @@ -3261,7 +3271,7 @@ static int safe_reconnect(THD* thd, MYSQL* mysql, MASTER_INFO* mi, 1 write error */ -bool flush_relay_log_info(RELAY_LOG_INFO* rli) +bool flush_relay_log_info(RELAY_LOG_INFO* rli, bool flush_cur_log) { bool error=0; IO_CACHE *file = &rli->info_file; @@ -3284,8 +3294,23 @@ bool flush_relay_log_info(RELAY_LOG_INFO* rli) error=1; if (flush_io_cache(file)) error=1; - if (flush_io_cache(rli->cur_log)) // QQ Why this call ? - error=1; + + /* + We want to flush the io log here if this is a hot cache to ensure + that we have the execute SQL statement on disk. + */ + if (flush_cur_log) + { + /* + The following mutex is to protect us against log changes in middle of + the flush_io_cache() call + */ + pthread_mutex_lock(&rli->mi->data_lock); + /* Only flush hot logs */ + if (rli->cur_log != &rli->cache_buf && flush_io_cache(rli->cur_log)) + error=1; + pthread_mutex_unlock(&rli->mi->data_lock); + } return error; } @@ -3506,7 +3531,7 @@ rli->relay_log_pos=%s rli->pending=%lu", rli->pending=0; strmake(rli->relay_log_name,rli->linfo.log_file_name, sizeof(rli->relay_log_name)-1); - flush_relay_log_info(rli); + flush_relay_log_info(rli, 0); } /* diff --git a/sql/slave.h b/sql/slave.h index 8331e722a51..0ae0c7d6de4 100644 --- a/sql/slave.h +++ b/sql/slave.h @@ -362,7 +362,7 @@ typedef struct st_table_rule_ent int init_slave(); void init_slave_skip_errors(const char* arg); bool flush_master_info(MASTER_INFO* mi); -bool flush_relay_log_info(RELAY_LOG_INFO* rli); +bool flush_relay_log_info(RELAY_LOG_INFO* rli, bool flush_cur_log); int register_slave_on_master(MYSQL* mysql); int terminate_slave_threads(MASTER_INFO* mi, int thread_mask, bool skip_lock = 0); diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 95ef7acb5ab..9da1f4e2231 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -1706,7 +1706,11 @@ bool rm_temporary_table(enum db_type base, char *path) *fn_ext(path)='\0'; // remove extension handler *file=get_new_handler((TABLE*) 0, base); if (file && file->delete_table(path)) + { error=1; + sql_print_error("Warning: Could not remove tmp table: '%s', error: %d", + path, my_errno); + } delete file; return error; } diff --git a/sql/sql_db.cc b/sql/sql_db.cc index ca9989d986c..a88cff0cd9b 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -242,6 +242,7 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db, idx++) { FILEINFO *file=dirp->dir_entry+idx; + char *extension; DBUG_PRINT("info",("Examining: %s", file->name)); /* Check if file is a raid directory */ @@ -251,59 +252,55 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db, (file->name[1] >= 'a' && file->name[1] <= 'f')) && !file->name[2] && !level) { - char newpath[FN_REFLEN]; + char newpath[FN_REFLEN], *copy_of_path; MY_DIR *new_dirp; String *dir; + uint length; strxmov(newpath,org_path,"/",file->name,NullS); - unpack_filename(newpath,newpath); + length= unpack_filename(newpath,newpath); if ((new_dirp = my_dir(newpath,MYF(MY_DONT_SORT)))) { DBUG_PRINT("my",("New subdir found: %s", newpath)); if ((mysql_rm_known_files(thd, new_dirp, NullS, newpath,1)) < 0) - { - my_dirend(dirp); - DBUG_RETURN(-1); - } - raid_dirs.push_back(dir=new String(newpath)); - dir->copy(); + goto err; + if (!(copy_of_path= thd->memdup(newpath, length+1)) || + !(dir= new String(copy_of_path, length)) || + raid_dirs.push_back(dir)) + goto err; continue; } found_other_files++; continue; } - if (find_type(fn_ext(file->name),&deletable_extentions,1+2) <= 0) + extension= fn_ext(file->name); + if (find_type(extension, &deletable_extentions,1+2) <= 0) { - if (find_type(fn_ext(file->name),&known_extentions,1+2) <= 0) + if (find_type(extension, &known_extentions,1+2) <= 0) found_other_files++; continue; } - strxmov(filePath,org_path,"/",file->name,NullS); - if (db && !my_strcasecmp(fn_ext(file->name), reg_ext)) + if (db && !my_strcasecmp(extension, reg_ext)) { /* Drop the table nicely */ - *fn_ext(file->name)=0; // Remove extension + *extension= 0; // Remove extension TABLE_LIST *table_list=(TABLE_LIST*) thd->calloc(sizeof(*table_list)+ strlen(db)+strlen(file->name)+2); if (!table_list) - { - my_dirend(dirp); - DBUG_RETURN(-1); - } + goto err; table_list->db= (char*) (table_list+1); - strmov(table_list->real_name=strmov(table_list->db,db)+1, - file->name); + strmov(table_list->real_name= strmov(table_list->db,db)+1, file->name); + table_list->alias= table_list->real_name; // If lower_case_table_names=2 /* Link into list */ (*tot_list_next)= table_list; tot_list_next= &table_list->next; } else { - + strxmov(filePath, org_path, "/", file->name, NullS); if (my_delete_with_symlink(filePath,MYF(MY_WME))) { - my_dirend(dirp); - DBUG_RETURN(-1); + goto err; } deleted++; } @@ -311,14 +308,17 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db, if (thd->killed || (tot_list && mysql_rm_table_part2_with_lock(thd, tot_list, 1, 1))) { - my_dirend(dirp); - DBUG_RETURN(-1); + goto err; + } + + /* Remove RAID directories */ + { + List_iterator it(raid_dirs); + String *dir; + while ((dir= it++)) + if (rmdir(dir->c_ptr()) < 0) + found_other_files++; } - List_iterator it(raid_dirs); - String *dir; - while ((dir= it++)) - if (rmdir(dir->c_ptr()) < 0) - found_other_files++; my_dirend(dirp); /* @@ -328,7 +328,8 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db, if (!found_other_files) { char tmp_path[FN_REFLEN], *pos; - char *path=unpack_filename(tmp_path,org_path); + char *path= tmp_path; + unpack_filename(tmp_path,org_path); #ifdef HAVE_READLINK int error; @@ -365,6 +366,10 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db, } } DBUG_RETURN(deleted); + +err: + my_dirend(dirp); + DBUG_RETURN(-1); } diff --git a/sql/sql_handler.cc b/sql/sql_handler.cc index 963111015da..a80b4040882 100644 --- a/sql/sql_handler.cc +++ b/sql/sql_handler.cc @@ -36,7 +36,7 @@ But !!! do_command calls free_root at the end of every query and frees up all the sql_alloc'ed memory. It's harder to work around... - */ +*/ #define HANDLER_TABLES_HACK(thd) { \ TABLE *tmp=thd->open_tables; \ diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc index c95cdc1b04e..85dcd3b5236 100644 --- a/sql/sql_repl.cc +++ b/sql/sql_repl.cc @@ -1011,14 +1011,14 @@ int change_master(THD* thd, MASTER_INFO* mi) mi->rli.abort_pos_wait++; /* for MASTER_POS_WAIT() to abort */ /* Clear the error, for a clean start. */ clear_last_slave_error(&mi->rli); - /* - If we don't write new coordinates to disk now, then old will remain in - relay-log.info until START SLAVE is issued; but if mysqld is shutdown - before START SLAVE, then old will remain in relay-log.info, and will be the - in-memory value at restart (thus causing errors, as the old relay log does - not exist anymore). + /* + If we don't write new coordinates to disk now, then old will remain in + relay-log.info until START SLAVE is issued; but if mysqld is shutdown + before START SLAVE, then old will remain in relay-log.info, and will be the + in-memory value at restart (thus causing errors, as the old relay log + does not exist anymore). */ - flush_relay_log_info(&mi->rli); + flush_relay_log_info(&mi->rli, 0); pthread_cond_broadcast(&mi->data_cond); pthread_mutex_unlock(&mi->rli.data_lock); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 012be95c381..3ffa4e6a92c 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -4463,13 +4463,22 @@ free_tmp_table(THD *thd, TABLE *entry) save_proc_info=thd->proc_info; thd->proc_info="removing tmp table"; free_blobs(entry); - if (entry->db_stat && entry->file) + if (entry->file) { - (void) entry->file->close(); + if (entry->db_stat) + { + (void) entry->file->close(); + } + /* + We can't call ha_delete_table here as the table may created in mixed case + here and we have to ensure that delete_table gets the table name in + the original case. + */ + if (!(test_flags & TEST_KEEP_TMP_TABLES) || entry->db_type == DB_TYPE_HEAP) + entry->file->delete_table(entry->real_name); delete entry->file; } - if (!(test_flags & TEST_KEEP_TMP_TABLES) || entry->db_type == DB_TYPE_HEAP) - (void) ha_delete_table(entry->db_type,entry->real_name); + /* free blobs */ for (Field **ptr=entry->field ; *ptr ; ptr++) delete *ptr; diff --git a/sql/sql_table.cc b/sql/sql_table.cc index c738eb0a3e7..48151ef55b9 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -1987,10 +1987,11 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, VOID(pthread_mutex_unlock(&LOCK_open)); goto err; } + /* - ** Data is copied. Now we rename the old table to a temp name, - ** rename the new one to the old name, remove all entries from the old table - ** from the cash, free all locks, close the old table and remove it. + Data is copied. Now we rename the old table to a temp name, + rename the new one to the old name, remove all entries from the old table + from the cash, free all locks, close the old table and remove it. */ thd->proc_info="rename result table"; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 5add9199ad4..52334b4830e 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -3246,7 +3246,7 @@ table_ident: ; table_ident_ref: - ident { LEX_STRING db={"",0}; $$=new Table_ident(db,$1,0); } + ident { LEX_STRING db={(char*) "",0}; $$=new Table_ident(db,$1,0); } | ident '.' ident { $$=new Table_ident($1,$3,0);} ; diff --git a/sql/table.cc b/sql/table.cc index a90220fa55b..bc9d046f617 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -618,8 +618,9 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, if (db_stat) { int err; + unpack_filename(index_file,index_file); if ((err=(outparam->file-> - ha_open(unpack_filename(index_file,index_file), + ha_open(index_file, (db_stat & HA_READ_ONLY ? O_RDONLY : O_RDWR), (db_stat & HA_OPEN_TEMPORARY ? HA_OPEN_TMP_TABLE : ((db_stat & HA_WAIT_IF_LOCKED) || From 30541b324cddeac4c948fecc304dfdd86ee12a31 Mon Sep 17 00:00:00 2001 From: "guilhem@mysql.com" <> Date: Wed, 10 Mar 2004 16:30:47 +0100 Subject: [PATCH 38/65] Undoing 2 parts of changeset 1.1730.1.1 : - the one about BUG#2921 - the one about relay log flushing Both will be rewritten in a next changeset (this one will not be pushed before the next changeset). --- sql/log.cc | 2 +- sql/log_event.cc | 6 ++--- sql/repl_failsafe.cc | 2 +- sql/slave.cc | 52 +++++++++++--------------------------------- sql/slave.h | 2 +- sql/sql_repl.cc | 6 ++--- 6 files changed, 22 insertions(+), 48 deletions(-) diff --git a/sql/log.cc b/sql/log.cc index 7b402421951..559d30f28ba 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -695,7 +695,7 @@ int MYSQL_LOG::purge_first_log(struct st_relay_log_info* rli) sizeof(rli->relay_log_name)-1); /* Store where we are in the new file for the execution thread */ - flush_relay_log_info(rli, 0); + flush_relay_log_info(rli); err: pthread_mutex_unlock(&LOCK_index); diff --git a/sql/log_event.cc b/sql/log_event.cc index 4e2aac8093b..d2957165e77 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -231,7 +231,7 @@ int Log_event::exec_event(struct st_relay_log_info* rli) else { rli->inc_pos(get_event_len(),log_pos); - flush_relay_log_info(rli, 1); + flush_relay_log_info(rli); } } return 0; @@ -2203,7 +2203,7 @@ int Stop_log_event::exec_event(struct st_relay_log_info* rli) the target position when in fact we have not. */ rli->inc_pos(get_event_len(), 0); - flush_relay_log_info(rli, 0); + flush_relay_log_info(rli); return 0; } @@ -2250,7 +2250,7 @@ int Rotate_log_event::exec_event(struct st_relay_log_info* rli) } pthread_mutex_unlock(&rli->data_lock); pthread_cond_broadcast(&rli->data_cond); - flush_relay_log_info(rli, 0); + flush_relay_log_info(rli); DBUG_RETURN(0); } diff --git a/sql/repl_failsafe.cc b/sql/repl_failsafe.cc index 61d4cee4c09..6599516044a 100644 --- a/sql/repl_failsafe.cc +++ b/sql/repl_failsafe.cc @@ -920,7 +920,7 @@ int load_master_data(THD* thd) active_mi->rli.master_log_pos = active_mi->master_log_pos; strmake(active_mi->rli.master_log_name,active_mi->master_log_name, sizeof(active_mi->rli.master_log_name)-1); - flush_relay_log_info(&active_mi->rli, 0); + flush_relay_log_info(&active_mi->rli); pthread_cond_broadcast(&active_mi->rli.data_cond); pthread_mutex_unlock(&active_mi->rli.data_lock); thd->proc_info = "starting slave"; diff --git a/sql/slave.cc b/sql/slave.cc index 21337e0476e..b497880aaa3 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -584,26 +584,19 @@ int start_slave_threads(bool need_slave_mutex, bool wait_for_start, lock_cond_sql = &mi->rli.run_lock; } - /* - We must first start the SQL thread, becasue for lock_slave_threads() to work - we must first unlock mi->rli.run_lock and then mi->run_lock - If we don't do this, we will get a deadlock if two threads calls START SLAVE - at the same time. - */ - - if (thread_mask & SLAVE_SQL) - error=start_slave_thread(handle_slave_sql,lock_sql,lock_cond_sql, - cond_sql, - &mi->rli.slave_running, &mi->rli.slave_run_id, - mi); - if (!error && (thread_mask & SLAVE_IO)) - { + if (thread_mask & SLAVE_IO) error=start_slave_thread(handle_slave_io,lock_io,lock_cond_io, cond_io, &mi->slave_running, &mi->slave_run_id, mi); + if (!error && (thread_mask & SLAVE_SQL)) + { + error=start_slave_thread(handle_slave_sql,lock_sql,lock_cond_sql, + cond_sql, + &mi->rli.slave_running, &mi->rli.slave_run_id, + mi); if (error) - terminate_slave_threads(mi, thread_mask & SLAVE_SQL, 0); + terminate_slave_threads(mi, thread_mask & SLAVE_IO, 0); } DBUG_RETURN(error); } @@ -1438,7 +1431,7 @@ Failed to open the existing relay log info file '%s' (errno %d)", before flush_relay_log_info */ reinit_io_cache(&rli->info_file, WRITE_CACHE,0L,0,1); - if ((error= flush_relay_log_info(rli, 0))) + if ((error= flush_relay_log_info(rli))) sql_print_error("Failed to flush relay log info file"); if (count_relay_log_space(rli)) { @@ -2286,7 +2279,7 @@ static int exec_relay_log_event(THD* thd, RELAY_LOG_INFO* rli) rli->inc_pos(ev->get_event_len(), type_code != STOP_EVENT ? ev->log_pos : LL(0), 1/* skip lock*/); - flush_relay_log_info(rli, 0); + flush_relay_log_info(rli); /* Protect against common user error of setting the counter to 1 @@ -3246,7 +3239,6 @@ static int safe_reconnect(THD* thd, MYSQL* mysql, MASTER_INFO* mi, SYNOPSIS flush_relay_log_info() rli Relay log information - flush_cur_log Flush the current log if it's a hot log. NOTES - As this is only called by the slave thread, we don't need to @@ -3259,8 +3251,6 @@ static int safe_reconnect(THD* thd, MYSQL* mysql, MASTER_INFO* mi, If this would not be the case, we would have to ensure that we don't delete the relay log file where the transaction started when we switch to a new relay log file. - - The reason for flushing current log is to ensure that we have saved on - disk the last query the SQL thread read TODO - Change the log file information to a binary format to avoid calling @@ -3271,7 +3261,7 @@ static int safe_reconnect(THD* thd, MYSQL* mysql, MASTER_INFO* mi, 1 write error */ -bool flush_relay_log_info(RELAY_LOG_INFO* rli, bool flush_cur_log) +bool flush_relay_log_info(RELAY_LOG_INFO* rli) { bool error=0; IO_CACHE *file = &rli->info_file; @@ -3294,23 +3284,7 @@ bool flush_relay_log_info(RELAY_LOG_INFO* rli, bool flush_cur_log) error=1; if (flush_io_cache(file)) error=1; - - /* - We want to flush the io log here if this is a hot cache to ensure - that we have the execute SQL statement on disk. - */ - if (flush_cur_log) - { - /* - The following mutex is to protect us against log changes in middle of - the flush_io_cache() call - */ - pthread_mutex_lock(&rli->mi->data_lock); - /* Only flush hot logs */ - if (rli->cur_log != &rli->cache_buf && flush_io_cache(rli->cur_log)) - error=1; - pthread_mutex_unlock(&rli->mi->data_lock); - } + /* Flushing the relay log is done by the slave I/O thread */ return error; } @@ -3531,7 +3505,7 @@ rli->relay_log_pos=%s rli->pending=%lu", rli->pending=0; strmake(rli->relay_log_name,rli->linfo.log_file_name, sizeof(rli->relay_log_name)-1); - flush_relay_log_info(rli, 0); + flush_relay_log_info(rli); } /* diff --git a/sql/slave.h b/sql/slave.h index 0ae0c7d6de4..8331e722a51 100644 --- a/sql/slave.h +++ b/sql/slave.h @@ -362,7 +362,7 @@ typedef struct st_table_rule_ent int init_slave(); void init_slave_skip_errors(const char* arg); bool flush_master_info(MASTER_INFO* mi); -bool flush_relay_log_info(RELAY_LOG_INFO* rli, bool flush_cur_log); +bool flush_relay_log_info(RELAY_LOG_INFO* rli); int register_slave_on_master(MYSQL* mysql); int terminate_slave_threads(MASTER_INFO* mi, int thread_mask, bool skip_lock = 0); diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc index 85dcd3b5236..7c56670935b 100644 --- a/sql/sql_repl.cc +++ b/sql/sql_repl.cc @@ -1015,10 +1015,10 @@ int change_master(THD* thd, MASTER_INFO* mi) If we don't write new coordinates to disk now, then old will remain in relay-log.info until START SLAVE is issued; but if mysqld is shutdown before START SLAVE, then old will remain in relay-log.info, and will be the - in-memory value at restart (thus causing errors, as the old relay log - does not exist anymore). + in-memory value at restart (thus causing errors, as the old relay log does + not exist anymore). */ - flush_relay_log_info(&mi->rli, 0); + flush_relay_log_info(&mi->rli); pthread_cond_broadcast(&mi->data_cond); pthread_mutex_unlock(&mi->rli.data_lock); From 1c0d5ad25c1f530093586e7624ae3603ff719061 Mon Sep 17 00:00:00 2001 From: "guilhem@mysql.com" <> Date: Wed, 10 Mar 2004 16:56:28 +0100 Subject: [PATCH 39/65] Backporting parts of ChangeSet 1.1620.12.1 and ChangeSet 1.1625.2.1 from 4.1. This makes the slave I/O thread flush the relay log after every event, which provides additional safety in case of brutal crash (reduces chances to lose a part of the relay log). --- sql/repl_failsafe.cc | 2 +- sql/slave.cc | 8 +++++--- sql/slave.h | 2 +- sql/sql_repl.cc | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/sql/repl_failsafe.cc b/sql/repl_failsafe.cc index 6599516044a..56789a01bf4 100644 --- a/sql/repl_failsafe.cc +++ b/sql/repl_failsafe.cc @@ -894,7 +894,7 @@ int load_master_data(THD* thd) if (active_mi->master_log_pos < BIN_LOG_HEADER_SIZE) active_mi->master_log_pos = BIN_LOG_HEADER_SIZE; active_mi->rli.pending = 0; - flush_master_info(active_mi); + flush_master_info(active_mi, 0); } mc_mysql_free_result(master_status_res); } diff --git a/sql/slave.cc b/sql/slave.cc index b497880aaa3..84f4ff4f3e0 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -1657,7 +1657,7 @@ file '%s')", fname); mi->inited = 1; // now change cache READ -> WRITE - must do this before flush_master_info reinit_io_cache(&mi->file, WRITE_CACHE,0L,0,1); - if ((error=test(flush_master_info(mi)))) + if ((error= test(flush_master_info(mi, 1)))) sql_print_error("Failed to flush master info file"); pthread_mutex_unlock(&mi->data_lock); DBUG_RETURN(error); @@ -1784,13 +1784,15 @@ int show_master_info(THD* thd, MASTER_INFO* mi) } -bool flush_master_info(MASTER_INFO* mi) +bool flush_master_info(MASTER_INFO* mi, bool flush_relay_log_cache) { IO_CACHE* file = &mi->file; char lbuf[22]; DBUG_ENTER("flush_master_info"); DBUG_PRINT("enter",("master_pos: %ld", (long) mi->master_log_pos)); + if (flush_relay_log_cache) /* Comments for this are in MySQL 4.1 */ + flush_io_cache(mi->rli.relay_log.get_log_file()); my_b_seek(file, 0L); my_b_printf(file, "%s\n%s\n%s\n%s\n%s\n%d\n%d\n", mi->master_log_name, llstr(mi->master_log_pos, lbuf), @@ -2542,7 +2544,7 @@ reconnect done to recover from failed read"); sql_print_error("Slave I/O thread could not queue event from master"); goto err; } - flush_master_info(mi); + flush_master_info(mi, 1); /* See if the relay logs take too much space. We don't lock mi->rli.log_space_lock here; this dirty read saves time diff --git a/sql/slave.h b/sql/slave.h index 8331e722a51..9877582d094 100644 --- a/sql/slave.h +++ b/sql/slave.h @@ -361,7 +361,7 @@ typedef struct st_table_rule_ent int init_slave(); void init_slave_skip_errors(const char* arg); -bool flush_master_info(MASTER_INFO* mi); +bool flush_master_info(MASTER_INFO* mi, bool flush_relay_log_cache); bool flush_relay_log_info(RELAY_LOG_INFO* rli); int register_slave_on_master(MYSQL* mysql); int terminate_slave_threads(MASTER_INFO* mi, int thread_mask, diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc index 7c56670935b..cff36eaa388 100644 --- a/sql/sql_repl.cc +++ b/sql/sql_repl.cc @@ -958,7 +958,7 @@ int change_master(THD* thd, MASTER_INFO* mi) sizeof(mi->master_log_name)-1); } - flush_master_info(mi); + flush_master_info(mi, 0); if (need_relay_log_purge) { mi->rli.skip_log_purge= 0; From faa9c92765f641a3af3b7a757544f64bc0c6ab82 Mon Sep 17 00:00:00 2001 From: "vva@eagle.mysql.r18.ru" <> Date: Wed, 10 Mar 2004 22:54:07 +0400 Subject: [PATCH 40/65] fixed BUG #2874 "Grant table bug" and added tests for testing structure of mysql db --- client/mysqltest.c | 58 +++++---- mysql-test/include/system_db_struct.inc | 12 ++ mysql-test/install_test_db.sh | 28 ++--- mysql-test/mysql-test-run.sh | 16 ++- mysql-test/r/system_mysql_db.result | 119 ++++++++++++++++++ mysql-test/r/system_mysql_db_refs.result | 67 ++++++++++ mysql-test/t/reserv/system_mysql_db.test | 8 ++ .../t/reserv/system_mysql_db_fix-master.opt | 1 + mysql-test/t/reserv/system_mysql_db_fix.test | 14 +++ mysql-test/t/reserv/system_mysql_db_refs.test | 89 +++++++++++++ scripts/mysql_fix_privilege_tables.sh | 98 +++++++++++++-- scripts/mysql_fix_privilege_tables.sql | 13 ++ scripts/mysql_install_db.sh | 2 +- 13 files changed, 474 insertions(+), 51 deletions(-) create mode 100644 mysql-test/include/system_db_struct.inc create mode 100644 mysql-test/r/system_mysql_db.result create mode 100644 mysql-test/r/system_mysql_db_refs.result create mode 100644 mysql-test/t/reserv/system_mysql_db.test create mode 100644 mysql-test/t/reserv/system_mysql_db_fix-master.opt create mode 100644 mysql-test/t/reserv/system_mysql_db_fix.test create mode 100644 mysql-test/t/reserv/system_mysql_db_refs.test diff --git a/client/mysqltest.c b/client/mysqltest.c index f41f697ad26..32fc9d9ac17 100644 --- a/client/mysqltest.c +++ b/client/mysqltest.c @@ -867,36 +867,46 @@ int do_exec(struct st_query* q) if (!*cmd) die("Missing argument in exec\n"); - if (q->record_file[0]) + if (disable_result_log) { - init_dynamic_string(&ds_tmp, "", 16384, 65536); - ds= &ds_tmp; + if (!(res_file= popen(cmd, "r")) && q->abort_on_error) + die("popen() failed\n"); + while (fgets(buf, sizeof(buf), res_file)); + pclose(res_file); } else - ds= &ds_res; + { + if (q->record_file[0]) + { + init_dynamic_string(&ds_tmp, "", 16384, 65536); + ds= &ds_tmp; + } + else + ds= &ds_res; - if (!(res_file= popen(cmd, "r")) && q->abort_on_error) - die("popen() failed\n"); - while (fgets(buf, sizeof(buf), res_file)) - replace_dynstr_append_mem(ds, buf, strlen(buf)); - pclose(res_file); + if (!(res_file= popen(cmd, "r")) && q->abort_on_error) + die("popen() failed\n"); + while (fgets(buf, sizeof(buf), res_file)) + replace_dynstr_append_mem(ds, buf, strlen(buf)); + pclose(res_file); - if (glob_replace) - free_replace(); + if (glob_replace) + free_replace(); - if (record) - { - if (!q->record_file[0] && !result_file) - die("At line %u: Missing result file", start_lineno); - if (!result_file) - str_to_file(q->record_file, ds->str, ds->length); + if (record) + { + if (!q->record_file[0] && !result_file) + die("At line %u: Missing result file", start_lineno); + if (!result_file) + str_to_file(q->record_file, ds->str, ds->length); + } + else if (q->record_file[0]) + { + error= check_result(ds, q->record_file, q->require_file); + } + if (ds == &ds_tmp) + dynstr_free(&ds_tmp); } - else if (q->record_file[0]) - { - error= check_result(ds, q->record_file, q->require_file); - } - if (ds == &ds_tmp) - dynstr_free(&ds_tmp); return error; } @@ -2251,7 +2261,7 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags) { if (i) dynstr_append_mem(ds, "\t", 1); - dynstr_append(ds, fields[i].name); + replace_dynstr_append_mem(ds, fields[i].name, strlen(fields[i].name)); } dynstr_append_mem(ds, "\n", 1); append_result(ds, res); diff --git a/mysql-test/include/system_db_struct.inc b/mysql-test/include/system_db_struct.inc new file mode 100644 index 00000000000..5a7aa26c65a --- /dev/null +++ b/mysql-test/include/system_db_struct.inc @@ -0,0 +1,12 @@ +# +# This test must examine structure of current system database +# + +-- replace_result Tables_in_mysql Tables_in_db Tables_in_test Tables_in_db +show tables; +show create table db; +show create table host; +show create table user; +show create table func; +show create table tables_priv; +show create table columns_priv; diff --git a/mysql-test/install_test_db.sh b/mysql-test/install_test_db.sh index 8f90301d2d8..2eb19e88764 100644 --- a/mysql-test/install_test_db.sh +++ b/mysql-test/install_test_db.sh @@ -72,9 +72,9 @@ if test ! -f $mdata/db.frm then # mysqld --bootstrap wants one command/line c_d="$c_d CREATE TABLE db (" - c_d="$c_d Host char(60) DEFAULT '' NOT NULL," - c_d="$c_d Db char(64) DEFAULT '' NOT NULL," - c_d="$c_d User char(16) DEFAULT '' NOT NULL," + c_d="$c_d Host char(60) binary DEFAULT '' NOT NULL," + c_d="$c_d Db char(64) binary DEFAULT '' NOT NULL," + c_d="$c_d User char(16) binary DEFAULT '' NOT NULL," c_d="$c_d Select_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d Update_priv enum('N','Y') DEFAULT 'N' NOT NULL," @@ -99,8 +99,8 @@ fi if test ! -f $mdata/host.frm then c_h="$c_h CREATE TABLE host (" - c_h="$c_h Host char(60) DEFAULT '' NOT NULL," - c_h="$c_h Db char(64) DEFAULT '' NOT NULL," + c_h="$c_h Host char(60) binary DEFAULT '' NOT NULL," + c_h="$c_h Db char(64) binary DEFAULT '' NOT NULL," c_h="$c_h Select_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h Update_priv enum('N','Y') DEFAULT 'N' NOT NULL," @@ -178,10 +178,10 @@ fi if test ! -f $mdata/tables_priv.frm then c_t="$c_t CREATE TABLE tables_priv (" - c_t="$c_t Host char(60) DEFAULT '' NOT NULL," - c_t="$c_t Db char(64) DEFAULT '' NOT NULL," - c_t="$c_t User char(16) DEFAULT '' NOT NULL," - c_t="$c_t Table_name char(60) DEFAULT '' NOT NULL," + c_t="$c_t Host char(60) binary DEFAULT '' NOT NULL," + c_t="$c_t Db char(64) binary DEFAULT '' NOT NULL," + c_t="$c_t User char(16) binary DEFAULT '' NOT NULL," + c_t="$c_t Table_name char(64) binary DEFAULT '' NOT NULL," c_t="$c_t Grantor char(77) DEFAULT '' NOT NULL," c_t="$c_t Timestamp timestamp(14)," c_t="$c_t Table_priv set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter') DEFAULT '' NOT NULL," @@ -195,11 +195,11 @@ fi if test ! -f $mdata/columns_priv.frm then c_c="$c_c CREATE TABLE columns_priv (" - c_c="$c_c Host char(60) DEFAULT '' NOT NULL," - c_c="$c_c Db char(64) DEFAULT '' NOT NULL," - c_c="$c_c User char(16) DEFAULT '' NOT NULL," - c_c="$c_c Table_name char(64) DEFAULT '' NOT NULL," - c_c="$c_c Column_name char(64) DEFAULT '' NOT NULL," + c_c="$c_c Host char(60) binary DEFAULT '' NOT NULL," + c_c="$c_c Db char(64) binary DEFAULT '' NOT NULL," + c_c="$c_c User char(16) binary DEFAULT '' NOT NULL," + c_c="$c_c Table_name char(64) binary DEFAULT '' NOT NULL," + c_c="$c_c Column_name char(64) binary DEFAULT '' NOT NULL," c_c="$c_c Timestamp timestamp(14)," c_c="$c_c Column_priv set('Select','Insert','Update','References') DEFAULT '' NOT NULL," c_c="$c_c PRIMARY KEY (Host,Db,User,Table_name,Column_name)" diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index 5b39b167d7d..6fc699da9dd 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -461,6 +461,7 @@ if [ x$SOURCE_DIST = x1 ] ; then LANGUAGE="$BASEDIR/sql/share/english/" CHARSETSDIR="$BASEDIR/sql/share/charsets" INSTALL_DB="./install_test_db" + MYSQL_FIX_SYSTEM_TABLES="$BASEDIR/scripts/mysql_fix_privilege_tables" else if test -x "$BASEDIR/libexec/mysqld" then @@ -478,6 +479,7 @@ else MYSQL_MANAGER_PWGEN="$BASEDIR/bin/mysqlmanager-pwgen" MYSQL="$BASEDIR/bin/mysql" INSTALL_DB="./install_test_db -bin" + MYSQL_FIX_SYSTEM_TABLES="$BASEDIR/bin/mysql_fix_privilege_tables" if test -d "$BASEDIR/share/mysql/english" then LANGUAGE="$BASEDIR/share/mysql/english/" @@ -490,8 +492,12 @@ fi MYSQL_DUMP="$MYSQL_DUMP --no-defaults -uroot --socket=$MASTER_MYSOCK" MYSQL_BINLOG="$MYSQL_BINLOG --no-defaults --local-load=$MYSQL_TMP_DIR" +MYSQL_FIX_SYSTEM_TABLES="$MYSQL_FIX_SYSTEM_TABLES --host=localhost --port=$MASTER_MYPORT --socket=$MASTER_MYSOCK --user=root --password=" +MYSQL="$MYSQL --host=localhost --port=$MASTER_MYPORT --socket=$MASTER_MYSOCK --user=root --password=" +export MYSQL export MYSQL_DUMP export MYSQL_BINLOG +export MYSQL_FIX_SYSTEM_TABLES if [ -z "$MASTER_MYSQLD" ] then @@ -1168,6 +1174,7 @@ run_testcase () master_init_script=$TESTDIR/$tname-master.sh slave_init_script=$TESTDIR/$tname-slave.sh slave_master_info_file=$TESTDIR/$tname.slave-mi + result_file=$tname echo $tname > $CURRENT_TEST SKIP_SLAVE=`$EXPR \( $tname : rpl \) = 0` if [ $USE_MANAGER = 1 ] ; then @@ -1217,6 +1224,11 @@ run_testcase () # Note that this must be set to space, not "" for test-reset to work EXTRA_MASTER_OPT=" " ;; + --result-file=*) + result_file=`$ECHO "$EXTRA_MASTER_OPT" | $SED -e "s;--result-file=;;"` + # Note that this must be set to space, not "" for test-reset to work + EXTRA_MASTER_OPT=" " + ;; esac stop_master echo "CURRENT_TEST: $tname" >> $MASTER_MYERR @@ -1274,7 +1286,7 @@ run_testcase () if [ -f $tf ] ; then $RM -f r/$tname.*reject - mysql_test_args="-R r/$tname.result $EXTRA_MYSQL_TEST_OPT" + mysql_test_args="-R r/$result_file.result $EXTRA_MYSQL_TEST_OPT" if [ -z "$DO_CLIENT_GDB" ] ; then `$MYSQL_TEST $mysql_test_args < $tf 2> $TIMEFILE`; else @@ -1306,7 +1318,7 @@ run_testcase () $ECHO "$RES$RES_SPACE [ fail ]" $ECHO error_is - show_failed_diff $tname + show_failed_diff $result_file $ECHO if [ x$FORCE != x1 ] ; then $ECHO "Aborting. To continue, re-run with '--force'." diff --git a/mysql-test/r/system_mysql_db.result b/mysql-test/r/system_mysql_db.result new file mode 100644 index 00000000000..257b3b13f08 --- /dev/null +++ b/mysql-test/r/system_mysql_db.result @@ -0,0 +1,119 @@ +show tables; +Tables_in_db +columns_priv +db +func +host +tables_priv +user +show create table db; +Table Create Table +db CREATE TABLE `db` ( + `Host` char(60) binary NOT NULL default '', + `Db` char(64) binary NOT NULL default '', + `User` char(16) binary NOT NULL default '', + `Select_priv` enum('N','Y') NOT NULL default 'N', + `Insert_priv` enum('N','Y') NOT NULL default 'N', + `Update_priv` enum('N','Y') NOT NULL default 'N', + `Delete_priv` enum('N','Y') NOT NULL default 'N', + `Create_priv` enum('N','Y') NOT NULL default 'N', + `Drop_priv` enum('N','Y') NOT NULL default 'N', + `Grant_priv` enum('N','Y') NOT NULL default 'N', + `References_priv` enum('N','Y') NOT NULL default 'N', + `Index_priv` enum('N','Y') NOT NULL default 'N', + `Alter_priv` enum('N','Y') NOT NULL default 'N', + `Create_tmp_table_priv` enum('N','Y') NOT NULL default 'N', + `Lock_tables_priv` enum('N','Y') NOT NULL default 'N', + PRIMARY KEY (`Host`,`Db`,`User`), + KEY `User` (`User`) +) TYPE=MyISAM COMMENT='Database privileges' +show create table host; +Table Create Table +host CREATE TABLE `host` ( + `Host` char(60) binary NOT NULL default '', + `Db` char(64) binary NOT NULL default '', + `Select_priv` enum('N','Y') NOT NULL default 'N', + `Insert_priv` enum('N','Y') NOT NULL default 'N', + `Update_priv` enum('N','Y') NOT NULL default 'N', + `Delete_priv` enum('N','Y') NOT NULL default 'N', + `Create_priv` enum('N','Y') NOT NULL default 'N', + `Drop_priv` enum('N','Y') NOT NULL default 'N', + `Grant_priv` enum('N','Y') NOT NULL default 'N', + `References_priv` enum('N','Y') NOT NULL default 'N', + `Index_priv` enum('N','Y') NOT NULL default 'N', + `Alter_priv` enum('N','Y') NOT NULL default 'N', + `Create_tmp_table_priv` enum('N','Y') NOT NULL default 'N', + `Lock_tables_priv` enum('N','Y') NOT NULL default 'N', + PRIMARY KEY (`Host`,`Db`) +) TYPE=MyISAM COMMENT='Host privileges; Merged with database privileges' +show create table user; +Table Create Table +user CREATE TABLE `user` ( + `Host` varchar(60) binary NOT NULL default '', + `User` varchar(16) binary NOT NULL default '', + `Password` varchar(16) binary NOT NULL default '', + `Select_priv` enum('N','Y') NOT NULL default 'N', + `Insert_priv` enum('N','Y') NOT NULL default 'N', + `Update_priv` enum('N','Y') NOT NULL default 'N', + `Delete_priv` enum('N','Y') NOT NULL default 'N', + `Create_priv` enum('N','Y') NOT NULL default 'N', + `Drop_priv` enum('N','Y') NOT NULL default 'N', + `Reload_priv` enum('N','Y') NOT NULL default 'N', + `Shutdown_priv` enum('N','Y') NOT NULL default 'N', + `Process_priv` enum('N','Y') NOT NULL default 'N', + `File_priv` enum('N','Y') NOT NULL default 'N', + `Grant_priv` enum('N','Y') NOT NULL default 'N', + `References_priv` enum('N','Y') NOT NULL default 'N', + `Index_priv` enum('N','Y') NOT NULL default 'N', + `Alter_priv` enum('N','Y') NOT NULL default 'N', + `Show_db_priv` enum('N','Y') NOT NULL default 'N', + `Super_priv` enum('N','Y') NOT NULL default 'N', + `Create_tmp_table_priv` enum('N','Y') NOT NULL default 'N', + `Lock_tables_priv` enum('N','Y') NOT NULL default 'N', + `Execute_priv` enum('N','Y') NOT NULL default 'N', + `Repl_slave_priv` enum('N','Y') NOT NULL default 'N', + `Repl_client_priv` enum('N','Y') NOT NULL default 'N', + `ssl_type` enum('','ANY','X509','SPECIFIED') NOT NULL default '', + `ssl_cipher` blob NOT NULL, + `x509_issuer` blob NOT NULL, + `x509_subject` blob NOT NULL, + `max_questions` int(11) unsigned NOT NULL default '0', + `max_updates` int(11) unsigned NOT NULL default '0', + `max_connections` int(11) unsigned NOT NULL default '0', + PRIMARY KEY (`Host`,`User`) +) TYPE=MyISAM COMMENT='Users and global privileges' +show create table func; +Table Create Table +func CREATE TABLE `func` ( + `name` char(64) NOT NULL default '', + `ret` tinyint(1) NOT NULL default '0', + `dl` char(128) NOT NULL default '', + `type` enum('function','aggregate') NOT NULL default 'function', + PRIMARY KEY (`name`) +) TYPE=MyISAM COMMENT='User defined functions' +show create table tables_priv; +Table Create Table +tables_priv CREATE TABLE `tables_priv` ( + `Host` char(60) binary NOT NULL default '', + `Db` char(64) binary NOT NULL default '', + `User` char(16) binary NOT NULL default '', + `Table_name` char(64) binary NOT NULL default '', + `Grantor` char(77) NOT NULL default '', + `Timestamp` timestamp(14) NOT NULL, + `Table_priv` set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter') NOT NULL default '', + `Column_priv` set('Select','Insert','Update','References') NOT NULL default '', + PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`), + KEY `Grantor` (`Grantor`) +) TYPE=MyISAM COMMENT='Table privileges' +show create table columns_priv; +Table Create Table +columns_priv CREATE TABLE `columns_priv` ( + `Host` char(60) binary NOT NULL default '', + `Db` char(64) binary NOT NULL default '', + `User` char(16) binary NOT NULL default '', + `Table_name` char(64) binary NOT NULL default '', + `Column_name` char(64) binary NOT NULL default '', + `Timestamp` timestamp(14) NOT NULL, + `Column_priv` set('Select','Insert','Update','References') NOT NULL default '', + PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`,`Column_name`) +) TYPE=MyISAM COMMENT='Column privileges' diff --git a/mysql-test/r/system_mysql_db_refs.result b/mysql-test/r/system_mysql_db_refs.result new file mode 100644 index 00000000000..a08b46ffbbb --- /dev/null +++ b/mysql-test/r/system_mysql_db_refs.result @@ -0,0 +1,67 @@ +set @name="This is a very long string, that mustn't find room in a system field like Table_name. Thus it should be cut by the actual size of the field. So we can use this string to find out the actual length of the field and to use it in any compare queries"; +create table test_db select * from mysql.db; +delete from test_db; +insert into test_db (Host,Db,User) values (@name,@name,@name); +create table test_host select * from mysql.host; +delete from test_host; +insert into test_host (Host,Db) values (@name,@name); +create table test_user select * from mysql.user; +delete from test_user; +insert into test_user (Host,User) values (@name,@name); +create table test_func select * from mysql.func; +delete from test_func; +insert into test_func (name) values (@name); +create table test_tables_priv select * from mysql.tables_priv; +delete from test_tables_priv; +insert into test_tables_priv (Host,Db,User,Table_name) values (@name,@name,@name,@name); +create table test_columns_priv select * from mysql.columns_priv; +delete from test_columns_priv; +insert into test_columns_priv (Host,Db,User,Table_name,Column_name) values (@name,@name,@name,@name,@name); +select +if(isnull(test_db.Host),'WRONG!!!','ok') as test_db_Host, +if(isnull(test_host.Host),'WRONG!!!','ok') as test_host_Host, +if(isnull(test_user.Host),'WRONG!!!','ok') as test_user_Host, +if(isnull(test_tables_priv.Host),'WRONG!!!','ok') as test_tables_priv_Host, +if(isnull(test_columns_priv.Host),'WRONG!!!','ok') as test_columns_priv_Host +from test_db +left join test_host on test_db.Host=test_host.Host +left join test_user on test_db.Host=test_user.Host +left join test_tables_priv on test_db.Host=test_tables_priv.Host +left join test_columns_priv on test_db.Host=test_columns_priv.Host; +test_db_Host test_host_Host test_user_Host test_tables_priv_Host test_columns_priv_Host +ok ok ok ok ok +select +if(isnull(test_db.Db),'WRONG!!!','ok') as test_db_Db, +if(isnull(test_host.Db),'WRONG!!!','ok') as test_host_Db, +if(isnull(test_tables_priv.Db),'WRONG!!!','ok') as test_tables_priv_Db, +if(isnull(test_columns_priv.Db),'WRONG!!!','ok') as est_columns_priv_Db +from test_db +left join test_host on test_db.Db=test_host.Db +left join test_tables_priv on test_db.Db=test_tables_priv.Db +left join test_columns_priv on test_db.Db=test_columns_priv.Db; +test_db_Db test_host_Db test_tables_priv_Db est_columns_priv_Db +ok ok ok ok +select +if(isnull(test_db.User),'WRONG!!!','ok') as test_db_User, +if(isnull(test_user.User),'WRONG!!!','ok') as test_user_User, +if(isnull(test_tables_priv.User),'WRONG!!!','ok') as test_tables_priv_User, +if(isnull(test_columns_priv.User),'WRONG!!!','ok') as test_columns_priv_User +from test_db +left join test_user on test_db.User=test_user.User +left join test_tables_priv on test_db.User=test_tables_priv.User +left join test_columns_priv on test_db.User=test_columns_priv.User; +test_db_User test_user_User test_tables_priv_User test_columns_priv_User +ok ok ok ok +select +if(isnull(test_tables_priv.User),'WRONG!!!','ok') as test_tables_priv_User, +if(isnull(test_columns_priv.User),'WRONG!!!','ok') as test_columns_priv_User +from test_tables_priv +left join test_columns_priv on test_tables_priv.Table_name=test_columns_priv.Table_name; +test_tables_priv_User test_columns_priv_User +ok ok +drop table test_columns_priv; +drop table test_tables_priv; +drop table test_func; +drop table test_host; +drop table test_user; +drop table test_db; diff --git a/mysql-test/t/reserv/system_mysql_db.test b/mysql-test/t/reserv/system_mysql_db.test new file mode 100644 index 00000000000..85a2f7f9bae --- /dev/null +++ b/mysql-test/t/reserv/system_mysql_db.test @@ -0,0 +1,8 @@ +# +# This test must examine integrity of system database "mysql" +# + +-- disable_query_log +use mysql; +-- enable_query_log +-- source include/system_db_struct.inc diff --git a/mysql-test/t/reserv/system_mysql_db_fix-master.opt b/mysql-test/t/reserv/system_mysql_db_fix-master.opt new file mode 100644 index 00000000000..69eb9d2cbf0 --- /dev/null +++ b/mysql-test/t/reserv/system_mysql_db_fix-master.opt @@ -0,0 +1 @@ +--result-file=system_mysql_db \ No newline at end of file diff --git a/mysql-test/t/reserv/system_mysql_db_fix.test b/mysql-test/t/reserv/system_mysql_db_fix.test new file mode 100644 index 00000000000..bb2d37ee215 --- /dev/null +++ b/mysql-test/t/reserv/system_mysql_db_fix.test @@ -0,0 +1,14 @@ +# +# This is the test for mysql_fix_privilege_tables +# + +-- disable_query_log +-- source include/create_old_system_tables.inc +-- exec $MYSQL_FIX_SYSTEM_TABLES --database=test > nil 2>nil +-- enable_query_log + +-- source include/system_db_struct.inc + +-- disable_query_log +-- source include/drop_system_tables.inc +-- enable_query_log diff --git a/mysql-test/t/reserv/system_mysql_db_refs.test b/mysql-test/t/reserv/system_mysql_db_refs.test new file mode 100644 index 00000000000..d15141fdaa5 --- /dev/null +++ b/mysql-test/t/reserv/system_mysql_db_refs.test @@ -0,0 +1,89 @@ +# +# This test must examine integrity of current system database +# + +set @name="This is a very long string, that mustn't find room in a system field like Table_name. Thus it should be cut by the actual size of the field. So we can use this string to find out the actual length of the field and to use it in any compare queries"; + +# +# If this part is wrong, most likely you've done wrong modification of system database "mysql" +# + +create table test_db select * from mysql.db; +delete from test_db; +insert into test_db (Host,Db,User) values (@name,@name,@name); + +create table test_host select * from mysql.host; +delete from test_host; +insert into test_host (Host,Db) values (@name,@name); + +create table test_user select * from mysql.user; +delete from test_user; +insert into test_user (Host,User) values (@name,@name); + +create table test_func select * from mysql.func; +delete from test_func; +insert into test_func (name) values (@name); + +create table test_tables_priv select * from mysql.tables_priv; +delete from test_tables_priv; +insert into test_tables_priv (Host,Db,User,Table_name) values (@name,@name,@name,@name); + +create table test_columns_priv select * from mysql.columns_priv; +delete from test_columns_priv; +insert into test_columns_priv (Host,Db,User,Table_name,Column_name) values (@name,@name,@name,@name,@name); + +# 'Host' field must be the same for all the tables: + +select + if(isnull(test_db.Host),'WRONG!!!','ok') as test_db_Host, + if(isnull(test_host.Host),'WRONG!!!','ok') as test_host_Host, + if(isnull(test_user.Host),'WRONG!!!','ok') as test_user_Host, + if(isnull(test_tables_priv.Host),'WRONG!!!','ok') as test_tables_priv_Host, + if(isnull(test_columns_priv.Host),'WRONG!!!','ok') as test_columns_priv_Host + +from test_db +left join test_host on test_db.Host=test_host.Host +left join test_user on test_db.Host=test_user.Host +left join test_tables_priv on test_db.Host=test_tables_priv.Host +left join test_columns_priv on test_db.Host=test_columns_priv.Host; + +# 'Db' field must be the same for all the tables: + +select + if(isnull(test_db.Db),'WRONG!!!','ok') as test_db_Db, + if(isnull(test_host.Db),'WRONG!!!','ok') as test_host_Db, + if(isnull(test_tables_priv.Db),'WRONG!!!','ok') as test_tables_priv_Db, + if(isnull(test_columns_priv.Db),'WRONG!!!','ok') as est_columns_priv_Db + +from test_db +left join test_host on test_db.Db=test_host.Db +left join test_tables_priv on test_db.Db=test_tables_priv.Db +left join test_columns_priv on test_db.Db=test_columns_priv.Db; + +# 'User' field must be the same for all the tables: + +select + if(isnull(test_db.User),'WRONG!!!','ok') as test_db_User, + if(isnull(test_user.User),'WRONG!!!','ok') as test_user_User, + if(isnull(test_tables_priv.User),'WRONG!!!','ok') as test_tables_priv_User, + if(isnull(test_columns_priv.User),'WRONG!!!','ok') as test_columns_priv_User + +from test_db +left join test_user on test_db.User=test_user.User +left join test_tables_priv on test_db.User=test_tables_priv.User +left join test_columns_priv on test_db.User=test_columns_priv.User; + +# 'Table_name' field must be the same for all the tables: + +select + if(isnull(test_tables_priv.User),'WRONG!!!','ok') as test_tables_priv_User, + if(isnull(test_columns_priv.User),'WRONG!!!','ok') as test_columns_priv_User +from test_tables_priv +left join test_columns_priv on test_tables_priv.Table_name=test_columns_priv.Table_name; + +drop table test_columns_priv; +drop table test_tables_priv; +drop table test_func; +drop table test_host; +drop table test_user; +drop table test_db; diff --git a/scripts/mysql_fix_privilege_tables.sh b/scripts/mysql_fix_privilege_tables.sh index 7ba42e560bb..5e3e4210aa4 100644 --- a/scripts/mysql_fix_privilege_tables.sh +++ b/scripts/mysql_fix_privilege_tables.sh @@ -1,20 +1,79 @@ #!/bin/sh +# +# Copyright (C) 2004 MySQL AB +# For a more info consult the file COPYRIGHT distributed with this file. +# +# This script converts any old privilege tables to privilege tables suitable +# for MySQL 4.0. +# +# You can safely ignore all 'Duplicate column' and 'Unknown column' errors" +# as this just means that your tables where already up to date. +# This script is safe to run even if your tables are already up to date! +# +# On windows you should do 'mysql --force < mysql_fix_privilege_tables.sql' +# instead of this script +# +# Usage: +# mysql_fix_privilege_tables +# - fix tables for host "localhost" as "root" with no password +# mysql_fix_privilege_tables +# - fix tables for host "localhost" as "root" with +# mysql_fix_privilege_tables --sql-only +# - output sql-script to file /usr/share/mysql/echo_stderr +# mysql_fix_privilege_tables OPTIONS +# - fix tables on connection with OPTIONS +# +# where OPTIONS are +# --host= +# --port= +# --socket= +# --user= +# --password= +# --database= + root_password="$1" host="localhost" user="root" +port="" +socket="" +comment="" +database="mysql" -if test -z "$1" ; then - cmd="@bindir@/mysql -f --user=$user --host=$host mysql" -else - root_password="$1" - cmd="@bindir@/mysql -f --user=$user --password=$root_password --host=$host mysql" -fi +# read all the options +parse_arguments() +{ + for arg do + case "$arg" in + --sql-only) cmd="/usr/share/mysql/echo_stderr" ;; + --port=*) port=`echo "$arg" | sed -e "s;--port=;;"` ;; + --user=*) user=`echo "$arg" | sed -e "s;--user=;;"` ;; + --host=*) host=`echo "$arg" | sed -e "s;--host=;;"` ;; + --socket=*) socket=`echo "$arg" | sed -e "s;--socket=;;"` ;; + --password=*) root_password=`echo "$arg" | sed -e "s;--password=;;"` ;; + --database=*) database=`echo "$arg" | sed -e "s;--database=;;"` ;; + *) + echo "Unknown argument '$arg'" + exit 1 + ;; + esac + done +} + +parse_arguments "$@" -# Debian addition -if [ "$1" = "--sql-only" ]; then - root_password="" - cmd="/usr/share/mysql/echo_stderr" +if test -z "$cmd"; then + cmd="@bindir@/mysql -f --user=$user --host=$host" + if test ! -z "$root_password"; then + cmd="$cmd --password=$root_password" + fi + if test ! -z "$port"; then + cmd="$cmd --port=$port" + fi + if test ! -z "$socket"; then + cmd="$cmd --socket=$socket" + fi + cmd="$cmd $database" fi echo "This scripts updates the mysql.user, mysql.db, mysql.host and the" @@ -201,3 +260,22 @@ alter table host add Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL, add Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL; END_OF_DATA + +# +# Fix the new bugs discovered by new tests (for Bug #2874 Grant table bugs ) +# +$cmd < Date: Thu, 11 Mar 2004 10:26:08 +0200 Subject: [PATCH 41/65] data0data.c: Do not test a magic number with =, use == instead :) --- innobase/data/data0data.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/innobase/data/data0data.c b/innobase/data/data0data.c index 19004a51fa6..629570ce751 100644 --- a/innobase/data/data0data.c +++ b/innobase/data/data0data.c @@ -114,8 +114,8 @@ dtuple_datas_are_ordering_equal( ulint i; ut_ad(tuple1 && tuple2); - ut_ad(tuple1->magic_n = DATA_TUPLE_MAGIC_N); - ut_ad(tuple2->magic_n = DATA_TUPLE_MAGIC_N); + ut_ad(tuple1->magic_n == DATA_TUPLE_MAGIC_N); + ut_ad(tuple2->magic_n == DATA_TUPLE_MAGIC_N); ut_ad(dtuple_check_typed(tuple1)); ut_ad(dtuple_check_typed(tuple2)); @@ -306,7 +306,7 @@ dtuple_validate( ulint i; ulint j; - ut_a(tuple->magic_n = DATA_TUPLE_MAGIC_N); + ut_ad(tuple->magic_n == DATA_TUPLE_MAGIC_N); n_fields = dtuple_get_n_fields(tuple); From 0a0e981220117d9aca344ba89d85ab928e9796c3 Mon Sep 17 00:00:00 2001 From: "heikki@hundin.mysql.fi" <> Date: Thu, 11 Mar 2004 10:38:37 +0200 Subject: [PATCH 42/65] sync0arr.c, os0file.h: Print always the count of pending pread() and pwrite() calls if there is a long semaphore wait --- innobase/include/os0file.h | 3 +++ innobase/sync/sync0arr.c | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/innobase/include/os0file.h b/innobase/include/os0file.h index 5c52f0e92bf..b221bf7aef9 100644 --- a/innobase/include/os0file.h +++ b/innobase/include/os0file.h @@ -18,6 +18,9 @@ extern ibool os_do_not_call_flush_at_each_write; extern ibool os_has_said_disk_full; extern ibool os_aio_print_debug; +extern ulint os_file_n_pending_preads; +extern ulint os_file_n_pending_pwrites; + #ifdef __WIN__ /* We define always WIN_ASYNC_IO, and check at run-time whether diff --git a/innobase/sync/sync0arr.c b/innobase/sync/sync0arr.c index 4854b40409e..06e9fdcd63d 100644 --- a/innobase/sync/sync0arr.c +++ b/innobase/sync/sync0arr.c @@ -14,6 +14,7 @@ Created 9/5/1995 Heikki Tuuri #include "sync0sync.h" #include "sync0rw.h" #include "os0sync.h" +#include "os0file.h" #include "srv0srv.h" /* @@ -940,6 +941,16 @@ sync_array_print_long_waits(void) "InnoDB: ###### Starts InnoDB Monitor for 30 secs to print diagnostic info:\n"); old_val = srv_print_innodb_monitor; + /* If some crucial semaphore is reserved, then also the InnoDB + Monitor can hang, and we do not get diagnostics. Since in + many cases an InnoDB hang is caused by a pwrite() or a pread() + call hanging inside the operating system, let us print right + now the values of pending calls of these. */ + + fprintf(stderr, +"InnoDB: Pending preads %lu, pwrites %lu\n", (ulong)os_file_n_pending_preads, + (ulong)os_file_n_pending_pwrites); + srv_print_innodb_monitor = TRUE; os_event_set(srv_lock_timeout_thread_event); From a68a1ed0ca012404c1693060b88e34156077946f Mon Sep 17 00:00:00 2001 From: "marko@hundin.mysql.fi" <> Date: Thu, 11 Mar 2004 12:55:28 +0200 Subject: [PATCH 43/65] Remove unneeded module "com" --- innobase/Makefile.am | 2 +- innobase/com/Makefile.am | 24 - innobase/com/com0com.c | 345 ----------- innobase/com/com0shm.c | 1129 ---------------------------------- innobase/com/makefilewin | 12 - innobase/configure.in | 2 +- innobase/dict/dict0crea.c | 4 +- innobase/include/Makefile.am | 3 +- innobase/include/com0com.h | 125 ---- innobase/include/com0com.ic | 7 - innobase/include/com0shm.h | 103 ---- innobase/include/com0shm.ic | 7 - innobase/include/que0que.h | 9 +- innobase/include/srv0srv.h | 4 - innobase/include/trx0trx.h | 19 +- innobase/include/usr0sess.h | 218 +------ innobase/include/usr0sess.ic | 24 - innobase/include/usr0types.h | 2 - innobase/que/que0que.c | 178 ++---- innobase/row/row0mysql.c | 10 +- innobase/srv/srv0srv.c | 21 +- innobase/srv/srv0start.c | 3 - innobase/trx/trx0purge.c | 10 +- innobase/trx/trx0roll.c | 18 +- innobase/trx/trx0trx.c | 40 +- innobase/usr/usr0sess.c | 518 +--------------- 26 files changed, 104 insertions(+), 2733 deletions(-) delete mode 100644 innobase/com/Makefile.am delete mode 100644 innobase/com/com0com.c delete mode 100644 innobase/com/com0shm.c delete mode 100644 innobase/com/makefilewin delete mode 100644 innobase/include/com0com.h delete mode 100644 innobase/include/com0com.ic delete mode 100644 innobase/include/com0shm.h delete mode 100644 innobase/include/com0shm.ic diff --git a/innobase/Makefile.am b/innobase/Makefile.am index 17d7130f3e0..8ff90d16a2c 100644 --- a/innobase/Makefile.am +++ b/innobase/Makefile.am @@ -22,7 +22,7 @@ TAR = gtar noinst_HEADERS = ib_config.h -SUBDIRS = os ut btr buf com data dict dyn eval fil fsp fut \ +SUBDIRS = os ut btr buf data dict dyn eval fil fsp fut \ ha ibuf include lock log mach mem mtr page \ pars que read rem row srv sync thr trx usr diff --git a/innobase/com/Makefile.am b/innobase/com/Makefile.am deleted file mode 100644 index a3d2f8a76c6..00000000000 --- a/innobase/com/Makefile.am +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB -# & Innobase Oy -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -include ../include/Makefile.i - -noinst_LIBRARIES = libcom.a - -libcom_a_SOURCES = com0com.c com0shm.c - -EXTRA_PROGRAMS = diff --git a/innobase/com/com0com.c b/innobase/com/com0com.c deleted file mode 100644 index 94585d9f269..00000000000 --- a/innobase/com/com0com.c +++ /dev/null @@ -1,345 +0,0 @@ -/****************************************************** -The communication primitives - -(c) 1995 Innobase Oy - -Created 9/23/1995 Heikki Tuuri -*******************************************************/ - -#include "com0com.h" -#ifdef UNIV_NONINL -#include "com0com.ic" -#endif - -#include "mem0mem.h" -#include "com0shm.h" - -/* - IMPLEMENTATION OF COMMUNICATION PRIMITIVES - ========================================== - -The primitives provide a uniform function interface for -use in communication. The primitives have been modeled -after the Windows Sockets interface. Below this uniform -API, the precise methods of communication, for example, -shared memory or Berkeley sockets, can be implemented -as subroutines. -*/ - -struct com_endpoint_struct{ - ulint type; /* endpoint type */ - void* par; /* type-specific data structures */ - ibool bound; /* TRUE if the endpoint has been - bound to an address */ -}; - -/************************************************************************* -Accessor functions for an endpoint */ -UNIV_INLINE -ulint -com_endpoint_get_type( -/*==================*/ - com_endpoint_t* ep) -{ - ut_ad(ep); - return(ep->type); -} - -UNIV_INLINE -void -com_endpoint_set_type( -/*==================*/ - com_endpoint_t* ep, - ulint type) -{ - ut_ad(ep); - ut_ad(type == COM_SHM); - - ep->type = type; -} - -UNIV_INLINE -void* -com_endpoint_get_par( -/*=================*/ - com_endpoint_t* ep) -{ - ut_ad(ep); - return(ep->par); -} - -UNIV_INLINE -void -com_endpoint_set_par( -/*=================*/ - com_endpoint_t* ep, - void* par) -{ - ut_ad(ep); - ut_ad(par); - - ep->par = par; -} - -UNIV_INLINE -ibool -com_endpoint_get_bound( -/*===================*/ - com_endpoint_t* ep) -{ - ut_ad(ep); - return(ep->bound); -} - -UNIV_INLINE -void -com_endpoint_set_bound( -/*===================*/ - com_endpoint_t* ep, - ibool bound) -{ - ut_ad(ep); - - ep->bound = bound; -} - - -/************************************************************************* -Creates a communications endpoint. */ - -com_endpoint_t* -com_endpoint_create( -/*================*/ - /* out, own: communications endpoint, NULL if - did not succeed */ - ulint type) /* in: communication type of endpoint: - only COM_SHM supported */ -{ - com_endpoint_t* ep; - void* par; - - ep = mem_alloc(sizeof(com_endpoint_t)); - - com_endpoint_set_type(ep, type); - com_endpoint_set_bound(ep, FALSE); - - if (type == COM_SHM) { - par = com_shm_endpoint_create(); - com_endpoint_set_par(ep, par); - } else { - par = NULL; - ut_error; - } - - if (par != NULL) { - return(ep); - } else { - mem_free(ep); - return(NULL); - } -} - -/************************************************************************* -Frees a communications endpoint. */ - -ulint -com_endpoint_free( -/*==============*/ - /* out: O if succeed, else error number */ - com_endpoint_t* ep) /* in, own: communications endpoint */ -{ - ulint type; - ulint ret; - void* par; - - type = com_endpoint_get_type(ep); - par = com_endpoint_get_par(ep); - - if (type == COM_SHM) { - ret = com_shm_endpoint_free((com_shm_endpoint_t*)par); - } else { - ret = 0; - ut_error; - } - - if (ret) { - return(ret); - } else { - mem_free(ep); - return(0); - } -} - -/************************************************************************* -Sets an option, like the maximum datagram size for an endpoint. -The options may vary depending on the endpoint type. */ - -ulint -com_endpoint_set_option( -/*====================*/ - /* out: 0 if succeed, else error number */ - com_endpoint_t* ep, /* in: endpoint */ - ulint optno, /* in: option number, only - COM_OPT_MAX_DGRAM_SIZE currently supported */ - byte* optval, /* in: pointer to a buffer containing the - option value to set */ - ulint optlen) /* in: option value buffer length */ -{ - ulint type; - ulint ret; - void* par; - - type = com_endpoint_get_type(ep); - par = com_endpoint_get_par(ep); - - if (type == COM_SHM) { - ret = com_shm_endpoint_set_option((com_shm_endpoint_t*)par, - optno, optval, optlen); - } else { - ret = 0; - ut_error; - } - - return(ret); -} - -/************************************************************************* -Binds a communications endpoint to the specified address. */ - -ulint -com_bind( -/*=====*/ - /* out: 0 if succeed, else error number */ - com_endpoint_t* ep, /* in: communications endpoint */ - char* name, /* in: address name */ - ulint len) /* in: name length */ -{ - ulint type; - ulint ret; - void* par; - - ut_ad(len <= COM_MAX_ADDR_LEN); - - if (com_endpoint_get_bound(ep)) { - return(COM_ERR_ALREADY_BOUND); - } - - type = com_endpoint_get_type(ep); - par = com_endpoint_get_par(ep); - - if (type == COM_SHM) { - ret = com_shm_bind((com_shm_endpoint_t*)par, name, len); - } else { - ret = 0; - ut_error; - } - - if (ret == 0) { - com_endpoint_set_bound(ep, TRUE); - } - - return(ret); -} - -/************************************************************************* -Waits for a datagram to arrive at an endpoint. */ - -ulint -com_recvfrom( -/*=========*/ - /* out: 0 if succeed, else error number */ - com_endpoint_t* ep, /* in: communications endpoint */ - byte* buf, /* out: datagram buffer; the buffer is - supplied by the caller */ - ulint buf_len,/* in: datagram buffer length */ - ulint* len, /* out: datagram length */ - char* from, /* out: address name buffer; the buffer is - supplied by the caller */ - ulint from_len,/* in: address name buffer length */ - ulint* addr_len)/* out: address name length */ -{ - ulint type; - ulint ret; - void* par; - - if (!com_endpoint_get_bound(ep)) { - - return(COM_ERR_NOT_BOUND); - } - - type = com_endpoint_get_type(ep); - par = com_endpoint_get_par(ep); - - if (type == COM_SHM) { - ret = com_shm_recvfrom((com_shm_endpoint_t*)par, - buf, buf_len, len, from, from_len, - addr_len); - } else { - ret = 0; - - ut_error; - } - - return(ret); -} - -/************************************************************************* -Sends a datagram to the specified destination. */ - -ulint -com_sendto( -/*=======*/ - /* out: 0 if succeed, else error number */ - com_endpoint_t* ep, /* in: communications endpoint */ - byte* buf, /* in: datagram buffer */ - ulint len, /* in: datagram length */ - char* to, /* in: address name buffer */ - ulint tolen) /* in: address name length */ -{ - ulint type; - ulint ret; - void* par; - - if (!com_endpoint_get_bound(ep)) { - return(COM_ERR_NOT_BOUND); - } - - type = com_endpoint_get_type(ep); - par = com_endpoint_get_par(ep); - - if (type == COM_SHM) { - ret = com_shm_sendto((com_shm_endpoint_t*)par, buf, len, - to, tolen); - } else { - ret = 0; - ut_error; - } - - return(ret); -} - -/************************************************************************* -Gets the maximum datagram size for an endpoint. */ - -ulint -com_endpoint_get_max_size( -/*======================*/ - /* out: maximum size */ - com_endpoint_t* ep) /* in: endpoint */ -{ - ulint type; - ulint ret; - void* par; - - type = com_endpoint_get_type(ep); - par = com_endpoint_get_par(ep); - - if (type == COM_SHM) { - ret = com_shm_endpoint_get_size((com_shm_endpoint_t*)par); - } else { - ret = 0; - ut_error; - } - - return(ret); -} diff --git a/innobase/com/com0shm.c b/innobase/com/com0shm.c deleted file mode 100644 index 29e40b3fc53..00000000000 --- a/innobase/com/com0shm.c +++ /dev/null @@ -1,1129 +0,0 @@ -/****************************************************** -The communication through shared memory - -(c) 1995 Innobase Oy - -Created 9/25/1995 Heikki Tuuri -*******************************************************/ - -#include "com0shm.h" -#ifdef UNIV_NONINL -#include "com0shm.ic" -#endif - -#include "mem0mem.h" -#include "ut0mem.h" -#include "com0com.h" -#include "os0shm.h" -#include "sync0sync.h" -#include "sync0ipm.h" -#include "hash0hash.h" - -/* - IMPLEMENTATION OF COMMUNICATION PRIMITIVES - ========================================== - -When bind is called for an endpoint, a shared memory area of -a size specified by com_shm_set_option is created with the -name of the address given concatenated to "_IBSHM". -Also a mutex is created for controlling the access to the -shared memory area. The name of the mutex is address + "_IBSHM_MTX". -An event with name address + "_IBSHM_EV_NE" is created. This event -is in signaled state when the shared memory area is not empty, i.e., -there is a datagram to read. An event address + "_IBSHM_EV_EM" -is signaled, when the area is empty, i.e., a datagram can be -written to it. - -The shared memory area consists of an info struct -at the beginning, containing fields telling: -if the area is valid, i.e., is anybody going to -read it, whether it currently contains a datagram, the -length of the address from which the datagram was received, -the length of the datagram, and the maximum allowed length of -a datagram. -After the info struct, there is a string of bytes -containing the sender address and the data -of the datagram. -*/ - -/* The following is set TRUE when the first endpoint is created. */ - -ibool com_shm_initialized = FALSE; - -/* When a datagram is sent, the shared memory area -corresponding to the destination address is mapped -to the address space of this (sender) process. -We preserve it and keep the relevant info in the -following list. We can save a lot of CPU time -if the destination can be found on the list. The list is -protected by the mutex below. */ - -mutex_t com_shm_destination_mutex; -hash_table_t* com_shm_destination_cache; -UT_LIST_BASE_NODE_T(com_shm_endpoint_t) - com_shm_destination_list; - -/* The number of successfully bound endpoints in this process. When this -number drops to 0, the destination cache is freed. This variable is protected -by com_shm_destination_mutex above. */ - -ulint com_shm_bind_count = 0; - -/* The performance of communication in NT depends on how -many times a system call is made (excluding os_thread_yield, -as that is the fastest way to switch thread). -The following variable counts such events. */ - -ulint com_shm_system_call_count = 0; - -/* The info struct at the beginning of a shared memory area */ - -typedef struct com_shm_info_struct com_shm_info_t; - -/* An area of shared memory consists of an info struct followed -by a string of bytes. */ - -typedef com_shm_info_t com_shm_t; - -struct com_shm_endpoint_struct{ - ibool owns_shm; /* This is true if the shared memory - area is owned by this endpoint structure - (it may also be opened for this endpoint, - not created, in which case does not own it) */ - char* addr; /* pointer to address the endpoint is bound - to, NULL if not bound */ - ulint addr_len; /* address length */ - ulint size; /* maximum allowed datagram size, initialized - to 0 at creation */ - os_shm_t shm; /* operating system handle of the shared - memory area */ - com_shm_t* map; /* pointer to the start address of the shared - memory area */ - os_event_t not_empty; /* this is in the signaled state if - the area currently may contain a datagram; - NOTE: automatic event */ - os_event_t empty; /* this is in the signaled state if the area - currently may be empty; NOTE: automatic - event */ - ip_mutex_hdl_t* ip_mutex; /* handle to the interprocess mutex - protecting the shared memory */ - UT_LIST_NODE_T(com_shm_endpoint_t) list; /* If the endpoint struct - is inserted into a list, this contains - pointers to next and prev */ - com_shm_endpoint_t* addr_hash; - /* hash table link */ -}; - -struct com_shm_info_struct{ - ulint valid; /* This is COM_SHM_VALID if the creator - of the shared memory area has it still - mapped to its address space. Otherwise, - we may conclude that the datagram cannot - be delivered. */ - ibool not_empty; /* TRUE if the area currently contains - a datagram */ - ulint empty_waiters; /* Count of (writer) threads which are - waiting for the empty-event */ - ulint max_len;/* maximum allowed length for a datagram */ - ulint addr_len;/* address length for the sender address */ - ulint data_len;/* datagram length */ - ip_mutex_t ip_mutex;/* fast interprocess mutex protecting - the shared memory area */ -}; - -#define COM_SHM_VALID 76640 - -/************************************************************************* -Accessor functions for a shared memory endpoint */ - -UNIV_INLINE -ibool -com_shm_endpoint_get_owns_shm( -/*==========================*/ - com_shm_endpoint_t* ep) -{ - ut_ad(ep); - return(ep->owns_shm); -} - -UNIV_INLINE -void -com_shm_endpoint_set_owns_shm( -/*==========================*/ - com_shm_endpoint_t* ep, - ibool flag) -{ - ut_ad(ep); - - ep->owns_shm = flag; -} - -UNIV_INLINE -char* -com_shm_endpoint_get_addr( -/*======================*/ - com_shm_endpoint_t* ep) -{ - ut_ad(ep); - return(ep->addr); -} - -UNIV_INLINE -void -com_shm_endpoint_set_addr( -/*======================*/ - com_shm_endpoint_t* ep, - char* addr) -{ - ut_ad(ep); - - ep->addr = addr; -} - -UNIV_INLINE -ulint -com_shm_endpoint_get_addr_len( -/*==========================*/ - com_shm_endpoint_t* ep) -{ - return(ep->addr_len); -} - -UNIV_INLINE -void -com_shm_endpoint_set_addr_len( -/*==========================*/ - com_shm_endpoint_t* ep, - ulint len) -{ - ut_ad(ep); - ut_ad(len > 0); - - ep->addr_len = len; -} - -ulint -com_shm_endpoint_get_size( -/*======================*/ - com_shm_endpoint_t* ep) -{ - return(ep->size); -} - -UNIV_INLINE -void -com_shm_endpoint_set_size( -/*======================*/ - com_shm_endpoint_t* ep, - ulint size) -{ - ut_ad(ep); - - ep->size = size; -} - -UNIV_INLINE -os_shm_t -com_shm_endpoint_get_shm( -/*=====================*/ - com_shm_endpoint_t* ep) -{ - return(ep->shm); -} - -UNIV_INLINE -void -com_shm_endpoint_set_shm( -/*=====================*/ - com_shm_endpoint_t* ep, - os_shm_t shm) -{ - ut_ad(ep); - ut_ad(shm); - - ep->shm = shm; -} - -UNIV_INLINE -com_shm_t* -com_shm_endpoint_get_map( -/*=====================*/ - com_shm_endpoint_t* ep) -{ - return(ep->map); -} - -UNIV_INLINE -void -com_shm_endpoint_set_map( -/*=====================*/ - com_shm_endpoint_t* ep, - com_shm_t* map) -{ - ut_ad(ep); - ut_ad(map); - - ep->map = map; -} - -UNIV_INLINE -os_event_t -com_shm_endpoint_get_empty( -/*=======================*/ - com_shm_endpoint_t* ep) -{ - return(ep->empty); -} - -UNIV_INLINE -void -com_shm_endpoint_set_empty( -/*=======================*/ - com_shm_endpoint_t* ep, - os_event_t event) -{ - ut_ad(ep); - ut_ad(event); - - ep->empty = event; -} - -UNIV_INLINE -os_event_t -com_shm_endpoint_get_not_empty( -/*===========================*/ - com_shm_endpoint_t* ep) -{ - return(ep->not_empty); -} - -UNIV_INLINE -void -com_shm_endpoint_set_not_empty( -/*===========================*/ - com_shm_endpoint_t* ep, - os_event_t event) -{ - ut_ad(ep); - ut_ad(event); - - ep->not_empty = event; -} - -/************************************************************************ -Accessor functions for the shared memory area info struct. */ -UNIV_INLINE -ulint -com_shm_get_valid( -/*==============*/ - com_shm_info_t* info) -{ - return(info->valid); -} - -UNIV_INLINE -void -com_shm_set_valid( -/*==============*/ - com_shm_info_t* info, - ulint flag) -{ - ut_ad(info); - - info->valid = flag; -} - -UNIV_INLINE -ibool -com_shm_get_not_empty( -/*==================*/ - com_shm_info_t* info) -{ - return(info->not_empty); -} - -UNIV_INLINE -void -com_shm_set_not_empty( -/*==================*/ - com_shm_info_t* info, - ibool flag) -{ - ut_ad(info); - - info->not_empty = flag; -} - -UNIV_INLINE -ulint -com_shm_get_empty_waiters( -/*======================*/ - com_shm_info_t* info) -{ - ut_ad(info->empty_waiters < 1000); - - return(info->empty_waiters); -} - -UNIV_INLINE -void -com_shm_set_empty_waiters( -/*======================*/ - com_shm_info_t* info, - ulint count) -{ - ut_ad(info); - ut_ad(count < 1000); - - info->empty_waiters = count; -} - -UNIV_INLINE -ulint -com_shm_get_max_len( -/*================*/ - com_shm_info_t* info) -{ - return(info->max_len); -} - -UNIV_INLINE -void -com_shm_set_max_len( -/*================*/ - com_shm_info_t* info, - ulint len) -{ - ut_ad(info); - ut_ad(len > 0); - - info->max_len = len; -} - -UNIV_INLINE -ulint -com_shm_get_addr_len( -/*=================*/ - com_shm_info_t* info) -{ - return(info->addr_len); -} - -UNIV_INLINE -void -com_shm_set_addr_len( -/*=================*/ - com_shm_info_t* info, - ulint len) -{ - ut_ad(info); - ut_ad(len > 0); - - info->addr_len = len; -} - -UNIV_INLINE -ulint -com_shm_get_data_len( -/*=================*/ - com_shm_info_t* info) -{ - return(info->data_len); -} - -UNIV_INLINE -void -com_shm_set_data_len( -/*=================*/ - com_shm_info_t* info, - ulint len) -{ - ut_ad(info); - ut_ad(len > 0); - - info->data_len = len; -} - -UNIV_INLINE -ip_mutex_t* -com_shm_get_ip_mutex( -/*=================*/ - com_shm_info_t* info) -{ - return(&(info->ip_mutex)); -} - -/************************************************************************* -Accessor functions for the address and datagram fields inside a -shared memory area. */ - -UNIV_INLINE -char* -com_shm_get_addr( -/*=============*/ - com_shm_t* area) -{ - return((char*)area + sizeof(com_shm_info_t)); -} - -UNIV_INLINE -byte* -com_shm_get_data( -/*=============*/ - com_shm_t* area) -{ - return((byte*)com_shm_get_addr(area) + com_shm_get_addr_len(area)); -} - -/************************************************************************* -Initializes the shared memory communication system for this -process. */ -UNIV_INLINE -void -com_shm_init(void) -/*==============*/ -{ - mutex_create(&com_shm_destination_mutex); - - mutex_set_level(&com_shm_destination_mutex, SYNC_ANY_LATCH); - - com_shm_destination_cache = hash_create(1000); - - UT_LIST_INIT(com_shm_destination_list); - - com_shm_initialized = TRUE; -} - -/************************************************************************* -Reserves the ip mutex of the shared memory area of an endpoint. */ -UNIV_INLINE -void -com_shm_enter( -/*==========*/ - com_shm_endpoint_t* ep) -{ - ulint ret; - - ret = ip_mutex_enter(ep->ip_mutex, 10000000); - - if (ret != 0) { - mutex_list_print_info(); - - ut_error; - } -} - -/************************************************************************* -Releases the ip mutex of the shared memory area of an endpoint. */ -UNIV_INLINE -void -com_shm_exit( -/*=========*/ - com_shm_endpoint_t* ep) -{ - ip_mutex_exit(ep->ip_mutex); -} - -/************************************************************************* -Looks for the given address in the cached destination addresses. */ -UNIV_INLINE -com_shm_endpoint_t* -com_shm_destination_cache_search( -/*=============================*/ - /* out: cached endpoint structure if found, else NULL */ - char* addr, /* in: destination address */ - ulint len) /* in: address length */ -{ - com_shm_endpoint_t* ep; - ulint fold; - - fold = ut_fold_binary((byte*)addr, len); -/* - printf("Searching dest. cache %s %lu fold %lu\n", addr, len, fold); -*/ - mutex_enter(&com_shm_destination_mutex); - - HASH_SEARCH(addr_hash, com_shm_destination_cache, fold, ep, - ((ep->addr_len == len) - && (0 == ut_memcmp(addr, ep->addr, len)))); - - mutex_exit(&com_shm_destination_mutex); - - return(ep); -} - -/************************************************************************* -Inserts the given endpoint structure in the cached destination addresses. */ -static -void -com_shm_destination_cache_insert( -/*=============================*/ - com_shm_endpoint_t* ep) /* in: endpoint struct to insert */ -{ - ulint fold; - - fold = ut_fold_binary((byte*)(ep->addr), ep->addr_len); - - mutex_enter(&com_shm_destination_mutex); - - /* Add to hash table */ - HASH_INSERT(com_shm_endpoint_t, - addr_hash, com_shm_destination_cache, fold, ep); - - UT_LIST_ADD_LAST(list, com_shm_destination_list, ep); - -/* printf("Inserting to dest. cache %s %lu fold %lu\n", ep->addr, - ep->addr_len, fold); -*/ - mutex_exit(&com_shm_destination_mutex); -} - -/************************************************************************* -Frees the endpoint structs in the destination cache if the bind count is zero. -If it is not, some send operation may just be using a cached endpoint and it -cannot be freed. */ -static -void -com_shm_destination_cache_no_binds(void) -/*====================================*/ -{ - com_shm_endpoint_t* ep; - ulint fold; - - mutex_enter(&com_shm_destination_mutex); - - if (com_shm_bind_count != 0) { - mutex_exit(&com_shm_destination_mutex); - - return; - } - - while (UT_LIST_GET_LEN(com_shm_destination_list) != 0) { - - ep = UT_LIST_GET_FIRST(com_shm_destination_list); - - UT_LIST_REMOVE(list, com_shm_destination_list, ep); - - fold = ut_fold_binary((byte*)ep->addr, ep->addr_len); -/* - printf("Deleting from dest. cache %s %lu fold %lu\n", - ep->addr, - ep->addr_len, fold); -*/ - HASH_DELETE(com_shm_endpoint_t, addr_hash, - com_shm_destination_cache, fold, ep); - - com_shm_endpoint_free(ep); - } - - mutex_exit(&com_shm_destination_mutex); -} - -/*********************************************************************** -Unbinds an endpoint at the time of freeing. */ -static -void -com_shm_unbind( -/*===========*/ - com_shm_endpoint_t* ep) /* in: endpoint */ -{ - com_shm_t* map; - - map = com_shm_endpoint_get_map(ep); - - /* Mark the shared memory area invalid */ - - com_shm_set_valid(map, 0); - - /* Decrement the count of bindings */ - - mutex_enter(&com_shm_destination_mutex); - - com_shm_bind_count--; - - mutex_exit(&com_shm_destination_mutex); - - /* If there are no binds left, free the cached endpoints */ - - com_shm_destination_cache_no_binds(); -} - -/************************************************************************* -Creates a communications endpoint. */ - -com_shm_endpoint_t* -com_shm_endpoint_create(void) -/*=========================*/ - /* out, own: communications endpoint, NULL if - did not succeed */ -{ - com_shm_endpoint_t* ep; - - if (!com_shm_initialized) { - - com_shm_init(); - } - - ep = mem_alloc(sizeof(com_shm_endpoint_t)); - - com_shm_endpoint_set_owns_shm(ep, FALSE); - com_shm_endpoint_set_addr(ep, NULL); - com_shm_endpoint_set_size(ep, 0); - - return(ep); -} - -/************************************************************************* -Frees a communications endpoint. */ - -ulint -com_shm_endpoint_free( -/*==================*/ - /* out: O if succeed, else error number */ - com_shm_endpoint_t* ep) /* in, own: communications endpoint */ -{ - com_shm_t* map; - - ut_ad(ep); - - if (com_shm_endpoint_get_addr(ep) != NULL) { - - map = com_shm_endpoint_get_map(ep); - - if (com_shm_endpoint_get_owns_shm(ep)) { - - com_shm_unbind(ep); - } - - /* We do not destroy the data structures in the shared memory - area, because we cannot be sure that there is currently no - process accessing it. Therefore we just close the ip_mutex - residing in the area. */ - - ip_mutex_close(ep->ip_mutex); - - os_event_free(com_shm_endpoint_get_not_empty(ep)); - os_event_free(com_shm_endpoint_get_empty(ep)); - - os_shm_unmap(map); - os_shm_free(com_shm_endpoint_get_shm(ep)); - - mem_free(com_shm_endpoint_get_addr(ep)); - } - - mem_free(ep); - - return(0); -} - -/************************************************************************* -Sets an option, like the maximum datagram size for an endpoint. -The options may vary depending on the endpoint type. */ - -ulint -com_shm_endpoint_set_option( -/*========================*/ - /* out: 0 if succeed, else error number */ - com_shm_endpoint_t* ep, /* in: endpoint */ - ulint optno, /* in: option number, only - COM_OPT_MAX_DGRAM_SIZE currently supported */ - byte* optval, /* in: pointer to a buffer containing the - option value to set */ - ulint optlen) /* in: option value buffer length */ -{ - ulint size; - - UT_NOT_USED(optlen); - - ut_ad(ep); - ut_a(optno == COM_OPT_MAX_DGRAM_SIZE); - ut_ad(NULL == com_shm_endpoint_get_addr(ep)); - - size = *((ulint*)optval); - - ut_ad(size > 0); - - com_shm_endpoint_set_size(ep, size); - - return(0); -} - -/************************************************************************* -This function is used either to create a new shared memory area or open an -existing one, but this does not do the operations necessary with the ip mutex. -They are performed in com_shm_bind or com_shm_open which call this function. */ -static -ulint -com_shm_create_or_open( -/*===================*/ - /* out: 0 if succeed, else error number */ - com_shm_endpoint_t* ep, /* in: communications endpoint */ - char* name, /* in: address name */ - ulint len) /* in: address name length */ -{ - os_shm_t shm; - com_shm_t* map; - os_event_t event_ne; - os_event_t event_em; - char* buf; - - ut_ad(ep); - ut_ad(name); - ut_ad(len > 0); - - buf = mem_alloc(COM_MAX_ADDR_LEN + 20); - - ut_memcpy(buf, name, len); - - ut_strcpy(buf + len, (char*)"_IBSHM"); - - shm = os_shm_create(sizeof(com_shm_info_t) + COM_MAX_ADDR_LEN + - com_shm_endpoint_get_size(ep), buf); - if (shm == NULL) { - - return(COM_ERR_NOT_SPECIFIED); - } - - map = os_shm_map(shm); - - if (map == NULL) { - os_shm_free(shm); - - return(COM_ERR_NOT_SPECIFIED); - } - - ut_strcpy(buf + len, (char*)"_IBSHM_EV_NE"), - - event_ne = os_event_create(buf); - - ut_ad(event_ne); - - ut_strcpy(buf + len, (char*)"_IBSHM_EV_EM"), - - event_em = os_event_create(buf); - - ut_ad(event_em); - - ut_a(0); /* event_ne and event_em should be auto events! */ - - com_shm_endpoint_set_shm(ep, shm); - com_shm_endpoint_set_map(ep, map); - - com_shm_endpoint_set_not_empty(ep, event_ne); - com_shm_endpoint_set_empty(ep, event_em); - - com_shm_endpoint_set_addr(ep, buf); - com_shm_endpoint_set_addr_len(ep, len); - - return(0); -} - -/************************************************************************* -Opens a shared memory area for communication. */ -static -ulint -com_shm_open( -/*=========*/ - /* out: 0 if succeed, else error number */ - com_shm_endpoint_t* ep, /* in: communications endpoint */ - char* name, /* in: address name */ - ulint len) /* in: address name length */ -{ - ip_mutex_hdl_t* ip_hdl; - com_shm_t* map; - ulint ret; - char buf[COM_MAX_ADDR_LEN + 20]; - - ret = com_shm_create_or_open(ep, name, len); - - if (ret != 0) { - - return(ret); - } - - map = com_shm_endpoint_get_map(ep); - - /* Open the interprocess mutex to protect the shared memory area */ - - ut_memcpy(buf, name, len); - ut_strcpy(buf + len, (char*)"_IBSHM_MTX"); - - ret = ip_mutex_open(com_shm_get_ip_mutex(map), buf, &ip_hdl); - - if (ret != 0) { - - return(COM_ERR_NOT_SPECIFIED); - } - - ep->ip_mutex = ip_hdl; - - return(0); -} - -/************************************************************************* -Creates a shared memory area for communication. */ - -ulint -com_shm_bind( -/*=========*/ - /* out: 0 if succeed, else error number */ - com_shm_endpoint_t* ep, /* in: communications endpoint */ - char* name, /* in: address name */ - ulint len) /* in: address name length */ -{ - com_shm_t* map; - ulint ret; - char buf[COM_MAX_ADDR_LEN + 20]; - ip_mutex_hdl_t* ip_hdl; - - if (com_shm_endpoint_get_size(ep) == 0) { - - return(COM_ERR_MAX_DATAGRAM_SIZE_NOT_SET); - } - - ret = com_shm_create_or_open(ep, name, len); - - if (ret != 0) { - - return(ret); - } - - map = com_shm_endpoint_get_map(ep); - - /* Create the interprocess mutex to protect the shared memory area */ - - ut_memcpy(buf, name, len); - ut_strcpy(buf + len, (char*)"_IBSHM_MTX"); - - ret = ip_mutex_create(com_shm_get_ip_mutex(map), buf, &ip_hdl); - - if (ret != 0) { - - return(COM_ERR_NOT_SPECIFIED); - } - - /* This endpoint structure owns the shared memory area */ - - com_shm_endpoint_set_owns_shm(ep, TRUE); - ep->ip_mutex = ip_hdl; - - mutex_enter(&com_shm_destination_mutex); - - /* Increment the count of successful bindings */ - - com_shm_bind_count++; - - mutex_exit(&com_shm_destination_mutex); - - com_shm_set_not_empty(map, FALSE); - com_shm_set_empty_waiters(map, 0); - com_shm_set_max_len(map, com_shm_endpoint_get_size(ep)); - - com_shm_set_valid(map, COM_SHM_VALID); - - os_event_set(com_shm_endpoint_get_empty(ep)); - - return(0); -} - -/************************************************************************* -Waits for a datagram to arrive at an endpoint. */ - -ulint -com_shm_recvfrom( -/*=============*/ - /* out: 0 if succeed, else error number */ - com_shm_endpoint_t* ep, /* in: communications endpoint */ - byte* buf, /* out: datagram buffer; the buffer is - supplied by the caller */ - ulint buf_len,/* in: datagram buffer length */ - ulint* len, /* out: datagram length */ - char* from, /* out: address name buffer; the buffer is - supplied by the caller */ - ulint from_len,/* in: address name buffer length */ - ulint* addr_len)/* out: address name length */ -{ - com_shm_t* map; - ulint loop_count; - - map = com_shm_endpoint_get_map(ep); - - loop_count = 0; -loop: - com_shm_system_call_count++; - - /* NOTE: automatic event */ - - os_event_wait(com_shm_endpoint_get_not_empty(ep)); - - loop_count++; - - if (loop_count > 1) { - printf("!!!!!!!!COM_SHM loop count %lu\n", loop_count); - } - - ut_ad(loop_count < 2); - - com_shm_enter(ep); - - if (!com_shm_get_not_empty(map)) { - /* There was no datagram, wait for the event */ - - com_shm_exit(ep); - - goto loop; - } - - if (com_shm_get_data_len(map) > buf_len) { - - com_shm_exit(ep); - - return(COM_ERR_DATA_BUFFER_TOO_SMALL); - } - - if (com_shm_get_addr_len(map) > from_len) { - - com_shm_exit(ep); - - return(COM_ERR_ADDR_BUFFER_TOO_SMALL); - } - - *len = com_shm_get_data_len(map); - *addr_len = com_shm_get_addr_len(map); - - ut_memcpy(buf, com_shm_get_data(map), *len); - ut_memcpy(from, com_shm_get_addr(map), *addr_len); - - com_shm_set_not_empty(map, FALSE); - - /* If there may be writers queuing to insert the datagram, signal the - empty-event */ - - if (com_shm_get_empty_waiters(map) != 0) { - - com_shm_system_call_count++; - - os_event_set(com_shm_endpoint_get_empty(ep)); - } - - com_shm_exit(ep); - - return(0); -} - -/************************************************************************* -Sends a datagram to the specified destination. */ - -ulint -com_shm_sendto( -/*===========*/ - /* out: 0 if succeed, else error number */ - com_shm_endpoint_t* ep, /* in: communications endpoint */ - byte* buf, /* in: datagram buffer */ - ulint len, /* in: datagram length */ - char* to, /* in: address name buffer */ - ulint tolen) /* in: address name length */ -{ - com_shm_endpoint_t* ep2; - com_shm_t* map; - ulint sender_len; - ulint ret; - ulint loop_count; - - /* Try first to find from the cached destination addresses */ - - ep2 = com_shm_destination_cache_search(to, tolen); - - if (ep2 == NULL) { - /* Did not find it in the cache */ - ep2 = com_shm_endpoint_create(); - - ret = com_shm_open(ep2, to, tolen); - - if (ret != 0) { - com_shm_endpoint_free(ep2); - - return(ret); - } - - /* Insert into the cached destination addresses */ - - com_shm_destination_cache_insert(ep2); - } - - map = com_shm_endpoint_get_map(ep2); - - if (com_shm_get_valid(map) != COM_SHM_VALID) { - - com_shm_exit(ep2); - - return(COM_ERR_DGRAM_NOT_DELIVERED); - } - - if (com_shm_get_max_len(map) < len) { - - com_shm_exit(ep2); - - return(COM_ERR_DATA_TOO_LONG); - } - - /* Optimistically, we first go to see if the datagram area is empty, - without waiting for the empty-event */ - - loop_count = 0; -loop: - loop_count++; - - if (loop_count > 5) { - printf("!!!!!!COM_SHM Notempty loop count %lu\n", loop_count); - } - - ut_ad(loop_count < 100); - - com_shm_enter(ep2); - - if (com_shm_get_not_empty(map)) { - - /* Not empty, we cannot insert a datagram */ - - com_shm_set_empty_waiters(map, - 1 + com_shm_get_empty_waiters(map)); - com_shm_exit(ep2); - - com_shm_system_call_count++; - - /* Wait for the area to become empty */ - /* NOTE: automatic event */ - - ret = os_event_wait_time(com_shm_endpoint_get_empty(ep2), - 10000000); - ut_a(ret == 0); - - com_shm_enter(ep2); - - com_shm_set_empty_waiters(map, - com_shm_get_empty_waiters(map) - 1); - com_shm_exit(ep2); - - goto loop; - } - - sender_len = com_shm_endpoint_get_addr_len(ep); - - com_shm_set_data_len(map, len); - com_shm_set_addr_len(map, sender_len); - - ut_memcpy(com_shm_get_data(map), buf, len); - ut_memcpy(com_shm_get_addr(map), com_shm_endpoint_get_addr(ep), - sender_len); - com_shm_set_not_empty(map, TRUE); - com_shm_system_call_count++; - - com_shm_exit(ep2); - - /* Signal the event */ - - os_event_set(com_shm_endpoint_get_not_empty(ep2)); - - return(0); -} diff --git a/innobase/com/makefilewin b/innobase/com/makefilewin deleted file mode 100644 index 0d2d6d45952..00000000000 --- a/innobase/com/makefilewin +++ /dev/null @@ -1,12 +0,0 @@ -include ..\include\makefile.i - -com.lib: com0com.obj com0shm.obj - lib -out:..\libs\com.lib com0com.obj com0shm.obj - -com0com.obj: com0com.c - $(CCOM) $(CFL) -c com0com.c - -com0shm.obj: com0shm.c - $(CCOM) $(CFL) -c com0shm.c - - diff --git a/innobase/configure.in b/innobase/configure.in index a0606f10692..a94ade6dc8e 100644 --- a/innobase/configure.in +++ b/innobase/configure.in @@ -111,7 +111,7 @@ case "$target" in esac AC_OUTPUT(Makefile os/Makefile ut/Makefile btr/Makefile dnl - buf/Makefile com/Makefile data/Makefile dnl + buf/Makefile data/Makefile dnl dict/Makefile dyn/Makefile dnl eval/Makefile fil/Makefile fsp/Makefile fut/Makefile dnl ha/Makefile ibuf/Makefile include/Makefile dnl diff --git a/innobase/dict/dict0crea.c b/innobase/dict/dict0crea.c index 76e72ddd9c2..d6e817d465e 100644 --- a/innobase/dict/dict0crea.c +++ b/innobase/dict/dict0crea.c @@ -1088,7 +1088,7 @@ dict_create_or_check_foreign_constraint_tables(void) graph->fork_type = QUE_FORK_MYSQL_INTERFACE; - ut_a(thr = que_fork_start_command(graph, SESS_COMM_EXECUTE, 0)); + ut_a(thr = que_fork_start_command(graph)); que_run_threads(thr); @@ -1233,7 +1233,7 @@ loop: graph->fork_type = QUE_FORK_MYSQL_INTERFACE; - ut_a(thr = que_fork_start_command(graph, SESS_COMM_EXECUTE, 0)); + ut_a(thr = que_fork_start_command(graph)); que_run_threads(thr); diff --git a/innobase/include/Makefile.am b/innobase/include/Makefile.am index ab1f14d0770..813cf80d0af 100644 --- a/innobase/include/Makefile.am +++ b/innobase/include/Makefile.am @@ -18,8 +18,7 @@ noinst_HEADERS = btr0btr.h btr0btr.ic btr0cur.h btr0cur.ic \ btr0pcur.h btr0pcur.ic btr0sea.h btr0sea.ic btr0types.h \ buf0buf.h buf0buf.ic buf0flu.h buf0flu.ic buf0lru.h \ - buf0lru.ic buf0rea.h buf0types.h com0com.h com0com.ic \ - com0shm.h com0shm.ic data0data.h data0data.ic data0type.h \ + buf0lru.ic buf0rea.h buf0types.h data0data.h data0data.ic data0type.h \ data0type.ic data0types.h db0err.h dict0boot.h \ dict0boot.ic dict0crea.h dict0crea.ic dict0dict.h \ dict0dict.ic dict0load.h dict0load.ic dict0mem.h \ diff --git a/innobase/include/com0com.h b/innobase/include/com0com.h deleted file mode 100644 index 6f04b6a3f11..00000000000 --- a/innobase/include/com0com.h +++ /dev/null @@ -1,125 +0,0 @@ -/****************************************************** -The communication primitives - -(c) 1995 Innobase Oy - -Created 9/23/1995 Heikki Tuuri -*******************************************************/ - -/* This module defines a standard datagram communication -function interface for use in the database. We assume that -the communication medium is reliable. */ - -#ifndef com0com_h -#define com0com_h - -#include "univ.i" - -/* The communications endpoint type definition */ -typedef struct com_endpoint_struct com_endpoint_t; - -/* Possible endpoint communication types */ -#define COM_SHM 1 /* communication through shared memory */ - -/* Option numbers for endpoint */ -#define COM_OPT_MAX_DGRAM_SIZE 1 - -/* Error numbers */ -#define COM_ERR_NOT_SPECIFIED 1 -#define COM_ERR_NOT_BOUND 2 -#define COM_ERR_ALREADY_BOUND 3 -#define COM_ERR_MAX_DATAGRAM_SIZE_NOT_SET 4 -#define COM_ERR_DATA_BUFFER_TOO_SMALL 5 -#define COM_ERR_ADDR_BUFFER_TOO_SMALL 6 -#define COM_ERR_DATA_TOO_LONG 7 -#define COM_ERR_ADDR_TOO_LONG 8 -#define COM_ERR_DGRAM_NOT_DELIVERED 9 - -/* Maximum allowed address length in bytes */ -#define COM_MAX_ADDR_LEN 100 - -/************************************************************************* -Creates a communications endpoint. */ - -com_endpoint_t* -com_endpoint_create( -/*================*/ - /* out, own: communications endpoint, NULL if - did not succeed */ - ulint type); /* in: communication type of endpoint: - only COM_SHM supported */ -/************************************************************************* -Frees a communications endpoint. */ - -ulint -com_endpoint_free( -/*==============*/ - /* out: O if succeed, else error number */ - com_endpoint_t* ep); /* in, own: communications endpoint */ -/************************************************************************* -Sets an option, like the maximum datagram size for an endpoint. -The options may vary depending on the endpoint type. */ - -ulint -com_endpoint_set_option( -/*====================*/ - /* out: 0 if succeed, else error number */ - com_endpoint_t* ep, /* in: endpoint */ - ulint optno, /* in: option number, only - COM_OPT_MAX_DGRAM_SIZE currently supported */ - byte* optval, /* in: pointer to a buffer containing the - option value to set */ - ulint optlen);/* in: option value buffer length */ -/************************************************************************* -Binds a communications endpoint to a specified address. */ - -ulint -com_bind( -/*=====*/ - /* out: 0 if succeed, else error number */ - com_endpoint_t* ep, /* in: communications endpoint */ - char* name, /* in: address name */ - ulint len); /* in: name length */ -/************************************************************************* -Waits for a datagram to arrive at an endpoint. */ - -ulint -com_recvfrom( -/*=========*/ - /* out: 0 if succeed, else error number */ - com_endpoint_t* ep, /* in: communications endpoint */ - byte* buf, /* out: datagram buffer; the buffer must be - supplied by the caller */ - ulint buf_len,/* in: datagram buffer length */ - ulint* len, /* out: datagram length */ - char* from, /* out: address name buffer; the buffer must be - supplied by the caller */ - ulint from_len,/* in: address name buffer length */ - ulint* addr_len);/* out: address name length */ -/************************************************************************* -Sends a datagram to a specified destination. */ - -ulint -com_sendto( -/*=======*/ - /* out: 0 if succeed, else error number */ - com_endpoint_t* ep, /* in: communications endpoint */ - byte* buf, /* in: datagram buffer */ - ulint len, /* in: datagram length */ - char* to, /* in: address name buffer */ - ulint tolen); /* in: address name length */ -/************************************************************************* -Gets the maximum datagram size for an endpoint. */ - -ulint -com_endpoint_get_max_size( -/*======================*/ - /* out: maximum size */ - com_endpoint_t* ep); /* in: endpoint */ - - -#ifndef UNIV_NONINL -#include "com0com.ic" -#endif - -#endif diff --git a/innobase/include/com0com.ic b/innobase/include/com0com.ic deleted file mode 100644 index cec1cb190cc..00000000000 --- a/innobase/include/com0com.ic +++ /dev/null @@ -1,7 +0,0 @@ -/****************************************************** -The communication primitives - -(c) 1995 Innobase Oy - -Created 9/23/1995 Heikki Tuuri -*******************************************************/ diff --git a/innobase/include/com0shm.h b/innobase/include/com0shm.h deleted file mode 100644 index 7de9c4ac2de..00000000000 --- a/innobase/include/com0shm.h +++ /dev/null @@ -1,103 +0,0 @@ -/****************************************************** -The communication through shared memory - -(c) 1995 Innobase Oy - -Created 9/23/1995 Heikki Tuuri -*******************************************************/ - -#ifndef com0shm_h -#define com0shm_h - -#include "univ.i" - -typedef struct com_shm_endpoint_struct com_shm_endpoint_t; - -/* The performance of communication in NT depends on how -many times a system call is made (excluding os_thread_yield, -as that is the fastest way to switch thread). -The following variable counts such events. */ - -extern ulint com_shm_system_call_count; - - -/************************************************************************* -Creates a communications endpoint. */ - -com_shm_endpoint_t* -com_shm_endpoint_create(void); -/*=========================*/ - /* out, own: communications endpoint, NULL if - did not succeed */ -/************************************************************************* -Frees a communications endpoint. */ - -ulint -com_shm_endpoint_free( -/*==================*/ - /* out: O if succeed, else error number */ - com_shm_endpoint_t* ep);/* in, own: communications endpoint */ -/************************************************************************* -Sets an option, like the maximum datagram size for an endpoint. -The options may vary depending on the endpoint type. */ - -ulint -com_shm_endpoint_set_option( -/*========================*/ - /* out: 0 if succeed, else error number */ - com_shm_endpoint_t* ep, /* in: endpoint */ - ulint optno, /* in: option number, only - COM_OPT_MAX_DGRAM_SIZE currently supported */ - byte* optval, /* in: pointer to a buffer containing the - option value to set */ - ulint optlen);/* in: option value buffer length */ -/************************************************************************* -Bind a communications endpoint to a specified address. */ - -ulint -com_shm_bind( -/*=========*/ - /* out: 0 if succeed, else error number */ - com_shm_endpoint_t* ep, /* in: communications endpoint */ - char* name, /* in: address name */ - ulint len); /* in: address name length */ -/************************************************************************* -Waits for a datagram to arrive at an endpoint. */ - -ulint -com_shm_recvfrom( -/*=============*/ - /* out: 0 if succeed, else error number */ - com_shm_endpoint_t* ep, /* in: communications endpoint */ - byte* buf, /* out: datagram buffer; the buffer is - supplied by the caller */ - ulint buf_len,/* in: datagram buffer length */ - ulint* len, /* out: datagram length */ - char* from, /* out: address name buffer; the buffer is - supplied by the caller */ - ulint from_len,/* in: address name buffer length */ - ulint* addr_len);/* out: address name length */ -/************************************************************************* -Sends a datagram to the specified destination. */ - -ulint -com_shm_sendto( -/*===========*/ - /* out: 0 if succeed, else error number */ - com_shm_endpoint_t* ep, /* in: communications endpoint */ - byte* buf, /* in: datagram buffer */ - ulint len, /* in: datagram length */ - char* to, /* in: address name buffer */ - ulint tolen); /* in: address name length */ - -ulint -com_shm_endpoint_get_size( -/*======================*/ - com_shm_endpoint_t* ep); - - -#ifndef UNIV_NONINL -#include "com0shm.ic" -#endif - -#endif diff --git a/innobase/include/com0shm.ic b/innobase/include/com0shm.ic deleted file mode 100644 index e0d3cb26f69..00000000000 --- a/innobase/include/com0shm.ic +++ /dev/null @@ -1,7 +0,0 @@ -/****************************************************** -Communication through shared memory - -(c) 1995 Innobase Oy - -Created 9/23/1995 Heikki Tuuri -*******************************************************/ diff --git a/innobase/include/que0que.h b/innobase/include/que0que.h index a3ed18e2b14..e1874edcaf2 100644 --- a/innobase/include/que0que.h +++ b/innobase/include/que0que.h @@ -216,9 +216,7 @@ que_fork_start_command( QUE_THR_RUNNING state, or NULL; the query thread should be executed by que_run_threads by the caller */ - que_fork_t* fork, /* in: a query fork */ - ulint command,/* in: command SESS_COMM_FETCH_NEXT, ... */ - ulint param); /* in: possible parameter to the command */ + que_fork_t* fork); /* in: a query fork */ /*************************************************************************** Gets the trx of a query thread. */ UNIV_INLINE @@ -388,11 +386,6 @@ struct que_fork_struct{ sym_tab_t* sym_tab; /* symbol table of the query, generated by the parser, or NULL if the graph was created 'by hand' */ - ulint id; /* id of this query graph */ - ulint command; /* command currently executed in the - graph */ - ulint param; /* possible command parameter */ - /* The following cur_... fields are relevant only in a select graph */ ulint cur_end; /* QUE_CUR_NOT_DEFINED, QUE_CUR_START, diff --git a/innobase/include/srv0srv.h b/innobase/include/srv0srv.h index e16691e03c3..769d55fb66c 100644 --- a/innobase/include/srv0srv.h +++ b/innobase/include/srv0srv.h @@ -13,7 +13,6 @@ Created 10/10/1995 Heikki Tuuri #include "univ.i" #include "sync0sync.h" #include "os0sync.h" -#include "com0com.h" #include "que0types.h" #include "trx0types.h" @@ -398,9 +397,6 @@ struct srv_sys_struct{ os_event_t operational; /* created threads must wait for the server to become operational by waiting for this event */ - com_endpoint_t* endpoint; /* the communication endpoint of the - server */ - srv_table_t* threads; /* server thread table */ UT_LIST_BASE_NODE_T(que_thr_t) tasks; /* task queue */ diff --git a/innobase/include/trx0trx.h b/innobase/include/trx0trx.h index 6b08b674db8..d9b91ee62dc 100644 --- a/innobase/include/trx0trx.h +++ b/innobase/include/trx0trx.h @@ -203,13 +203,9 @@ trx_sig_send( ulint type, /* in: signal type */ ulint sender, /* in: TRX_SIG_SELF or TRX_SIG_OTHER_SESS */ - ibool reply, /* in: TRUE if the sender of the signal - wants reply after the operation induced - by the signal is completed; if type - is TRX_SIG_END_WAIT, this must be - FALSE */ que_thr_t* receiver_thr, /* in: query thread which wants the - reply, or NULL */ + reply, or NULL; if type is + TRX_SIG_END_WAIT, this must be NULL */ trx_savept_t* savept, /* in: possible rollback savepoint, or NULL */ que_thr_t** next_thr); /* in/out: next query thread to run; @@ -225,7 +221,6 @@ been handled. */ void trx_sig_reply( /*==========*/ - trx_t* trx, /* in: trx handle */ trx_sig_t* sig, /* in: signal */ que_thr_t** next_thr); /* in/out: next query thread to run; if the value which is passed in is @@ -297,15 +292,9 @@ struct trx_sig_struct{ TRX_SIG_BEING_HANDLED */ ulint sender; /* TRX_SIG_SELF or TRX_SIG_OTHER_SESS */ - ibool reply; /* TRUE if the sender of the signal + que_thr_t* receiver; /* non-NULL if the sender of the signal wants reply after the operation induced - by the signal is completed; if this - field is TRUE and the receiver field - below is NULL, then a SUCCESS message - is sent to the client of the session - to which this trx belongs */ - que_thr_t* receiver; /* query thread which wants the reply, - or NULL */ + by the signal is completed */ trx_savept_t savept; /* possible rollback savepoint */ UT_LIST_NODE_T(trx_sig_t) signals; /* queue of pending signals to the diff --git a/innobase/include/usr0sess.h b/innobase/include/usr0sess.h index e277d801672..c7bcfb20fed 100644 --- a/innobase/include/usr0sess.h +++ b/innobase/include/usr0sess.h @@ -11,7 +11,6 @@ Created 6/25/1996 Heikki Tuuri #include "univ.i" #include "ut0byte.h" -#include "hash0hash.h" #include "trx0types.h" #include "srv0srv.h" #include "trx0types.h" @@ -19,52 +18,14 @@ Created 6/25/1996 Heikki Tuuri #include "que0types.h" #include "data0data.h" #include "rem0rec.h" -#include "com0com.h" -/* The session system global data structure */ -extern sess_sys_t* sess_sys; - -/************************************************************************* -Sets the session id in a client message. */ - -void -sess_cli_msg_set_sess( -/*==================*/ - byte* str, /* in/out: message string */ - dulint sess_id);/* in: session id */ -/*************************************************************************** -Sets the message type of a message from the client. */ -UNIV_INLINE -void -sess_cli_msg_set_type( -/*==================*/ - byte* str, /* in: message string */ - ulint type); /* in: message type */ -/*************************************************************************** -Gets the message type of a message from the server. */ -UNIV_INLINE -ulint -sess_srv_msg_get_type( -/*==================*/ - /* out: message type */ - byte* str); /* in: message string */ -/*************************************************************************** -Creates a session sytem at database start. */ - -void -sess_sys_init_at_db_start(void); -/*===========================*/ /************************************************************************* Opens a session. */ sess_t* -sess_open( -/*======*/ +sess_open(void); +/*============*/ /* out, own: session object */ - com_endpoint_t* endpoint, /* in: communication endpoint used - for communicating with the client */ - byte* addr_buf, /* in: client address */ - ulint addr_len); /* in: client address length */ /************************************************************************* Closes a session, freeing the memory occupied by it, if it is in a state where it should be closed. */ @@ -74,200 +35,25 @@ sess_try_close( /*===========*/ /* out: TRUE if closed */ sess_t* sess); /* in, own: session object */ -/************************************************************************* -Initializes the first fields of a message to client. */ - -void -sess_srv_msg_init( -/*==============*/ - sess_t* sess, /* in: session object */ - byte* buf, /* in: message buffer, must be at least of size - SESS_SRV_MSG_DATA */ - ulint type); /* in: message type */ -/************************************************************************* -Sends a simple message to client. */ - -void -sess_srv_msg_send_simple( -/*=====================*/ - sess_t* sess, /* in: session object */ - ulint type, /* in: message type */ - ulint rel_kernel); /* in: SESS_RELEASE_KERNEL or - SESS_NOT_RELEASE_KERNEL */ -/*************************************************************************** -When a command has been completed, this function sends the message about it -to the client. */ - -void -sess_command_completed_message( -/*===========================*/ - sess_t* sess, /* in: session */ - byte* msg, /* in: message buffer */ - ulint len); /* in: message data length */ - /* The session handle. All fields are protected by the kernel mutex */ struct sess_struct{ - dulint id; /* session id */ - dulint usr_id; /* user id */ - hash_node_t hash; /* hash chain node */ - ulint refer_count; /* reference count to the session - object: when this drops to zero - and the session has no query graphs - left, discarding the session object - is allowed */ - dulint error_count; /* if this counter has increased while - a thread is parsing an SQL command, - its graph should be discarded */ - ibool disconnecting; /* TRUE if the session is to be - disconnected when its reference - count drops to 0 */ ulint state; /* state of the session */ - dulint msgs_sent; /* count of messages sent to the - client */ - dulint msgs_recv; /* count of messages received from the - client */ - ibool client_waits; /* when the session receives a message - from the client, this set to TRUE, and - when the session sends a message to - the client this is set to FALSE */ trx_t* trx; /* transaction object permanently assigned for the session: the transaction instance designated by the trx id changes, but the memory structure is preserved */ - ulint next_graph_id; /* next query graph id to assign */ UT_LIST_BASE_NODE_T(que_t) graphs; /* query graphs belonging to this session */ - /*------------------------------*/ - ulint err_no; /* latest error number, 0 if none */ - char* err_str; /* latest error string */ - ulint err_len; /* error string length */ - /*------------------------------*/ - com_endpoint_t* endpoint; /* server communications endpoint used - to communicate with the client */ - char* addr_buf; /* client address string */ - ulint addr_len; /* client address string length */ - /*------------------------------*/ - byte* big_msg; /* if the client sends a message which - does not fit in a single packet, - it is assembled in this buffer; if - this field is not NULL, it is assumed - that the message should be catenated - here */ - ulint big_msg_size; /* size of the big message buffer */ - ulint big_msg_len; /* length of data in the big message - buffer */ }; -/* The session system; this is protected by the kernel mutex */ -struct sess_sys_struct{ - ulint state; /* state of the system: - SESS_SYS_RUNNING or - SESS_SYS_SHUTTING_DOWN */ - sess_t* shutdown_req; /* if shutdown was requested by some - session, confirmation of shutdown - completion should be sent to this - session */ - dulint free_sess_id; /* first unused session id */ - hash_table_t* hash; /* hash table of the sessions */ -}; - - -/*---------------------------------------------------*/ -/* The format of an incoming message from a client */ -#define SESS_CLI_MSG_CHECKSUM 0 /* the checksum should be the first - field in the message */ -#define SESS_CLI_MSG_SESS_ID 4 /* this is set to 0 if the client - wants to connect and establish - a new session */ -#define SESS_CLI_MSG_SESS_ID_CHECK 12 /* checksum of the sess id field */ -#define SESS_CLI_MSG_TYPE 16 -#define SESS_CLI_MSG_NO 20 -#define SESS_CLI_MSG_CONTINUE 28 /* 0, or SESS_MSG_FIRST_PART - SESS_MSG_MIDDLE_PART, or - SESS_MSG_LAST_PART */ -#define SESS_CLI_MSG_CONT_SIZE 32 /* size of a multipart message in - kilobytes (rounded upwards) */ -#define SESS_CLI_MSG_DATA 36 -/*---------------------------------------------------*/ - -/* Client-to-session message types */ -#define SESS_CLI_CONNECT 1 -#define SESS_CLI_PREPARE 2 -#define SESS_CLI_EXECUTE 3 -#define SESS_CLI_BREAK_EXECUTION 4 - -/* Client-to-session statement command types */ -#define SESS_COMM_FETCH_NEXT 1 -#define SESS_COMM_FETCH_PREV 2 -#define SESS_COMM_FETCH_FIRST 3 -#define SESS_COMM_FETCH_LAST 4 -#define SESS_COMM_FETCH_NTH 5 -#define SESS_COMM_FETCH_NTH_LAST 6 -#define SESS_COMM_EXECUTE 7 -#define SESS_COMM_NO_COMMAND 8 - -/*---------------------------------------------------*/ -/* The format of an outgoing message from a session to the client */ -#define SESS_SRV_MSG_CHECKSUM 0 /* the checksum should be the first - field in the message */ -#define SESS_SRV_MSG_SESS_ID 4 -#define SESS_SRV_MSG_TYPE 12 -#define SESS_SRV_MSG_NO 16 -#define SESS_SRV_MSG_CONTINUE 24 /* 0, or SESS_MSG_FIRST_PART - SESS_MSG_MIDDLE_PART, or - SESS_MSG_LAST_PART */ -#define SESS_SRV_MSG_CONT_SIZE 28 /* size of a multipart message - in kilobytes (rounded upward) */ -#define SESS_SRV_MSG_DATA 32 -/*---------------------------------------------------*/ - -/* Session-to-client message types */ -#define SESS_SRV_ACCEPT_CONNECT 1 -#define SESS_SRV_SUCCESS 2 -#define SESS_SRV_ERROR 3 - -/* Multipart messages */ -#define SESS_MSG_SINGLE_PART 0 -#define SESS_MSG_FIRST_PART 1 -#define SESS_MSG_MIDDLE_PART 2 -#define SESS_MSG_LAST_PART 3 - -/* Error numbers */ -#define SESS_ERR_NONE 0 -#define SESS_ERR_TRX_COMMITTED 1 -#define SESS_ERR_TRX_ROLLED_BACK 2 -#define SESS_ERR_SESSION_DISCONNECTED 3 -#define SESS_ERR_REPLY_FAILED 4 -#define SESS_ERR_CANNOT_BREAK_OP 5 -#define SESS_ERR_MSG_LOST 6 -#define SESS_ERR_MSG_CORRUPTED 7 -#define SESS_ERR_EXTRANEOUS_MSG 8 -#define SESS_ERR_OUT_OF_MEMORY 9 -#define SESS_ERR_SQL_ERROR 10 -#define SESS_ERR_STMT_NOT_FOUND 11 -#define SESS_ERR_STMT_NOT_READY 12 -#define SESS_ERR_EXTRANEOUS_SRV_MSG 13 -#define SESS_ERR_BREAK_BY_CLIENT 14 - /* Session states */ #define SESS_ACTIVE 1 #define SESS_ERROR 2 /* session contains an error message which has not yet been communicated to the client */ -/* Session system states */ -#define SESS_SYS_RUNNING 1 -#define SESS_SYS_SHUTTING_DOWN 2 - -/* Session hash table size */ -#define SESS_HASH_SIZE 1024 - -/* Flags used in sess_srv_msg_send */ -#define SESS_RELEASE_KERNEL 1 -#define SESS_NOT_RELEASE_KERNEL 2 - #ifndef UNIV_NONINL #include "usr0sess.ic" #endif diff --git a/innobase/include/usr0sess.ic b/innobase/include/usr0sess.ic index ee2592c7963..c851d5745b9 100644 --- a/innobase/include/usr0sess.ic +++ b/innobase/include/usr0sess.ic @@ -5,27 +5,3 @@ Sessions Created 6/25/1996 Heikki Tuuri *******************************************************/ - -/*************************************************************************** -Sets the message type of a message from the client. */ -UNIV_INLINE -void -sess_cli_msg_set_type( -/*==================*/ - byte* str, /* in: message string */ - ulint type) /* in: message type */ -{ - mach_write_to_4(str + SESS_CLI_MSG_TYPE, type); -} - -/*************************************************************************** -Gets the message type of a message from the server. */ -UNIV_INLINE -ulint -sess_srv_msg_get_type( -/*==================*/ - /* out: message type */ - byte* str) /* in: message string */ -{ - return(mach_read_from_4(str + SESS_SRV_MSG_TYPE)); -} diff --git a/innobase/include/usr0types.h b/innobase/include/usr0types.h index 67070ccce27..29359425169 100644 --- a/innobase/include/usr0types.h +++ b/innobase/include/usr0types.h @@ -10,7 +10,5 @@ Created 6/25/1996 Heikki Tuuri #define usr0types_h typedef struct sess_struct sess_t; -typedef struct sess_sys_struct sess_sys_t; -typedef struct sess_sig_struct sess_sig_t; #endif diff --git a/innobase/que/que0que.c b/innobase/que/que0que.c index 76e39b4c590..73af1dc70e2 100644 --- a/innobase/que/que0que.c +++ b/innobase/que/que0que.c @@ -25,7 +25,6 @@ Created 5/27/1996 Heikki Tuuri #include "log0log.h" #include "eval0proc.h" #include "eval0eval.h" -#include "odbc0odbc.h" #define QUE_PARALLELIZE_LIMIT (64 * 256 * 256 * 256) #define QUE_ROUND_ROBIN_LIMIT (64 * 256 * 256 * 256) @@ -83,7 +82,9 @@ que_graph_publish( que_t* graph, /* in: graph */ sess_t* sess) /* in: session */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ UT_LIST_ADD_LAST(graphs, sess->graphs, graph); } @@ -190,7 +191,9 @@ que_thr_end_wait( { ibool was_active; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(thr); ut_ad((thr->state == QUE_THR_LOCK_WAIT) || (thr->state == QUE_THR_PROCEDURE_WAIT) @@ -229,7 +232,9 @@ que_thr_end_wait_no_next_thr( ut_a(thr->state == QUE_THR_LOCK_WAIT); /* In MySQL this is the only possible state here */ +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(thr); ut_ad((thr->state == QUE_THR_LOCK_WAIT) || (thr->state == QUE_THR_PROCEDURE_WAIT) @@ -279,15 +284,9 @@ que_fork_start_command( QUE_THR_RUNNING state, or NULL; the query thread should be executed by que_run_threads by the caller */ - que_fork_t* fork, /* in: a query fork */ - ulint command,/* in: command SESS_COMM_FETCH_NEXT, ... */ - ulint param) /* in: possible parameter to the command */ + que_fork_t* fork) /* in: a query fork */ { que_thr_t* thr; - - /* Set the command parameters in the fork root */ - fork->command = command; - fork->param = param; fork->state = QUE_FORK_ACTIVE; @@ -370,7 +369,9 @@ que_fork_error_handle( { que_thr_t* thr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(trx->sess->state == SESS_ERROR); ut_ad(UT_LIST_GET_LEN(trx->reply_signals) == 0); ut_ad(UT_LIST_GET_LEN(trx->wait_thrs) == 0); @@ -640,7 +641,9 @@ que_graph_try_free( { sess_t* sess; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ sess = (graph->trx)->sess; @@ -665,49 +668,20 @@ does nothing! */ void que_thr_handle_error( /*=================*/ - que_thr_t* thr, /* in: query thread */ - ulint err_no, /* in: error number */ - byte* err_str,/* in, own: error string or NULL; NOTE: the + que_thr_t* thr __attribute((unused)), + /* in: query thread */ + ulint err_no __attribute((unused)), + /* in: error number */ + byte* err_str __attribute((unused)), + /* in, own: error string or NULL; NOTE: the function will take care of freeing of the string! */ - ulint err_len)/* in: error string length */ + ulint err_len __attribute((unused))) + /* in: error string length */ { - UT_NOT_USED(thr); - UT_NOT_USED(err_no); - UT_NOT_USED(err_str); - UT_NOT_USED(err_len); - /* Does nothing */ } -/******************************************************************** -Builds a command completed-message to the client. */ -static -ulint -que_build_srv_msg( -/*==============*/ - /* out: message data length */ - byte* buf, /* in: message buffer */ - que_fork_t* fork, /* in: query graph where execution completed */ - sess_t* sess) /* in: session */ -{ - ulint len; - - /* Currently, we only support stored procedures: */ - ut_ad(fork->fork_type == QUE_FORK_PROCEDURE); - - if (sess->state == SESS_ERROR) { - - return(0); - } - - sess_srv_msg_init(sess, buf, SESS_SRV_SUCCESS); - - len = pars_proc_write_output_params_to_buf(buf + SESS_SRV_MSG_DATA, - fork); - return(len); -} - /******************************************************************** Performs an execution step on a thr node. */ static @@ -804,10 +778,6 @@ que_thr_dec_refer_count( que_fork_t* fork; trx_t* trx; sess_t* sess; - ibool send_srv_msg = FALSE; - ibool release_stored_proc = FALSE; - ulint msg_len = 0; - byte msg_buf[ODBC_DATAGRAM_SIZE]; ulint fork_type; ibool stopped; @@ -828,8 +798,8 @@ que_thr_dec_refer_count( already canceled before we came here: continue running the thread */ - /* printf( - "!!!!!!!!!! Wait already ended: continue thr\n"); */ + /* fputs("!!!!!!!! Wait already ended: continue thr\n", + stderr); */ if (next_thr && *next_thr == NULL) { *next_thr = thr; @@ -882,40 +852,13 @@ que_thr_dec_refer_count( } else if (fork_type == QUE_FORK_MYSQL_INTERFACE) { /* Do nothing */ - } else if (fork->common.parent == NULL - && fork->caller == NULL - && UT_LIST_GET_LEN(trx->signals) == 0) { - - ut_a(0); /* not used in MySQL */ - - /* Reply to the client */ - - /* que_thr_add_update_info(thr); */ - - fork->state = QUE_FORK_COMMAND_WAIT; - - msg_len = que_build_srv_msg(msg_buf, fork, sess); - - send_srv_msg = TRUE; - - if (fork->fork_type == QUE_FORK_PROCEDURE) { - - release_stored_proc = TRUE; - } - - ut_ad(trx->graph == fork); - - trx->graph = NULL; } else { - /* Subprocedure calls not implemented yet */ - ut_a(0); + ut_error; /* not used in MySQL */ } } if (UT_LIST_GET_LEN(trx->signals) > 0 && trx->n_active_thrs == 0) { - ut_ad(!send_srv_msg); - /* If the trx is signaled and its query thread count drops to zero, then we start processing a signal; from it we may get a new query thread to run */ @@ -929,26 +872,6 @@ que_thr_dec_refer_count( } mutex_exit(&kernel_mutex); - - if (send_srv_msg) { - /* Note that, as we do not own the kernel mutex at this point, - and neither do we own it all the time when doing the actual - communication operation within the next function, it is - possible that the messages will not get delivered in the right - sequential order. This is possible if the client communicates - an extra message to the server while the message below is still - undelivered. But then the client should notice that there - is an error in the order numbers of the messages. */ - - sess_command_completed_message(sess, msg_buf, msg_len); - } - - if (release_stored_proc) { - - /* Return the stored procedure graph to the dictionary cache */ - - dict_procedure_release_parsed_copy(fork); - } } /************************************************************************** @@ -966,7 +889,9 @@ que_thr_stop( que_t* graph; ibool ret = TRUE; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ graph = thr->graph; trx = graph->trx; @@ -1117,59 +1042,56 @@ que_node_print_info( /*================*/ que_node_t* node) /* in: query graph node */ { - ulint type; - char* str; - ulint addr; + ulint type; + const char* str; type = que_node_get_type(node); - addr = (ulint)node; - if (type == QUE_NODE_SELECT) { - str = (char *) "SELECT"; + str = "SELECT"; } else if (type == QUE_NODE_INSERT) { - str = (char *) "INSERT"; + str = "INSERT"; } else if (type == QUE_NODE_UPDATE) { - str = (char *) "UPDATE"; + str = "UPDATE"; } else if (type == QUE_NODE_WHILE) { - str = (char *) "WHILE"; + str = "WHILE"; } else if (type == QUE_NODE_ASSIGNMENT) { - str = (char *) "ASSIGNMENT"; + str = "ASSIGNMENT"; } else if (type == QUE_NODE_IF) { - str = (char *) "IF"; + str = "IF"; } else if (type == QUE_NODE_FETCH) { - str = (char *) "FETCH"; + str = "FETCH"; } else if (type == QUE_NODE_OPEN) { - str = (char *) "OPEN"; + str = "OPEN"; } else if (type == QUE_NODE_PROC) { - str = (char *) "STORED PROCEDURE"; + str = "STORED PROCEDURE"; } else if (type == QUE_NODE_FUNC) { - str = (char *) "FUNCTION"; + str = "FUNCTION"; } else if (type == QUE_NODE_LOCK) { - str = (char *) "LOCK"; + str = "LOCK"; } else if (type == QUE_NODE_THR) { - str = (char *) "QUERY THREAD"; + str = "QUERY THREAD"; } else if (type == QUE_NODE_COMMIT) { - str = (char *) "COMMIT"; + str = "COMMIT"; } else if (type == QUE_NODE_UNDO) { - str = (char *) "UNDO ROW"; + str = "UNDO ROW"; } else if (type == QUE_NODE_PURGE) { - str = (char *) "PURGE ROW"; + str = "PURGE ROW"; } else if (type == QUE_NODE_ROLLBACK) { - str = (char *) "ROLLBACK"; + str = "ROLLBACK"; } else if (type == QUE_NODE_CREATE_TABLE) { - str = (char *) "CREATE TABLE"; + str = "CREATE TABLE"; } else if (type == QUE_NODE_CREATE_INDEX) { - str = (char *) "CREATE INDEX"; + str = "CREATE INDEX"; } else if (type == QUE_NODE_FOR) { - str = (char *) "FOR LOOP"; + str = "FOR LOOP"; } else if (type == QUE_NODE_RETURN) { - str = (char *) "RETURN"; + str = "RETURN"; } else { - str = (char *) "UNKNOWN NODE TYPE"; + str = "UNKNOWN NODE TYPE"; } - printf("Node type %lu: %s, address %lx\n", type, str, addr); + fprintf(stderr, "Node type %lu: %s, address %p\n", type, str, node); } /************************************************************************** @@ -1199,7 +1121,7 @@ que_thr_step( #ifdef UNIV_DEBUG if (que_trace_on) { - printf("To execute: "); + fputs("To execute: ", stderr); que_node_print_info(node); } #endif @@ -1296,7 +1218,9 @@ que_run_threads( ulint loop_count; ut_ad(thr->state == QUE_THR_RUNNING); +#ifdef UNIV_SYNC_DEBUG ut_ad(!mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ /* cumul_resource counts how much resources the OS thread (NOT the query thread) has spent in this function */ diff --git a/innobase/row/row0mysql.c b/innobase/row/row0mysql.c index 22530662b48..576c2bc1597 100644 --- a/innobase/row/row0mysql.c +++ b/innobase/row/row0mysql.c @@ -1402,8 +1402,7 @@ row_create_table_for_mysql( thr = pars_complete_graph_for_exec(node, trx, heap); - ut_a(thr == que_fork_start_command(que_node_get_parent(thr), - SESS_COMM_EXECUTE, 0)); + ut_a(thr == que_fork_start_command(que_node_get_parent(thr))); que_run_threads(thr); err = trx->error_state; @@ -1525,8 +1524,7 @@ row_create_index_for_mysql( thr = pars_complete_graph_for_exec(node, trx, heap); - ut_a(thr == que_fork_start_command(que_node_get_parent(thr), - SESS_COMM_EXECUTE, 0)); + ut_a(thr == que_fork_start_command(que_node_get_parent(thr))); que_run_threads(thr); err = trx->error_state; @@ -2070,7 +2068,7 @@ row_drop_table_for_mysql( trx->dict_operation = TRUE; trx->table_id = table->id; - ut_a(thr = que_fork_start_command(graph, SESS_COMM_EXECUTE, 0)); + ut_a(thr = que_fork_start_command(graph)); que_run_threads(thr); @@ -2450,7 +2448,7 @@ row_rename_table_for_mysql( graph->fork_type = QUE_FORK_MYSQL_INTERFACE; - ut_a(thr = que_fork_start_command(graph, SESS_COMM_EXECUTE, 0)); + ut_a(thr = que_fork_start_command(graph)); que_run_threads(thr); diff --git a/innobase/srv/srv0srv.c b/innobase/srv/srv0srv.c index 2bb3e8ea60c..065647ecb87 100644 --- a/innobase/srv/srv0srv.c +++ b/innobase/srv/srv0srv.c @@ -34,8 +34,6 @@ Created 10/8/1995 Heikki Tuuri #include "sync0sync.h" #include "sync0ipm.h" #include "thr0loc.h" -#include "com0com.h" -#include "com0shm.h" #include "que0que.h" #include "srv0que.h" #include "log0recv.h" @@ -235,9 +233,6 @@ int srv_query_thread_priority = 0; ulint srv_n_spin_wait_rounds = 20; ulint srv_spin_wait_delay = 5; ibool srv_priority_boost = TRUE; -char srv_endpoint_name[COM_MAX_ADDR_LEN]; -ulint srv_n_com_threads = ULINT_MAX; -ulint srv_n_worker_threads = ULINT_MAX; ibool srv_print_thread_releases = FALSE; ibool srv_print_lock_waits = FALSE; @@ -245,14 +240,14 @@ ibool srv_print_buf_io = FALSE; ibool srv_print_log_io = FALSE; ibool srv_print_latch_waits = FALSE; -ulint srv_n_rows_inserted = 0; -ulint srv_n_rows_updated = 0; -ulint srv_n_rows_deleted = 0; -ulint srv_n_rows_read = 0; -ulint srv_n_rows_inserted_old = 0; -ulint srv_n_rows_updated_old = 0; -ulint srv_n_rows_deleted_old = 0; -ulint srv_n_rows_read_old = 0; +ulint srv_n_rows_inserted = 0; +ulint srv_n_rows_updated = 0; +ulint srv_n_rows_deleted = 0; +ulint srv_n_rows_read = 0; +static ulint srv_n_rows_inserted_old = 0; +static ulint srv_n_rows_updated_old = 0; +static ulint srv_n_rows_deleted_old = 0; +static ulint srv_n_rows_read_old = 0; /* Set the following to 0 if you want InnoDB to write messages on diff --git a/innobase/srv/srv0start.c b/innobase/srv/srv0start.c index d5e92422d88..0491aed29f5 100644 --- a/innobase/srv/srv0start.c +++ b/innobase/srv/srv0start.c @@ -39,7 +39,6 @@ Created 2/16/1996 Heikki Tuuri #include "rem0rec.h" #include "srv0srv.h" #include "que0que.h" -#include "com0com.h" #include "usr0sess.h" #include "lock0lock.h" #include "trx0roll.h" @@ -1211,8 +1210,6 @@ NetWare. */ mutex_exit(&(log_sys->mutex)); } - sess_sys_init_at_db_start(); - if (create_new_db) { mtr_start(&mtr); diff --git a/innobase/trx/trx0purge.c b/innobase/trx/trx0purge.c index fa9c287b0ad..222ca6debbd 100644 --- a/innobase/trx/trx0purge.c +++ b/innobase/trx/trx0purge.c @@ -195,8 +195,6 @@ void trx_purge_sys_create(void) /*======================*/ { - com_endpoint_t* com_endpoint; - ut_ad(mutex_own(&kernel_mutex)); purge_sys = mem_alloc(sizeof(trx_purge_t)); @@ -219,9 +217,7 @@ trx_purge_sys_create(void) purge_sys->arr = trx_undo_arr_create(); - com_endpoint = (com_endpoint_t*)purge_sys; /* This is a dummy non-NULL - value */ - purge_sys->sess = sess_open(com_endpoint, (byte*)"purge_system", 13); + purge_sys->sess = sess_open(); purge_sys->trx = purge_sys->sess->trx; @@ -1034,11 +1030,11 @@ trx_purge(void) mutex_enter(&kernel_mutex); - thr = que_fork_start_command(purge_sys->query, SESS_COMM_EXECUTE, 0); + thr = que_fork_start_command(purge_sys->query); ut_ad(thr); -/* thr2 = que_fork_start_command(purge_sys->query, SESS_COMM_EXECUTE, 0); +/* thr2 = que_fork_start_command(purge_sys->query); ut_ad(thr2); */ diff --git a/innobase/trx/trx0roll.c b/innobase/trx/trx0roll.c index 7d1b341221c..206aeb1d2ce 100644 --- a/innobase/trx/trx0roll.c +++ b/innobase/trx/trx0roll.c @@ -73,8 +73,7 @@ trx_general_rollback_for_mysql( thr = pars_complete_graph_for_exec(roll_node, trx, heap); - ut_a(thr == que_fork_start_command(que_node_get_parent(thr), - SESS_COMM_EXECUTE, 0)); + ut_a(thr == que_fork_start_command(que_node_get_parent(thr))); que_run_threads(thr); mutex_enter(&kernel_mutex); @@ -354,8 +353,7 @@ trx_rollback_or_clean_all_without_sess(void) /* Open a dummy session */ if (!trx_dummy_sess) { - trx_dummy_sess = sess_open(NULL, (byte*)"Dummy sess", - ut_strlen((char *) "Dummy sess")); + trx_dummy_sess = sess_open(); } mutex_exit(&kernel_mutex); @@ -418,7 +416,7 @@ loop: trx->graph = fork; - ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); + ut_a(thr == que_fork_start_command(fork)); trx_roll_max_undo_no = ut_conv_dulint_to_longlong(trx->undo_no); trx_roll_progress_printed_pct = 0; @@ -981,11 +979,11 @@ trx_rollback( trx->graph = roll_graph; trx->que_state = TRX_QUE_ROLLING_BACK; - thr = que_fork_start_command(roll_graph, SESS_COMM_EXECUTE, 0); + thr = que_fork_start_command(roll_graph); ut_ad(thr); -/* thr2 = que_fork_start_command(roll_graph, SESS_COMM_EXECUTE, 0); +/* thr2 = que_fork_start_command(roll_graph); ut_ad(thr2); */ @@ -1082,7 +1080,7 @@ trx_finish_partial_rollback_off_kernel( /* Remove the signal from the signal queue and send reply message to it */ - trx_sig_reply(trx, sig, next_thr); + trx_sig_reply(sig, next_thr); trx_sig_remove(trx, sig); trx->que_state = TRX_QUE_RUNNING; @@ -1145,7 +1143,7 @@ trx_finish_rollback_off_kernel( if (sig->type == TRX_SIG_TOTAL_ROLLBACK) { - trx_sig_reply(trx, sig, next_thr); + trx_sig_reply(sig, next_thr); trx_sig_remove(trx, sig); } @@ -1213,7 +1211,7 @@ trx_rollback_step( success = trx_sig_send(thr_get_trx(thr), sig_no, TRX_SIG_SELF, - TRUE, thr, savept, NULL); + thr, savept, NULL); thr->state = QUE_THR_SIG_REPLY_WAIT; diff --git a/innobase/trx/trx0trx.c b/innobase/trx/trx0trx.c index 10f57580b73..78a7e277657 100644 --- a/innobase/trx/trx0trx.c +++ b/innobase/trx/trx0trx.c @@ -171,8 +171,7 @@ trx_allocate_for_mysql(void) /* Open a dummy session */ if (!trx_dummy_sess) { - trx_dummy_sess = sess_open(NULL, (byte*)"Dummy sess", - ut_strlen((char *) "Dummy sess")); + trx_dummy_sess = sess_open(); } trx = trx_create(trx_dummy_sess); @@ -205,8 +204,7 @@ trx_allocate_for_background(void) /* Open a dummy session */ if (!trx_dummy_sess) { - trx_dummy_sess = sess_open(NULL, (byte*)"Dummy sess", - ut_strlen("Dummy sess")); + trx_dummy_sess = sess_open(); } trx = trx_create(trx_dummy_sess); @@ -913,7 +911,7 @@ trx_handle_commit_sig_off_kernel( if (sig->type == TRX_SIG_COMMIT) { - trx_sig_reply(trx, sig, next_thr); + trx_sig_reply(sig, next_thr); trx_sig_remove(trx, sig); } @@ -1002,7 +1000,6 @@ trx_sig_reply_wait_to_suspended( thr->state = QUE_THR_SUSPENDED; sig->receiver = NULL; - sig->reply = FALSE; UT_LIST_REMOVE(reply_signals, trx->reply_signals, sig); @@ -1096,13 +1093,9 @@ trx_sig_send( ulint type, /* in: signal type */ ulint sender, /* in: TRX_SIG_SELF or TRX_SIG_OTHER_SESS */ - ibool reply, /* in: TRUE if the sender of the signal - wants reply after the operation induced - by the signal is completed; if type - is TRX_SIG_END_WAIT, this must be - FALSE */ que_thr_t* receiver_thr, /* in: query thread which wants the - reply, or NULL */ + reply, or NULL; if type is + TRX_SIG_END_WAIT, this must be NULL */ trx_savept_t* savept, /* in: possible rollback savepoint, or NULL */ que_thr_t** next_thr) /* in/out: next query thread to run; @@ -1146,7 +1139,6 @@ trx_sig_send( sig->type = type; sig->state = TRX_SIG_WAITING; sig->sender = sender; - sig->reply = reply; sig->receiver = receiver_thr; if (savept) { @@ -1305,7 +1297,7 @@ loop: } else if (type == TRX_SIG_BREAK_EXECUTION) { - trx_sig_reply(trx, sig, next_thr); + trx_sig_reply(sig, next_thr); trx_sig_remove(trx, sig); } else { ut_error; @@ -1321,7 +1313,6 @@ handled. */ void trx_sig_reply( /*==========*/ - trx_t* trx, /* in: trx handle */ trx_sig_t* sig, /* in: signal */ que_thr_t** next_thr) /* in/out: next query thread to run; if the value which is passed in is @@ -1331,11 +1322,10 @@ trx_sig_reply( { trx_t* receiver_trx; - ut_ad(trx && sig); + ut_ad(sig); ut_ad(mutex_own(&kernel_mutex)); - if (sig->reply && (sig->receiver != NULL)) { - + if (sig->receiver != NULL) { ut_ad((sig->receiver)->state == QUE_THR_SIG_REPLY_WAIT); receiver_trx = thr_get_trx(sig->receiver); @@ -1346,18 +1336,8 @@ trx_sig_reply( que_thr_end_wait(sig->receiver, next_thr); - sig->reply = FALSE; sig->receiver = NULL; - } else if (sig->reply) { - /* In this case the reply should be sent to the client of - the session of the transaction */ - - sig->reply = FALSE; - sig->receiver = NULL; - - sess_srv_msg_send_simple(trx->sess, SESS_SRV_SUCCESS, - SESS_NOT_RELEASE_KERNEL); } } @@ -1373,7 +1353,6 @@ trx_sig_remove( ut_ad(trx && sig); ut_ad(mutex_own(&kernel_mutex)); - ut_ad(sig->reply == FALSE); ut_ad(sig->receiver == NULL); UT_LIST_REMOVE(signals, trx->signals, sig); @@ -1435,8 +1414,7 @@ trx_commit_step( /* Send the commit signal to the transaction */ success = trx_sig_send(thr_get_trx(thr), TRX_SIG_COMMIT, - TRX_SIG_SELF, TRUE, thr, NULL, - &next_thr); + TRX_SIG_SELF, thr, NULL, &next_thr); mutex_exit(&kernel_mutex); diff --git a/innobase/usr/usr0sess.c b/innobase/usr/usr0sess.c index c024a51b0f4..359c1552421 100644 --- a/innobase/usr/usr0sess.c +++ b/innobase/usr/usr0sess.c @@ -12,21 +12,7 @@ Created 6/25/1996 Heikki Tuuri #include "usr0sess.ic" #endif -#include "ut0rnd.h" -#include "mach0data.h" -#include "ha0ha.h" #include "trx0trx.h" -#include "que0que.h" -#include "pars0pars.h" -#include "pars0sym.h" -#include "dict0dict.h" -#include "dict0mem.h" -#include "odbc0odbc.h" - -#define SESS_ERR_BUF_SIZE 8192 - -/* The session system global data structure */ -sess_sys_t* sess_sys = NULL; /************************************************************************* Closes a session, freeing the memory occupied by it. */ @@ -35,247 +21,28 @@ void sess_close( /*=======*/ sess_t* sess); /* in, own: session object */ -/************************************************************************* -Communicates an error message to the client. If sess->client_waits is not -TRUE, puts the session to error state and does not try to send the error -message. */ -static -void -sess_srv_msg_send_error( -/*====================*/ - sess_t* sess); /* in: session object */ -/************************************************************************* -Copies error info to a session. Sends to the transaction a signal which will -rollback the latest incomplete SQL statement and then send the error message -to the client. NOTE: This function will take care of the freeing of the error -string, thus the caller must supply a copy of the error string. */ -static -void -sess_error_low( -/*===========*/ - sess_t* sess, /* in: session object */ - ulint err_no, /* in: error number */ - char* err_str);/* in, own: error string or NULL; - NOTE: the function will take care of freeing of the - string! */ - -/************************************************************************* -Folds a session id to a ulint. Because this function is used also in -calculating a checksum for the id to write in the message, it is performs -also a XOR operation to mix the values more thoroughly. */ -UNIV_INLINE -ulint -sess_id_fold( -/*=========*/ - /* out: folded value; can be used also as the checksum - for id */ - dulint id) /* in: session id */ -{ - return(ut_fold_dulint(id) ^ 2945794411U); -} - -/************************************************************************* -Sets the session id in a client message. */ - -void -sess_cli_msg_set_sess( -/*==================*/ - byte* str, /* in/out: message string */ - dulint sess_id)/* in: session id */ -{ - ulint fold; - - mach_write_to_8(str + SESS_CLI_MSG_SESS_ID, sess_id); - - fold = sess_id_fold(sess_id); - - mach_write_to_4(str + SESS_CLI_MSG_SESS_ID_CHECK, fold); -} - -/*************************************************************************** -Decrements the reference count of a session and closes it, if desired. */ -UNIV_INLINE -void -sess_refer_count_dec( -/*=================*/ - sess_t* sess) /* in: session */ -{ - ut_ad(mutex_own(&kernel_mutex)); - ut_ad(sess->refer_count > 0); - - sess->refer_count--; - - if (sess->disconnecting && (sess->refer_count == 0)) { - - sess_close(sess); - } -} - -/*************************************************************************** -Increments the reference count of a session. */ -UNIV_INLINE -void -sess_refer_count_inc( -/*=================*/ - sess_t* sess) /* in: session */ -{ - ut_ad(mutex_own(&kernel_mutex)); - - sess->refer_count++; -} - -/*************************************************************************** -Creates a session system at a database start. */ - -void -sess_sys_init_at_db_start(void) -/*===========================*/ -{ - sess_sys = mem_alloc(sizeof(sess_sys_t)); - - sess_sys->state = SESS_SYS_RUNNING; - sess_sys->free_sess_id = ut_dulint_create(0, 1); - sess_sys->hash = hash_create(SESS_HASH_SIZE); -} - -/*************************************************************************** -Gets the message type of a message from client. */ -UNIV_INLINE -ulint -sess_cli_msg_get_type( -/*==================*/ - /* out: message type */ - byte* str) /* in: message string */ -{ - ut_ad(mutex_own(&kernel_mutex)); - - return(mach_read_from_4(str + SESS_CLI_MSG_TYPE)); -} - -/*************************************************************************** -Gets the message number of a message from client. */ -UNIV_INLINE -dulint -sess_cli_msg_get_msg_no( -/*====================*/ - /* out: message number */ - byte* str) /* in: message string */ -{ - ut_ad(mutex_own(&kernel_mutex)); - - return(mach_read_from_8(str + SESS_CLI_MSG_NO)); -} - -/*************************************************************************** -Gets the continue field of a message from client. */ -UNIV_INLINE -ulint -sess_cli_msg_get_continue( -/*======================*/ - /* out: SESS_MSG_SINGLE_PART, ... */ - byte* str) /* in: message string */ -{ - ut_ad(mutex_own(&kernel_mutex)); - - return(mach_read_from_4(str + SESS_CLI_MSG_CONTINUE)); -} - -/*************************************************************************** -Gets the size of a big message in kilobytes. */ -UNIV_INLINE -ulint -sess_cli_msg_get_cont_size( -/*=======================*/ - /* out: size in kilobytes */ - byte* str) /* in: message string */ -{ - ut_ad(mutex_own(&kernel_mutex)); - - return(mach_read_from_4(str + SESS_CLI_MSG_CONT_SIZE)); -} - -/************************************************************************* -Checks the consistency of a message from a client. */ -UNIV_INLINE -ibool -sess_cli_msg_check_consistency( -/*===========================*/ - /* out: TRUE if ok */ - byte* str, /* in: message string */ - ulint len) /* in: message string length */ -{ - ulint fold; - - ut_ad(mutex_own(&kernel_mutex)); - - if (len < SESS_CLI_MSG_DATA) { - - return(FALSE); - } - - ut_ad(SESS_CLI_MSG_CHECKSUM == 0); - - fold = ut_fold_binary(str + 4, len - 4); - - if (mach_read_from_4(str + SESS_CLI_MSG_CHECKSUM) != fold) { - - return(FALSE); - } - - return(TRUE); -} /************************************************************************* Opens a session. */ sess_t* -sess_open( -/*======*/ +sess_open(void) +/*===========*/ /* out, own: session object */ - com_endpoint_t* endpoint, /* in: communication endpoint used - for receiving messages from the client, - or NULL if no client */ - byte* addr_buf, /* in: client address (= user name) */ - ulint addr_len) /* in: client address length */ { sess_t* sess; - ulint fold; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); - +#endif /* UNIV_SYNC_DEBUG */ sess = mem_alloc(sizeof(sess_t)); - sess->id = sess_sys->free_sess_id; - UT_DULINT_INC(sess_sys->free_sess_id); - sess->state = SESS_ACTIVE; - sess->disconnecting = FALSE; - sess->msgs_sent = ut_dulint_zero; - sess->msgs_recv = ut_dulint_zero; - sess->client_waits = TRUE; - sess->err_no = 0; - sess->err_str = NULL; - sess->error_count = ut_dulint_zero; - - sess->big_msg = NULL; sess->trx = trx_create(sess); - sess->next_graph_id = 0; - UT_LIST_INIT(sess->graphs); - fold = sess_id_fold(sess->id); - - HASH_INSERT(sess_t, hash, sess_sys->hash, fold, sess); - - sess->endpoint = endpoint; - sess->addr_buf = mem_alloc(addr_len); - - ut_memcpy(sess->addr_buf, addr_buf, addr_len); - - sess->addr_len = addr_len; - return(sess); } @@ -288,23 +55,11 @@ sess_close( /*=======*/ sess_t* sess) /* in, own: session object */ { - ulint fold; - +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); - ut_ad(sess->disconnecting); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(sess->trx == NULL); - ut_ad(sess->refer_count == 0); - fold = ut_fold_dulint(sess->id); - HASH_DELETE(sess_t, hash, sess_sys->hash, fold, sess); - -/* sess_reply_to_client_rel_kernel(sess); */ - - if (sess->err_str != NULL) { - mem_free(sess->err_str); - } - - mem_free(sess->addr_buf); mem_free(sess); } @@ -318,10 +73,10 @@ sess_try_close( /* out: TRUE if closed */ sess_t* sess) /* in, own: session object */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); - - if (sess->disconnecting && (UT_LIST_GET_LEN(sess->graphs) == 0) - && (sess->refer_count == 0)) { +#endif /* UNIV_SYNC_DEBUG */ + if (UT_LIST_GET_LEN(sess->graphs) == 0) { sess_close(sess); return(TRUE); @@ -329,258 +84,3 @@ sess_try_close( return(FALSE); } - -/************************************************************************* -Initializes the first fields of a message to client. */ - -void -sess_srv_msg_init( -/*==============*/ - sess_t* sess, /* in: session object */ - byte* buf, /* in: message buffer, must be at least of size - SESS_SRV_MSG_DATA */ - ulint type) /* in: message type */ -{ - ut_ad(mutex_own(&kernel_mutex)); - - sess->msgs_sent = ut_dulint_add(sess->msgs_sent, 1); - - mach_write_to_8(buf + SESS_SRV_MSG_SESS_ID, sess->id); - mach_write_to_4(buf + SESS_SRV_MSG_TYPE, type); - mach_write_to_8(buf + SESS_SRV_MSG_NO, sess->msgs_sent); - - ut_ad(com_endpoint_get_max_size(sess->endpoint) >= SESS_SRV_MSG_DATA); -} - -/************************************************************************* -Sends a message to the client. */ -static -ulint -sess_srv_msg_send_low( -/*==================*/ - /* out: 0 if success, else error number */ - sess_t* sess, /* in: session object */ - byte* buf, /* in: message buffer */ - ulint len, /* in: message length */ - ulint rel_ker)/* in: SESS_RELEASE_KERNEL if the kernel mutex should - be temporarily released in the call; otherwise - SESS_NOT_RELEASE_KERNEL */ -{ - ulint ret; - - ut_ad((rel_ker == SESS_NOT_RELEASE_KERNEL) - || (rel_ker == SESS_RELEASE_KERNEL)); - ut_ad(mutex_own(&kernel_mutex)); - ut_ad(len <= com_endpoint_get_max_size(sess->endpoint)); - ut_ad(len >= SESS_SRV_MSG_DATA); - - if (sess->client_waits == FALSE) { - sess_error_low(sess, SESS_ERR_EXTRANEOUS_SRV_MSG, NULL); - - return(1); - } - - /* The client will now receive an error message: if the session is - in the error state, we can reset it to the normal state */ - - if (sess->state == SESS_ERROR) { - sess->state = SESS_ACTIVE; - } - - /* We reset the client_waits flag to FALSE, regardless of whether the - message gets delivered to the client or not. This convention makes - things simpler. */ - - sess->client_waits = FALSE; - - if (rel_ker == SESS_RELEASE_KERNEL) { - - mutex_exit(&kernel_mutex); - } - - ret = com_sendto(sess->endpoint, buf, len, sess->addr_buf, - sess->addr_len); - if (rel_ker == SESS_RELEASE_KERNEL) { - - mutex_enter(&kernel_mutex); - } - - if (ret != 0) { - sess_error_low(sess, SESS_ERR_REPLY_FAILED, NULL); - } - - return(ret); -} - -/************************************************************************* -Sends a message to the client. If the session is in the error state, sends -the error message instead of buf. */ -static -ulint -sess_srv_msg_send( -/*==============*/ - /* out: 0 if success, else error number */ - sess_t* sess, /* in: session object */ - byte* buf, /* in: message buffer */ - ulint len, /* in: message length */ - ulint rel_ker)/* in: SESS_RELEASE_KERNEL if the kernel mutex should - be temporarily released in the call; otherwise - SESS_NOT_RELEASE_KERNEL */ -{ - ulint ret; - - ut_ad(mutex_own(&kernel_mutex)); - - if (sess->state == SESS_ERROR) { - - sess_srv_msg_send_error(sess); - - return(2); - } - - ret = sess_srv_msg_send_low(sess, buf, len, rel_ker); - - return(ret); -} - -/************************************************************************* -Sends a simple message to client. */ - -void -sess_srv_msg_send_simple( -/*=====================*/ - sess_t* sess, /* in: session object */ - ulint type, /* in: message type */ - ulint rel_kernel) /* in: SESS_RELEASE_KERNEL or - SESS_NOT_RELEASE_KERNEL */ -{ - byte buf[SESS_SRV_MSG_DATA]; - - ut_ad(mutex_own(&kernel_mutex)); - - sess_srv_msg_init(sess, buf, type); - - sess_srv_msg_send(sess, buf, SESS_SRV_MSG_DATA, rel_kernel); -} - -/************************************************************************* -Communicates an error message to the client. If sess->client_waits is not -TRUE, puts the session to error state and does not try to send the error -message. */ -static -void -sess_srv_msg_send_error( -/*====================*/ - sess_t* sess) /* in: session object */ -{ - ulint err_no; - byte* err_str; - ulint err_len; - ulint max_len; - byte buf[SESS_ERR_BUF_SIZE]; - ulint ret; - - ut_ad(sess->client_waits); - ut_ad(mutex_own(&kernel_mutex)); - ut_ad(sess->state == SESS_ERROR); - ut_ad(!UT_LIST_GET_FIRST((sess->trx)->signals)); - - if (!sess->client_waits) { - /* Cannot send the error message now: leave the session to - the error state and send it later */ - - return; - } - - err_no = sess->err_no; - err_str = (byte*)sess->err_str; - err_len = sess->err_len; - - max_len = ut_min(SESS_ERR_BUF_SIZE, - com_endpoint_get_max_size(sess->endpoint)); - - sess_srv_msg_init(sess, buf, SESS_SRV_ERROR); - - if (err_len + SESS_SRV_MSG_DATA > max_len) { - - err_len = max_len - SESS_SRV_MSG_DATA; - } - - ut_memcpy(buf + SESS_SRV_MSG_DATA, err_str, err_len); - - ret = sess_srv_msg_send_low(sess, buf, SESS_SRV_MSG_DATA + err_len, - SESS_NOT_RELEASE_KERNEL); -} - -/************************************************************************* -Copies error info to a session. Sends to the transaction a signal which will -rollback the latest incomplete SQL statement and then send the error message -to the client. NOTE: This function will take care of the freeing of the error -string, thus the caller must supply a copy of the error string. */ -static -void -sess_error_low( -/*===========*/ - sess_t* sess, /* in: session object */ - ulint err_no, /* in: error number */ - char* err_str)/* in, own: error string or NULL; - NOTE: the function will take care of freeing of the - string! */ -{ - ut_ad(mutex_own(&kernel_mutex)); - - UT_DULINT_INC(sess->error_count); - - printf("Error string::: %s\n", err_str); - - if (sess->state == SESS_ERROR) { - /* Ignore the error because the session is already in the - error state */ - - if (err_str) { - mem_free(err_str); - } - - return; - } - - sess->err_no = err_no; - - if (sess->err_str) { - mem_free(sess->err_str); - } - - sess->err_str = err_str; - sess->err_len = ut_strlen(err_str); - sess->state = SESS_ERROR; - - if (sess->big_msg) { - - mem_free(sess->big_msg); - } - - /* Send a signal which will roll back the latest incomplete SQL - statement: the error message will be sent to the client by the error - handling mechanism after the rollback is completed. */ - - trx_sig_send(sess->trx, TRX_SIG_ERROR_OCCURRED, TRX_SIG_SELF, FALSE, - NULL, NULL, NULL); -} - -/*************************************************************************** -When a command has been completed, this function sends the message about it -to the client. */ - -void -sess_command_completed_message( -/*===========================*/ - sess_t* sess, /* in: session */ - byte* msg, /* in: message buffer */ - ulint len) /* in: message data length */ -{ - mutex_enter(&kernel_mutex); - - sess_srv_msg_send(sess, msg, SESS_SRV_MSG_DATA + len, - SESS_RELEASE_KERNEL); - mutex_exit(&kernel_mutex); -} From 7e5a43af8521f0ca6cc16d27485800b4e60bd178 Mon Sep 17 00:00:00 2001 From: "Sinisa@sinisa.nasamreza.org" <> Date: Thu, 11 Mar 2004 15:35:08 +0200 Subject: [PATCH 44/65] mysqldump.c: reverting fix --- client/mysqldump.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/client/mysqldump.c b/client/mysqldump.c index a96f24dc97b..f93c791564e 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -78,7 +78,7 @@ static my_bool verbose=0,tFlag=0,cFlag=0,dFlag=0,quick=0, extended_insert = 0, opt_alldbs=0,opt_create_db=0,opt_first_slave=0, opt_autocommit=0,opt_master_data,opt_disable_keys=0,opt_xml=0, opt_delete_master_logs=0, tty_password=0, - opt_single_transaction=0, opt_comments= 0, opt_local_infile= 0; + opt_single_transaction=0, opt_comments= 0; static MYSQL mysql_connection,*sock=0; static char insert_pat[12 * 1024],*opt_password=0,*current_user=0, *current_host=0,*path=0,*fields_terminated=0, @@ -170,9 +170,6 @@ static struct my_option my_long_options[] = {"lines-terminated-by", OPT_LTB, "Lines in the i.file are terminated by ...", (gptr*) &lines_terminated, (gptr*) &lines_terminated, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"local-infile", OPT_LOCAL_INFILE, "Enable/disable LOAD DATA LOCAL INFILE.", - (gptr*) &opt_local_infile, - (gptr*) &opt_local_infile, 0, GET_BOOL, OPT_ARG, 0, 0, 0, 0, 0, 0}, {"lock-tables", 'l', "Lock all tables for read.", (gptr*) &lock_tables, (gptr*) &lock_tables, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"master-data", OPT_MASTER_DATA, From 3b5a46939f0634fc640c7278af50b78dfdf43cb9 Mon Sep 17 00:00:00 2001 From: "jani@ua72d24.elisa.omakaista.fi" <> Date: Thu, 11 Mar 2004 15:41:07 +0200 Subject: [PATCH 45/65] Small fixes. --- client/mysqlbinlog.cc | 5 +++-- sql/set_var.cc | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc index 9d9a414ad02..72f68f9fe86 100644 --- a/client/mysqlbinlog.cc +++ b/client/mysqlbinlog.cc @@ -306,6 +306,7 @@ int process_event(ulonglong *rec_count, char *last_db, Log_event *ev, my_off_t pos, int old_format) { char ll_buff[21]; + if ((*rec_count) >= offset) { if (!short_form) @@ -566,8 +567,6 @@ static MYSQL* safe_connect() if(!local_mysql) die("Failed on mysql_init"); - mysql_options(local_mysql, MYSQL_INIT_COMMAND, - "/*!32210 SET @@session.max_insert_delayed_threads=0*/"); if (!mysql_real_connect(local_mysql, host, user, pass, 0, port, sock, 0)) die("failed on connect: %s", mysql_error(local_mysql)); @@ -952,6 +951,8 @@ int main(int argc, char** argv) load_processor.init_by_cur_dir(); exit_value= 0; + fprintf(result_file, + "/*!40001 SET @@session.max_insert_delayed_threads=0*/;\n"); while (--argc >= 0) { if (dump_log_entries(*(argv++))) diff --git a/sql/set_var.cc b/sql/set_var.cc index b9229abfcc4..51ea6047794 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -550,6 +550,8 @@ struct show_var_st init_vars[]= { {sys_max_connections.name, (char*) &sys_max_connections, SHOW_SYS}, {sys_max_connect_errors.name, (char*) &sys_max_connect_errors, SHOW_SYS}, {sys_max_delayed_threads.name,(char*) &sys_max_delayed_threads, SHOW_SYS}, + {sys_max_insert_delayed_threads.name, + (char*) &sys_max_insert_delayed_threads, SHOW_SYS}, {sys_max_heap_table_size.name,(char*) &sys_max_heap_table_size, SHOW_SYS}, {sys_max_join_size.name, (char*) &sys_max_join_size, SHOW_SYS}, {sys_max_relay_log_size.name, (char*) &sys_max_relay_log_size, SHOW_SYS}, From fffb747ec853e6ee55f5de80d60cef3fa17430ec Mon Sep 17 00:00:00 2001 From: "marko@hundin.mysql.fi" <> Date: Thu, 11 Mar 2004 16:29:16 +0200 Subject: [PATCH 46/65] Remove libcom.a from acinclude.m4 (should have been done in ChangeSet 1.1741) --- acinclude.m4 | 1 - 1 file changed, 1 deletion(-) diff --git a/acinclude.m4 b/acinclude.m4 index 499887b8065..469b7cef6dd 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -1231,7 +1231,6 @@ dnl circular references. \$(top_builddir)/innobase/page/libpage.a\ \$(top_builddir)/innobase/rem/librem.a\ \$(top_builddir)/innobase/thr/libthr.a\ - \$(top_builddir)/innobase/com/libcom.a\ \$(top_builddir)/innobase/sync/libsync.a\ \$(top_builddir)/innobase/data/libdata.a\ \$(top_builddir)/innobase/mach/libmach.a\ From 5aeab393af619c309b0f5fa9beef164e1de60402 Mon Sep 17 00:00:00 2001 From: "marko@hundin.mysql.fi" <> Date: Thu, 11 Mar 2004 16:36:19 +0200 Subject: [PATCH 47/65] Remove remaining references to the built-in ODBC driver of InnoDB --- innobase/include/Makefile.am | 4 +- innobase/include/ib_odbc.h | 149 -------------------- innobase/include/odbc0odbc.h | 20 --- innobase/include/pars0pars.h | 31 +---- innobase/pars/pars0pars.c | 258 +++-------------------------------- innobase/srv/srv0srv.c | 1 - 6 files changed, 28 insertions(+), 435 deletions(-) delete mode 100644 innobase/include/ib_odbc.h delete mode 100644 innobase/include/odbc0odbc.h diff --git a/innobase/include/Makefile.am b/innobase/include/Makefile.am index 813cf80d0af..2584357e24a 100644 --- a/innobase/include/Makefile.am +++ b/innobase/include/Makefile.am @@ -25,13 +25,13 @@ noinst_HEADERS = btr0btr.h btr0btr.ic btr0cur.h btr0cur.ic \ dict0mem.ic dict0types.h dyn0dyn.h dyn0dyn.ic eval0eval.h \ eval0eval.ic eval0proc.h eval0proc.ic fil0fil.h fsp0fsp.h \ fsp0fsp.ic fut0fut.h fut0fut.ic fut0lst.h fut0lst.ic \ - ha0ha.h ha0ha.ic hash0hash.h hash0hash.ic ib_odbc.h \ + ha0ha.h ha0ha.ic hash0hash.h hash0hash.ic \ ibuf0ibuf.h ibuf0ibuf.ic ibuf0types.h lock0lock.h \ lock0lock.ic lock0types.h log0log.h log0log.ic log0recv.h \ log0recv.ic mach0data.h mach0data.ic makefilewin.i \ mem0dbg.h mem0dbg.ic mem0mem.h mem0mem.ic mem0pool.h \ mem0pool.ic mtr0log.h mtr0log.ic mtr0mtr.h mtr0mtr.ic \ - mtr0types.h odbc0odbc.h os0file.h os0proc.h os0proc.ic \ + mtr0types.h os0file.h os0proc.h os0proc.ic \ os0shm.h os0shm.ic os0sync.h os0sync.ic os0thread.h \ os0thread.ic page0cur.h page0cur.ic page0page.h \ page0page.ic page0types.h pars0grm.h pars0opt.h \ diff --git a/innobase/include/ib_odbc.h b/innobase/include/ib_odbc.h deleted file mode 100644 index 86884b41d39..00000000000 --- a/innobase/include/ib_odbc.h +++ /dev/null @@ -1,149 +0,0 @@ -/****************************************************** -Innobase ODBC client library header; this is equivalent to -the standard sql.h ODBC header file - -(c) 1998 Innobase Oy - -Created 2/22/1998 Heikki Tuuri -*******************************************************/ - -#ifndef ib_odbc_h -#define ib_odbc_h - -typedef unsigned char UCHAR; -typedef signed char SCHAR; -typedef long int SDWORD; -typedef short int SWORD; -typedef unsigned long int UDWORD; -typedef unsigned short int UWORD; - -typedef void* PTR; - -typedef void* HENV; -typedef void* HDBC; -typedef void* HSTMT; - -typedef signed short RETCODE; - -/* RETCODEs */ -#define SQL_NO_DATA_FOUND (-3) -#define SQL_INVALID_HANDLE (-2) -#define SQL_ERROR (-1) -#define SQL_SUCCESS 0 - -/* Standard SQL datatypes, using ANSI type numbering */ -#define SQL_CHAR 1 -#define SQL_INTEGER 4 -#define SQL_VARCHAR 12 - -/* C datatype to SQL datatype mapping */ -#define SQL_C_CHAR SQL_CHAR -#define SQL_C_LONG SQL_INTEGER - -/* Special length value */ -#define SQL_NULL_DATA (-1) - -#define SQL_PARAM_INPUT 1 -#define SQL_PARAM_OUTPUT 4 - -/* Null handles */ -#define SQL_NULL_HENV NULL -#define SQL_NULL_HDBC NULL -#define SQL_NULL_HSTM NULL - - -/************************************************************************** -Allocates an SQL environment. */ - -RETCODE -SQLAllocEnv( -/*========*/ - /* out: SQL_SUCCESS */ - HENV* phenv); /* out: pointer to an environment handle */ -/************************************************************************** -Allocates an SQL connection. */ - -RETCODE -SQLAllocConnect( -/*============*/ - /* out: SQL_SUCCESS */ - HENV henv, /* in: pointer to an environment handle */ - HDBC* phdbc); /* out: pointer to a connection handle */ -/************************************************************************** -Allocates an SQL statement. */ - -RETCODE -SQLAllocStmt( -/*=========*/ - HDBC hdbc, /* in: SQL connection */ - HSTMT* phstmt); /* out: pointer to a statement handle */ -/************************************************************************** -Connects to a database server process (establishes a connection and a -session). */ - -RETCODE -SQLConnect( -/*=======*/ - /* out: SQL_SUCCESS */ - HDBC hdbc, /* in: SQL connection handle */ - UCHAR* szDSN, /* in: data source name (server name) */ - SWORD cbDSN, /* in: data source name length */ - UCHAR* szUID, /* in: user name */ - SWORD cbUID, /* in: user name length */ - UCHAR* szAuthStr, /* in: password */ - SWORD cbAuthStr); /* in: password length */ -/************************************************************************** -Makes the server to parse and optimize an SQL string. */ - -RETCODE -SQLPrepare( -/*=======*/ - /* out: SQL_SUCCESS */ - HSTMT hstmt, /* in: statement handle */ - UCHAR* szSqlStr, /* in: SQL string */ - SDWORD cbSqlStr); /* in: SQL string length */ -/************************************************************************** -Binds a parameter in a prepared statement. */ - -RETCODE -SQLBindParameter( -/*=============*/ - /* out: SQL_SUCCESS */ - HSTMT hstmt, /* in: statement handle */ - UWORD ipar, /* in: parameter index, starting from 1 */ - SWORD fParamType, /* in: SQL_PARAM_INPUT or SQL_PARAM_OUTPUT */ - SWORD fCType, /* in: SQL_C_CHAR, ... */ - SWORD fSqlType, /* in: SQL_CHAR, ... */ - UDWORD cbColDef, /* in: precision: ignored */ - SWORD ibScale, /* in: scale: ignored */ - PTR rgbValue, /* in: pointer to a buffer for the data */ - SDWORD cbValueMax, /* in: buffer size */ - SDWORD* pcbValue); /* in: pointer to a buffer for the data - length or SQL_NULL_DATA */ -/************************************************************************** -Executes a prepared statement where all parameters have been bound. */ - -RETCODE -SQLExecute( -/*=======*/ - /* out: SQL_SUCCESS or SQL_ERROR */ - HSTMT hstmt); /* in: statement handle */ -/************************************************************************** -Queries an error message. */ - -RETCODE -SQLError( -/*=====*/ - /* out: SQL_SUCCESS or SQL_NO_DATA_FOUND */ - HENV henv, /* in: SQL_NULL_HENV */ - HDBC hdbc, /* in: SQL_NULL_HDBC */ - HSTMT hstmt, /* in: statement handle */ - UCHAR* szSqlState, /* in/out: SQLSTATE as a null-terminated string, - (currently, always == "S1000") */ - SDWORD* pfNativeError, /* out: native error code */ - UCHAR* szErrorMsg, /* in/out: buffer for an error message as a - null-terminated string */ - SWORD cbErrorMsgMax, /* in: buffer size for szErrorMsg */ - SWORD* pcbErrorMsg); /* out: error message length */ - -#endif diff --git a/innobase/include/odbc0odbc.h b/innobase/include/odbc0odbc.h deleted file mode 100644 index 7f842b54b27..00000000000 --- a/innobase/include/odbc0odbc.h +++ /dev/null @@ -1,20 +0,0 @@ -/****************************************************** -Innobase ODBC client library additional header - -(c) 1998 Innobase Oy - -Created 2/22/1998 Heikki Tuuri -*******************************************************/ - -#ifndef odbc0odbc_h -#define odbc0odbc_h - -#include "ib_odbc.h" - -/* Datagram size in communications */ -#define ODBC_DATAGRAM_SIZE 8192 - -/* Communication address maximum length in bytes */ -#define ODBC_ADDRESS_SIZE COM_MAX_ADDR_LEN - -#endif diff --git a/innobase/include/pars0pars.h b/innobase/include/pars0pars.h index e08b071e246..8ff226ebbd0 100644 --- a/innobase/include/pars0pars.h +++ b/innobase/include/pars0pars.h @@ -21,7 +21,9 @@ extern int yydebug; /* If the following is set TRUE, the lexer will print the SQL string as it tokenizes it */ +#ifdef UNIV_SQL_DEBUG extern ibool pars_print_lexed; +#endif /* UNIV_SQL_DEBUG */ /* Global variable used while parsing a single procedure or query : the code is NOT re-entrant */ @@ -390,41 +392,18 @@ pars_procedure_definition( table */ sym_node_t* param_list, /* in: parameter declaration list */ que_node_t* stat_list); /* in: statement list */ -/***************************************************************** -Reads stored procedure input parameter values from a buffer. */ -void -pars_proc_read_input_params_from_buf( -/*=================================*/ - que_t* graph, /* in: query graph which contains a stored procedure */ - byte* buf); /* in: buffer */ -/***************************************************************** -Writes stored procedure output parameter values to a buffer. */ - -ulint -pars_proc_write_output_params_to_buf( -/*=================================*/ - byte* buf, /* in: buffer which must be big enough */ - que_t* graph); /* in: query graph which contains a stored procedure */ /***************************************************************** Parses a stored procedure call, when this is not within another stored -procedure, that is, the client issues a procedure call directly. */ +procedure, that is, the client issues a procedure call directly. +In MySQL/InnoDB, stored InnoDB procedures are invoked via the +parsed procedure tree, not via InnoDB SQL, so this function is not used. */ que_fork_t* pars_stored_procedure_call( /*=======================*/ /* out: query graph */ sym_node_t* sym_node); /* in: stored procedure name */ -/***************************************************************** -Writes info about query parameter markers (denoted with '?' in ODBC) into a -buffer. */ - -ulint -pars_write_query_param_info( -/*========================*/ - /* out: number of bytes used for info in buf */ - byte* buf, /* in: buffer which must be big enough */ - que_fork_t* graph); /* in: parsed query graph */ /********************************************************************** Completes a query graph by adding query thread and fork nodes above it and prepares the graph for running. The fork created is of diff --git a/innobase/pars/pars0pars.c b/innobase/pars/pars0pars.c index 3e43b6ae262..5bbfca831f2 100644 --- a/innobase/pars/pars0pars.c +++ b/innobase/pars/pars0pars.c @@ -29,13 +29,14 @@ on 1/27/1998 */ #include "trx0trx.h" #include "trx0roll.h" #include "lock0lock.h" -#include "odbc0odbc.h" #include "eval0eval.h" +#ifdef UNIV_SQL_DEBUG /* If the following is set TRUE, the lexer will print the SQL string as it tokenizes it */ ibool pars_print_lexed = FALSE; +#endif /* UNIV_SQL_DEBUG */ /* Global variable used while parsing a single procedure or query : the code is NOT re-entrant */ @@ -389,7 +390,7 @@ pars_resolve_exp_variables_and_types( } if (!node) { - printf("PARSER ERROR: Unresolved identifier %s\n", + fprintf(stderr, "PARSER ERROR: Unresolved identifier %s\n", sym_node->name); } @@ -521,25 +522,6 @@ pars_resolve_exp_list_columns( } } -/************************************************************************* -Retrieves the stored procedure definition for a procedure name. */ -static -void -pars_retrieve_procedure_def( -/*========================*/ - sym_node_t* sym_node) /* in: procedure name node */ -{ - ut_a(sym_node); - ut_a(que_node_get_type(sym_node) == QUE_NODE_SYMBOL); - - sym_node->resolved = TRUE; - sym_node->token_type = SYM_PROCEDURE_NAME; - - sym_node->procedure_def = dict_procedure_get((char*)sym_node->name, - NULL); - ut_a(sym_node->procedure_def); -} - /************************************************************************* Retrieves the table definition for a table name id. */ static @@ -1662,218 +1644,21 @@ pars_procedure_definition( /***************************************************************** Parses a stored procedure call, when this is not within another stored -procedure, that is, the client issues a procedure call directly. */ +procedure, that is, the client issues a procedure call directly. +In MySQL/InnoDB, stored InnoDB procedures are invoked via the +parsed procedure tree, not via InnoDB SQL, so this function is not used. */ que_fork_t* pars_stored_procedure_call( /*=======================*/ /* out: query graph */ - sym_node_t* sym_node) /* in: stored procedure name */ + sym_node_t* sym_node __attribute__((unused))) + /* in: stored procedure name */ { - call_node_t* node; - que_fork_t* fork; - que_thr_t* thr; - mem_heap_t* heap; - - heap = pars_sym_tab_global->heap; - - fork = que_fork_create(NULL, NULL, QUE_FORK_PROCEDURE_CALL, heap); - fork->trx = NULL; - - thr = que_thr_create(fork, heap); - - node = mem_heap_alloc(heap, sizeof(call_node_t)); - - thr->child = node; - - node->common.type = QUE_NODE_CALL; - node->common.parent = thr; - - sym_node->token_type = SYM_PROCEDURE_NAME; - - pars_retrieve_procedure_def(sym_node); - - node->procedure_def = sym_node->procedure_def; - node->proc_name = sym_node; - - node->sym_tab = pars_sym_tab_global; - - pars_sym_tab_global->query_graph = fork; - - return(fork); + ut_error; + return(NULL); } -/***************************************************************** -Writes info about query parameter markers (denoted with '?' in ODBC) into a -buffer. */ - -ulint -pars_write_query_param_info( -/*========================*/ - /* out: number of bytes used for info in buf */ - byte* buf, /* in: buffer which must be big enough */ - que_fork_t* graph) /* in: parsed query graph */ -{ - que_thr_t* thr; - call_node_t* call_node; - dict_proc_t* procedure_def; - que_t* stored_graph; - proc_node_t* proc_node; - sym_node_t* param; - ulint n_params; - ibool is_input; - - /* We currently support parameter markers only in stored procedure - calls, and there ALL procedure parameters must be marked with '?': - no literal values are allowed */ - - thr = UT_LIST_GET_FIRST(graph->thrs); - - n_params = 0; - - if (que_node_get_type(thr->child) == QUE_NODE_CALL) { - call_node = thr->child; - - procedure_def = call_node->procedure_def; - - stored_graph = dict_procedure_reserve_parsed_copy( - procedure_def); - proc_node = que_fork_get_child(stored_graph); - - param = proc_node->param_list; - - while (param) { - if (param->param_type == PARS_INPUT) { - is_input = TRUE; - } else { - is_input = FALSE; - } - - mach_write_to_1(buf + 4 + n_params, is_input); - - n_params++; - - param = que_node_get_next(param); - } - - dict_procedure_release_parsed_copy(stored_graph); - } - - mach_write_to_4(buf, n_params); - - return(4 + n_params); -} - -/***************************************************************** -Reads stored procedure input parameter values from a buffer. */ - -void -pars_proc_read_input_params_from_buf( -/*=================================*/ - que_t* graph, /* in: query graph which contains a stored procedure */ - byte* buf) /* in: buffer */ -{ - que_thr_t* thr; - proc_node_t* proc_node; - sym_node_t* param; - byte* ptr; - ulint len; - lint odbc_len; - - ut_ad(graph->fork_type == QUE_FORK_PROCEDURE); - - thr = UT_LIST_GET_FIRST(graph->thrs); - - proc_node = thr->child; - - ptr = buf; - - param = proc_node->param_list; - - while (param) { - if (param->param_type == PARS_INPUT) { - odbc_len = (lint)mach_read_from_4(ptr); - - ptr += 4; - - if (odbc_len == SQL_NULL_DATA) { - len = UNIV_SQL_NULL; - } else { - len = (ulint)odbc_len; - } - - eval_node_copy_and_alloc_val(param, ptr, len); - - if (len != UNIV_SQL_NULL) { - ptr += len; - } - } - - param = que_node_get_next(param); - } - - ut_ad(ptr - buf < ODBC_DATAGRAM_SIZE); -} - -/***************************************************************** -Writes stored procedure output parameter values to a buffer. */ - -ulint -pars_proc_write_output_params_to_buf( -/*=================================*/ - /* out: bytes used in buf */ - byte* buf, /* in: buffer which must be big enough */ - que_t* graph) /* in: query graph which contains a stored procedure */ -{ - que_thr_t* thr; - proc_node_t* proc_node; - sym_node_t* param; - dfield_t* dfield; - byte* ptr; - ulint len; - lint odbc_len; - - ut_ad(graph->fork_type == QUE_FORK_PROCEDURE); - - thr = UT_LIST_GET_FIRST(graph->thrs); - - proc_node = thr->child; - - ptr = buf; - - param = proc_node->param_list; - - while (param) { - if (param->param_type == PARS_OUTPUT) { - dfield = que_node_get_val(param); - - len = dfield_get_len(dfield); - - if (len == UNIV_SQL_NULL) { - odbc_len = SQL_NULL_DATA; - } else { - odbc_len = (lint)len; - } - - mach_write_to_4(ptr, (ulint)odbc_len); - - ptr += 4; - - if (len != UNIV_SQL_NULL) { - ut_memcpy(ptr, dfield_get_data(dfield), len); - - ptr += len; - } - } - - param = que_node_get_next(param); - } - - ut_ad(ptr - buf < ODBC_DATAGRAM_SIZE); - - return((ulint)(ptr - buf)); -} - /***************************************************************** Retrieves characters to the lexical analyzer. */ @@ -1886,13 +1671,12 @@ pars_get_lex_chars( in the buffer */ { int len; - char print_buf[16]; len = pars_sym_tab_global->string_len - pars_sym_tab_global->next_char_pos; if (len == 0) { #ifdef YYDEBUG - /* printf("SQL string ends\n"); */ + /* fputs("SQL string ends\n", stderr); */ #endif *result = 0; @@ -1903,18 +1687,18 @@ pars_get_lex_chars( len = max_size; } +#ifdef UNIV_SQL_DEBUG if (pars_print_lexed) { if (len >= 5) { len = 5; } - - ut_memcpy(print_buf, pars_sym_tab_global->sql_string + - pars_sym_tab_global->next_char_pos, len); - print_buf[len] = '\0'; - - printf("%s", print_buf); + + fwrite(pars_sym_tab_global->sql_string + + pars_sym_tab_global->next_char_pos, + 1, len, stderr); } +#endif /* UNIV_SQL_DEBUG */ ut_memcpy(buf, pars_sym_tab_global->sql_string + pars_sym_tab_global->next_char_pos, len); @@ -1944,7 +1728,7 @@ yyerror( { ut_ad(s); - printf("PARSER ERROR: Syntax error in SQL string\n"); + fputs("PARSER ERROR: Syntax error in SQL string\n", stderr); ut_error; } @@ -1968,10 +1752,10 @@ pars_sql( heap = mem_heap_create(256); +#ifdef UNIV_SYNC_DEBUG /* Currently, the parser is not reentrant: */ - ut_ad(mutex_own(&(dict_sys->mutex))); - +#endif /* UNIV_SYNC_DEBUG */ pars_sym_tab_global = sym_tab_create(heap); len = ut_strlen(str); @@ -1996,7 +1780,7 @@ pars_sql( graph->sym_tab = pars_sym_tab_global; - /* printf("SQL graph size %lu\n", mem_heap_get_size(heap)); */ + /* fprintf(stderr, "SQL graph size %lu\n", mem_heap_get_size(heap)); */ return(graph); } diff --git a/innobase/srv/srv0srv.c b/innobase/srv/srv0srv.c index 065647ecb87..3daf0fe9767 100644 --- a/innobase/srv/srv0srv.c +++ b/innobase/srv/srv0srv.c @@ -37,7 +37,6 @@ Created 10/8/1995 Heikki Tuuri #include "que0que.h" #include "srv0que.h" #include "log0recv.h" -#include "odbc0odbc.h" #include "pars0pars.h" #include "usr0sess.h" #include "lock0lock.h" From cf287341cc4e418b5310f8882970ad32a00c728a Mon Sep 17 00:00:00 2001 From: "guilhem@mysql.com" <> Date: Thu, 11 Mar 2004 16:23:35 +0100 Subject: [PATCH 48/65] Fix for BUG#2921 "Replication problem on mutex lock in mySQL-4.0.18": re-using unused LOCK_active_mi to serialize all administrative commands related to replication: START SLAVE, STOP SLAVE, RESET SLAVE, CHANGE MASTER, init_slave() (replication autostart at server startup), end_slave() (replication autostop at server shutdown), LOAD DATA FROM MASTER. This protects us against a handful of deadlocks (like BUG#2921 when two START SLAVE, but when two STOP SLAVE too). Removing unused variables. --- sql/item_func.cc | 2 -- sql/repl_failsafe.cc | 8 ++++---- sql/set_var.cc | 8 ++++---- sql/slave.cc | 21 +++++++++++++++++---- sql/slave.h | 36 ++++++++++++++++-------------------- sql/sql_parse.cc | 28 ++++++++++++++-------------- sql/sql_show.cc | 4 ++-- 7 files changed, 57 insertions(+), 50 deletions(-) diff --git a/sql/item_func.cc b/sql/item_func.cc index 656dff63609..ab96915e746 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -1543,13 +1543,11 @@ longlong Item_master_pos_wait::val_int() } longlong pos = args[1]->val_int(); longlong timeout = (arg_count==3) ? args[2]->val_int() : 0 ; - LOCK_ACTIVE_MI; if ((event_count = active_mi->rli.wait_for_pos(thd, log_name, pos, timeout)) == -2) { null_value = 1; event_count=0; } - UNLOCK_ACTIVE_MI; return event_count; } diff --git a/sql/repl_failsafe.cc b/sql/repl_failsafe.cc index 56789a01bf4..e687b227946 100644 --- a/sql/repl_failsafe.cc +++ b/sql/repl_failsafe.cc @@ -750,7 +750,7 @@ int load_master_data(THD* thd) We do not want anyone messing with the slave at all for the entire duration of the data load. */ - LOCK_ACTIVE_MI; + pthread_mutex_lock(&LOCK_active_mi); lock_slave_threads(active_mi); init_thread_mask(&restart_thread_mask,active_mi,0 /*not inverse*/); if (restart_thread_mask && @@ -759,7 +759,7 @@ int load_master_data(THD* thd) { send_error(&thd->net,error); unlock_slave_threads(active_mi); - UNLOCK_ACTIVE_MI; + pthread_mutex_unlock(&LOCK_active_mi); return 1; } @@ -913,7 +913,7 @@ int load_master_data(THD* thd) { send_error(&thd->net, 0, "Failed purging old relay logs"); unlock_slave_threads(active_mi); - UNLOCK_ACTIVE_MI; + pthread_mutex_unlock(&LOCK_active_mi); return 1; } pthread_mutex_lock(&active_mi->rli.data_lock); @@ -934,7 +934,7 @@ int load_master_data(THD* thd) err: unlock_slave_threads(active_mi); - UNLOCK_ACTIVE_MI; + pthread_mutex_unlock(&LOCK_active_mi); thd->proc_info = 0; mc_mysql_close(&mysql); // safe to call since we always do mc_mysql_init() diff --git a/sql/set_var.cc b/sql/set_var.cc index b9229abfcc4..b28b6cda23e 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -1271,7 +1271,7 @@ byte *sys_var_insert_id::value_ptr(THD *thd, enum_var_type type) bool sys_var_slave_skip_counter::check(THD *thd, set_var *var) { int result= 0; - LOCK_ACTIVE_MI; + pthread_mutex_lock(&LOCK_active_mi); pthread_mutex_lock(&active_mi->rli.run_lock); if (active_mi->rli.slave_running) { @@ -1279,14 +1279,14 @@ bool sys_var_slave_skip_counter::check(THD *thd, set_var *var) result=1; } pthread_mutex_unlock(&active_mi->rli.run_lock); - UNLOCK_ACTIVE_MI; + pthread_mutex_unlock(&LOCK_active_mi); return result; } bool sys_var_slave_skip_counter::update(THD *thd, set_var *var) { - LOCK_ACTIVE_MI; + pthread_mutex_lock(&LOCK_active_mi); pthread_mutex_lock(&active_mi->rli.run_lock); /* The following test should normally never be true as we test this @@ -1300,7 +1300,7 @@ bool sys_var_slave_skip_counter::update(THD *thd, set_var *var) pthread_mutex_unlock(&active_mi->rli.data_lock); } pthread_mutex_unlock(&active_mi->rli.run_lock); - UNLOCK_ACTIVE_MI; + pthread_mutex_unlock(&LOCK_active_mi); return 0; } diff --git a/sql/slave.cc b/sql/slave.cc index 84f4ff4f3e0..30052e874b3 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -34,7 +34,6 @@ typedef bool (*CHECK_KILLED_FUNC)(THD*,void*); volatile bool slave_sql_running = 0, slave_io_running = 0; char* slave_load_tmpdir = 0; MASTER_INFO *active_mi; -volatile int active_mi_in_use = 0; HASH replicate_do_table, replicate_ignore_table; DYNAMIC_ARRAY replicate_wild_do_table, replicate_wild_ignore_table; bool do_table_inited = 0, ignore_table_inited = 0; @@ -114,8 +113,12 @@ int init_slave() { DBUG_ENTER("init_slave"); - /* This is called when mysqld starts */ - + /* + This is called when mysqld starts. Before client connections are + accepted. However bootstrap may conflict with us if it does START SLAVE. + So it's safer to take the lock. + */ + pthread_mutex_lock(&LOCK_active_mi); /* TODO: re-write this to interate through the list of files for multi-master @@ -160,9 +163,11 @@ int init_slave() goto err; } } + pthread_mutex_unlock(&LOCK_active_mi); DBUG_RETURN(0); err: + pthread_mutex_unlock(&LOCK_active_mi); DBUG_RETURN(1); } @@ -806,7 +811,14 @@ static int end_slave_on_walk(MASTER_INFO* mi, gptr /*unused*/) void end_slave() { - /* This is called when the server terminates, in close_connections(). */ + /* + This is called when the server terminates, in close_connections(). + It terminates slave threads. However, some CHANGE MASTER etc may still be + running presently. If a START SLAVE was in progress, the mutex lock below + will make us wait until slave threads have started, and START SLAVE + returns, then we terminate them here. + */ + pthread_mutex_lock(&LOCK_active_mi); if (active_mi) { /* @@ -827,6 +839,7 @@ void end_slave() delete active_mi; active_mi= 0; } + pthread_mutex_unlock(&LOCK_active_mi); } diff --git a/sql/slave.h b/sql/slave.h index 9877582d094..4a6389e9f87 100644 --- a/sql/slave.h +++ b/sql/slave.h @@ -27,12 +27,19 @@ /* MUTEXES in replication: - LOCK_active_mi: this is meant for multimaster, when we can switch from a - master to another. It protects active_mi. We don't care of it for the moment, - as active_mi never moves (it's created at startup and deleted at shutdown, and - not changed: it always points to the same MASTER_INFO struct), because we - don't have multimaster. So for the moment, mi does not move, and mi->rli does - not either. + LOCK_active_mi: [note: this was originally meant for multimaster, to switch + from a master to another, to protect active_mi] It is used to SERIALIZE ALL + administrative commands of replication: START SLAVE, STOP SLAVE, CHANGE + MASTER, RESET SLAVE, end_slave() (when mysqld stops) [init_slave() does not + need it it's called early]. Any of these commands holds the mutex from the + start till the end. This thus protects us against a handful of deadlocks + (consider start_slave_thread() which, when starting the I/O thread, releases + mi->run_lock, keeps rli->run_lock, and tries to re-acquire mi->run_lock). + + Currently active_mi never moves (it's created at startup and deleted at + shutdown, and not changed: it always points to the same MASTER_INFO struct), + because we don't have multimaster. So for the moment, mi does not move, and + mi->rli does not either. In MASTER_INFO: run_lock, data_lock run_lock protects all information about the run state: slave_running, and the @@ -43,6 +50,9 @@ In RELAY_LOG_INFO: run_lock, data_lock see MASTER_INFO + Order of acquisition: if you want to have LOCK_active_mi and a run_lock, you + must acquire LOCK_active_mi first. + In MYSQL_LOG: LOCK_log, LOCK_index of the binlog and the relay log LOCK_log: when you write to it. LOCK_index: when you create/delete a binlog (so that you have to update the .index file). @@ -64,19 +74,6 @@ enum enum_binlog_formats { BINLOG_FORMAT_323_LESS_57, BINLOG_FORMAT_323_GEQ_57 }; -/* - TODO: this needs to be redone, but for now it does not matter since - we do not have multi-master yet. -*/ - -#define LOCK_ACTIVE_MI { pthread_mutex_lock(&LOCK_active_mi); \ - ++active_mi_in_use; \ - pthread_mutex_unlock(&LOCK_active_mi);} - -#define UNLOCK_ACTIVE_MI { pthread_mutex_lock(&LOCK_active_mi); \ - --active_mi_in_use; \ - pthread_mutex_unlock(&LOCK_active_mi); } - /* st_relay_log_info contains information on the current relay log and relay log offset, and master log name and log sequence corresponding to the @@ -441,7 +438,6 @@ extern "C" pthread_handler_decl(handle_slave_io,arg); extern "C" pthread_handler_decl(handle_slave_sql,arg); extern bool volatile abort_loop; extern MASTER_INFO main_mi, *active_mi; /* active_mi for multi-master */ -extern volatile int active_mi_in_use; extern LIST master_list; extern HASH replicate_do_table, replicate_ignore_table; extern DYNAMIC_ARRAY replicate_wild_do_table, replicate_wild_ignore_table; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index bc69f7136ad..88af18491ec 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1519,9 +1519,9 @@ mysql_execute_command(void) { if (check_global_access(thd, SUPER_ACL)) goto error; - LOCK_ACTIVE_MI; + pthread_mutex_lock(&LOCK_active_mi); res = change_master(thd,active_mi); - UNLOCK_ACTIVE_MI; + pthread_mutex_unlock(&LOCK_active_mi); break; } case SQLCOM_SHOW_SLAVE_STAT: @@ -1529,9 +1529,9 @@ mysql_execute_command(void) /* Accept one of two privileges */ if (check_global_access(thd, SUPER_ACL | REPL_CLIENT_ACL)) goto error; - LOCK_ACTIVE_MI; + pthread_mutex_lock(&LOCK_active_mi); res = show_master_info(thd,active_mi); - UNLOCK_ACTIVE_MI; + pthread_mutex_unlock(&LOCK_active_mi); break; } case SQLCOM_SHOW_MASTER_STAT: @@ -1581,7 +1581,7 @@ mysql_execute_command(void) if (error) goto error; } - LOCK_ACTIVE_MI; + pthread_mutex_lock(&LOCK_active_mi); /* fetch_master_table will send the error to the client on failure. Give error if the table already exists. @@ -1591,7 +1591,7 @@ mysql_execute_command(void) { send_ok(&thd->net); } - UNLOCK_ACTIVE_MI; + pthread_mutex_unlock(&LOCK_active_mi); break; } #endif /* HAVE_REPLICATION */ @@ -1702,9 +1702,9 @@ mysql_execute_command(void) #ifdef HAVE_REPLICATION case SQLCOM_SLAVE_START: { - LOCK_ACTIVE_MI; + pthread_mutex_lock(&LOCK_active_mi); start_slave(thd,active_mi,1 /* net report*/); - UNLOCK_ACTIVE_MI; + pthread_mutex_unlock(&LOCK_active_mi); break; } case SQLCOM_SLAVE_STOP: @@ -1727,9 +1727,9 @@ mysql_execute_command(void) break; } { - LOCK_ACTIVE_MI; + pthread_mutex_lock(&LOCK_active_mi); stop_slave(thd,active_mi,1/* net report*/); - UNLOCK_ACTIVE_MI; + pthread_mutex_unlock(&LOCK_active_mi); break; } #endif /* HAVE_REPLICATION */ @@ -3638,9 +3638,9 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables) mysql_update_log.new_file(1); mysql_bin_log.new_file(1); mysql_slow_log.new_file(1); - LOCK_ACTIVE_MI; + pthread_mutex_lock(&LOCK_active_mi); rotate_relay_log(active_mi); - UNLOCK_ACTIVE_MI; + pthread_mutex_unlock(&LOCK_active_mi); if (ha_flush_logs()) result=1; @@ -3685,7 +3685,7 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables) #endif if (options & REFRESH_SLAVE) { - LOCK_ACTIVE_MI; + pthread_mutex_lock(&LOCK_active_mi); if (reset_slave(thd, active_mi)) { result=1; @@ -3697,7 +3697,7 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables) */ error_already_sent=1; } - UNLOCK_ACTIVE_MI; + pthread_mutex_unlock(&LOCK_active_mi); } if (options & REFRESH_USER_RESOURCES) reset_mqh(thd,(LEX_USER *) NULL); diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 3d727a33173..63f3afab128 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1270,11 +1270,11 @@ int mysqld_show(THD *thd, const char *wild, show_var_st *variables, #ifdef HAVE_REPLICATION case SHOW_SLAVE_RUNNING: { - LOCK_ACTIVE_MI; + pthread_mutex_lock(&LOCK_active_mi); net_store_data(&packet2, (active_mi->slave_running && active_mi->rli.slave_running) ? "ON" : "OFF"); - UNLOCK_ACTIVE_MI; + pthread_mutex_unlock(&LOCK_active_mi); break; } #endif From 69517b22a1c0aef30e67d84a9c5d12918584507b Mon Sep 17 00:00:00 2001 From: "guilhem@mysql.com" <> Date: Thu, 11 Mar 2004 17:38:19 +0100 Subject: [PATCH 49/65] Fix for BUG#2983 "If statement was killed on master, slave errors despite replicate-wild-ignore-t" We introduce a new function mysql_test_parse_for_slave(). If the slave sees that the query got a really bad error on master (killed e.g.), then it calls this function to know if this query can be ignored because of replicate-*-table rules (do not worry about replicate-*-db rules: they are checked so early that they have no bug). If the answer is yes, it skips the query and continues. If it's no, then it stops and say "fix your slave data manually" (like it did before this change). --- mysql-test/r/rpl_error_ignored_table.result | 25 +++ .../t/rpl_error_ignored_table-slave.opt | 2 +- mysql-test/t/rpl_error_ignored_table.test | 30 ++++ sql/log_event.cc | 159 ++++++++++-------- sql/mysql_priv.h | 1 + sql/slave.cc | 7 - sql/sql_parse.cc | 43 ++++- 7 files changed, 182 insertions(+), 85 deletions(-) diff --git a/mysql-test/r/rpl_error_ignored_table.result b/mysql-test/r/rpl_error_ignored_table.result index e1486220542..0e7ac72041c 100644 --- a/mysql-test/r/rpl_error_ignored_table.result +++ b/mysql-test/r/rpl_error_ignored_table.result @@ -13,3 +13,28 @@ Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Lo show tables like 't1'; Tables_in_test (t1) drop table t1; +select get_lock('crash_lock%20C', 10); +get_lock('crash_lock%20C', 10) +1 +create table t2 (a int primary key); +insert into t2 values(1); +create table t3 (id int); +insert into t3 values(connection_id()); + update t2 set a = a + 1 + get_lock('crash_lock%20C', 10); +select (@id := id) - id from t3; +(@id := id) - id +0 +kill @id; +drop table t2,t3; +Server shutdown in progress +show binlog events from 79; +Log_name Pos Event_type Server_id Orig_log_pos Info +master-bin.001 79 Query 1 79 use `test`; create table t1 (a int primary key) +master-bin.001 149 Query 1 149 use `test`; insert into t1 values (1),(1) +master-bin.001 213 Query 1 213 use `test`; drop table t1 +master-bin.001 261 Query 1 261 use `test`; create table t2 (a int primary key) +master-bin.001 331 Query 1 331 use `test`; insert into t2 values(1) +master-bin.001 390 Query 1 390 use `test`; create table t3 (id int) +master-bin.001 449 Query 1 449 use `test`; insert into t3 values(connection_id()) +master-bin.001 522 Query 1 522 use `test`; update t2 set a = a + 1 + get_lock('crash_lock%20C', 10) +master-bin.001 613 Query 1 613 use `test`; drop table t2,t3 diff --git a/mysql-test/t/rpl_error_ignored_table-slave.opt b/mysql-test/t/rpl_error_ignored_table-slave.opt index 0d3485f9e25..cb49119bfcb 100644 --- a/mysql-test/t/rpl_error_ignored_table-slave.opt +++ b/mysql-test/t/rpl_error_ignored_table-slave.opt @@ -1 +1 @@ ---replicate-ignore-table=test.t1 +--replicate-ignore-table=test.t1 --replicate-ignore-table=test.t2 --replicate-ignore-table=test.t3 diff --git a/mysql-test/t/rpl_error_ignored_table.test b/mysql-test/t/rpl_error_ignored_table.test index 686472433eb..c308d430f74 100644 --- a/mysql-test/t/rpl_error_ignored_table.test +++ b/mysql-test/t/rpl_error_ignored_table.test @@ -23,3 +23,33 @@ drop table t1; save_master_pos; connection slave; sync_with_master; + +# Now test that even critical errors (connection killed) +# are ignored if rules allow it. +# The "kill" idea was copied from rpl000001.test. + +connection master1; +select get_lock('crash_lock%20C', 10); + +connection master; +create table t2 (a int primary key); +insert into t2 values(1); +create table t3 (id int); +insert into t3 values(connection_id()); +send update t2 set a = a + 1 + get_lock('crash_lock%20C', 10); + +connection master1; +sleep 2; +select (@id := id) - id from t3; +kill @id; +drop table t2,t3; +connection master; +--error 1053; +reap; +connection master1; +show binlog events from 79; +save_master_pos; +connection slave; +# SQL slave thread should not have stopped (because table of the killed +# query is in the ignore list). +sync_with_master; diff --git a/sql/log_event.cc b/sql/log_event.cc index d2957165e77..a484123b4c7 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -53,6 +53,14 @@ static void pretty_print_str(FILE* file, char* str, int len) #ifndef MYSQL_CLIENT +static void clear_all_errors(THD *thd, struct st_relay_log_info *rli) +{ + thd->query_error = 0; + thd->clear_error(); + *rli->last_slave_error = 0; + rli->last_slave_errno = 0; +} + inline int ignored_error_code(int err_code) { return ((err_code == ER_SLAVE_IGNORED_TABLE) || @@ -1803,8 +1811,7 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli) #else rli->future_group_master_log_pos= log_pos; #endif - thd->query_error= 0; // clear error - thd->clear_error(); + clear_all_errors(thd, rli); if (db_ok(thd->db, replicate_do_db, replicate_ignore_db)) { @@ -1817,84 +1824,93 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli) VOID(pthread_mutex_unlock(&LOCK_thread_count)); thd->slave_proxy_id = thread_id; // for temp tables - /* - Sanity check to make sure the master did not get a really bad - error on the query. - */ - if (ignored_error_code((expected_error = error_code)) || - !check_expected_error(thd,rli,expected_error)) - { - mysql_log.write(thd,COM_QUERY,"%s",thd->query); - DBUG_PRINT("query",("%s",thd->query)); + mysql_log.write(thd,COM_QUERY,"%s",thd->query); + DBUG_PRINT("query",("%s",thd->query)); + if (ignored_error_code(expected_error = error_code) || + !check_expected_error(thd,rli,expected_error)) mysql_parse(thd, thd->query, q_len); - + else + { /* - Set a flag if we are inside an transaction so that we can restart - the transaction from the start if we are killed - - This will only be done if we are supporting transactional tables - in the slave. + The query got a really bad error on the master (thread killed etc), + which could be inconsistent. Parse it to test the table names: if the + replicate-*-do|ignore-table rules say "this query must be ignored" then + we exit gracefully; otherwise we warn about the bad error and tell DBA + to check/fix it. */ - if (!strcmp(thd->query,"BEGIN")) - rli->inside_transaction= opt_using_transactions; - else if (!(strcmp(thd->query,"COMMIT") && strcmp(thd->query,"ROLLBACK"))) - rli->inside_transaction=0; - - /* - If we expected a non-zero error code, and we don't get the same error - code, and none of them should be ignored. - */ - if ((expected_error != (actual_error = thd->net.last_errno)) && - expected_error && - !ignored_error_code(actual_error) && - !ignored_error_code(expected_error)) + if (mysql_test_parse_for_slave(thd, thd->query, q_len)) + /* Can ignore query */ + clear_all_errors(thd, rli); + else { - slave_print_error(rli, 0, - "\ + slave_print_error(rli,expected_error, + "query '%s' partially completed on the master \ +(error on master: %d) \ +and was aborted. There is a chance that your master is inconsistent at this \ +point. If you are sure that your master is ok, run this query manually on the\ + slave and then restart the slave with SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;\ + START SLAVE; .", thd->query, expected_error); + thd->query_error= 1; + } + goto end; + } + + /* + Set a flag if we are inside an transaction so that we can restart + the transaction from the start if we are killed + + This will only be done if we are supporting transactional tables + in the slave. + */ + if (!strcmp(thd->query,"BEGIN")) + rli->inside_transaction= opt_using_transactions; + else if (!(strcmp(thd->query,"COMMIT") && strcmp(thd->query,"ROLLBACK"))) + rli->inside_transaction=0; + + /* + If we expected a non-zero error code, and we don't get the same error + code, and none of them should be ignored. + */ + if ((expected_error != (actual_error = thd->net.last_errno)) && + expected_error && + !ignored_error_code(actual_error) && + !ignored_error_code(expected_error)) + { + slave_print_error(rli, 0, + "\ Query '%s' caused different errors on master and slave. \ Error on master: '%s' (%d), Error on slave: '%s' (%d). \ Default database: '%s'", - query, - ER_SAFE(expected_error), - expected_error, - actual_error ? thd->net.last_error: "no error", - actual_error, - print_slave_db_safe(db)); - thd->query_error= 1; - } - /* - If we get the same error code as expected, or they should be ignored. - */ - else if (expected_error == actual_error || - ignored_error_code(actual_error)) - { - thd->query_error = 0; - thd->clear_error(); - *rli->last_slave_error = 0; - rli->last_slave_errno = 0; - } - /* - Other cases: mostly we expected no error and get one. - */ - else if (thd->query_error || thd->fatal_error) - { - slave_print_error(rli,actual_error, - "Error '%s' on query '%s'. Default database: '%s'", - (actual_error ? thd->net.last_error : - "unexpected success or fatal error"), - query, - print_slave_db_safe(db)); - thd->query_error= 1; - } - } - /* - End of sanity check. If the test was wrong, the query got a really bad - error on the master, which could be inconsistent, abort and tell DBA to - check/fix it. check_expected_error() already printed the message to - stderr and rli, and set thd->query_error to 1. + query, + ER_SAFE(expected_error), + expected_error, + actual_error ? thd->net.last_error: "no error", + actual_error, + print_slave_db_safe(db)); + thd->query_error= 1; + } + /* + If we get the same error code as expected, or they should be ignored. */ + else if (expected_error == actual_error || + ignored_error_code(actual_error)) + clear_all_errors(thd, rli); + /* + Other cases: mostly we expected no error and get one. + */ + else if (thd->query_error || thd->fatal_error) + { + slave_print_error(rli,actual_error, + "Error '%s' on query '%s'. Default database: '%s'", + (actual_error ? thd->net.last_error : + "unexpected success or fatal error"), + query, + print_slave_db_safe(db)); + thd->query_error= 1; + } } /* End of if (db_ok(... */ +end: VOID(pthread_mutex_lock(&LOCK_thread_count)); thd->db= 0; // prevent db from being freed thd->query= 0; // just to be sure @@ -1939,8 +1955,7 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli, thd->db= (char*) rewrite_db(db); DBUG_ASSERT(thd->query == 0); thd->query = 0; // Should not be needed - thd->query_error = 0; - thd->clear_error(); + clear_all_errors(thd, rli); if (!use_rli_only_for_errors) { diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 091e51629f0..3267b42effc 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -353,6 +353,7 @@ int quick_rm_table(enum db_type base,const char *db, bool mysql_rename_tables(THD *thd, TABLE_LIST *table_list); bool mysql_change_db(THD *thd,const char *name); void mysql_parse(THD *thd,char *inBuf,uint length); +bool mysql_test_parse_for_slave(THD *thd,char *inBuf,uint length); void mysql_init_select(LEX *lex); bool mysql_new_select(LEX *lex); void mysql_init_multi_delete(LEX *lex); diff --git a/sql/slave.cc b/sql/slave.cc index 30052e874b3..d6dda473be0 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -2250,13 +2250,6 @@ int check_expected_error(THD* thd, RELAY_LOG_INFO* rli, int expected_error) case ER_NET_ERROR_ON_WRITE: case ER_SERVER_SHUTDOWN: case ER_NEW_ABORTING_CONNECTION: - slave_print_error(rli,expected_error, - "query '%s' partially completed on the master \ -and was aborted. There is a chance that your master is inconsistent at this \ -point. If you are sure that your master is ok, run this query manually on the\ - slave and then restart the slave with SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;\ - SLAVE START; .", thd->query); - thd->query_error= 1; return 1; default: return 0; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 88af18491ec..5b1487aa313 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -65,6 +65,7 @@ static bool create_total_list(THD *thd, LEX *lex, TABLE_LIST **result, bool skip_first); static bool check_one_table_access(THD *thd, ulong want_access, TABLE_LIST *table, bool no_errors); +static inline bool all_tables_not_ok(THD *thd, TABLE_LIST *tables); const char *any_db="*any*"; // Special symbol for check_access @@ -1332,9 +1333,7 @@ mysql_execute_command(void) Skip if we are in the slave thread, some table rules have been given and the table list says the query should not be replicated */ - if (table_rules_on && tables && !tables_ok(thd,tables) && - ((lex->sql_command != SQLCOM_DELETE_MULTI) || - !tables_ok(thd,(TABLE_LIST *)thd->lex.auxilliary_table_list.first))) + if (all_tables_not_ok(thd,tables)) { /* we warn the slave SQL thread */ my_error(ER_SLAVE_IGNORED_TABLE, MYF(0)); @@ -2968,9 +2967,18 @@ void mysql_init_multi_delete(LEX *lex) lex->select->table_list.save_and_clear(&lex->auxilliary_table_list); } +static inline bool all_tables_not_ok(THD *thd, TABLE_LIST *tables) +{ + return (table_rules_on && tables && !tables_ok(thd,tables) && + ((thd->lex.sql_command != SQLCOM_DELETE_MULTI) || + !tables_ok(thd,(TABLE_LIST *)thd->lex.auxilliary_table_list.first))); +} -void -mysql_parse(THD *thd,char *inBuf,uint length) +/* + When you modify mysql_parse(), you may need to mofify + mysql_test_parse_for_slave() in this same file. +*/ +void mysql_parse(THD *thd, char *inBuf, uint length) { DBUG_ENTER("mysql_parse"); @@ -3005,6 +3013,31 @@ mysql_parse(THD *thd,char *inBuf,uint length) DBUG_VOID_RETURN; } +/* + Usable by the replication SQL thread only: just parse a query to know if it + can be ignored because of replicate-*-table rules. + + RETURN VALUES + 0 cannot be ignored + 1 can be ignored +*/ + +bool mysql_test_parse_for_slave(THD *thd, char *inBuf, uint length) +{ + LEX *lex; + bool error= 0; + + mysql_init_query(thd); + lex= lex_start(thd, (uchar*) inBuf, length); + if (!yyparse() && ! thd->fatal_error && + all_tables_not_ok(thd,(TABLE_LIST*) lex->select_lex.table_list.first)) + error= 1; /* Ignore question */ + free_items(thd); /* Free strings used by items */ + lex_end(lex); + + return error; +} + /***************************************************************************** ** Store field definition for create From 2bf78563f7a87cbeac8201f06983e5caab5b0cc6 Mon Sep 17 00:00:00 2001 From: "jani@ua72d24.elisa.omakaista.fi" <> Date: Thu, 11 Mar 2004 20:12:16 +0200 Subject: [PATCH 50/65] Fixed error in version. --- client/mysqlbinlog.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc index 72f68f9fe86..29ee6efbfb0 100644 --- a/client/mysqlbinlog.cc +++ b/client/mysqlbinlog.cc @@ -952,7 +952,7 @@ int main(int argc, char** argv) exit_value= 0; fprintf(result_file, - "/*!40001 SET @@session.max_insert_delayed_threads=0*/;\n"); + "/*!40019 SET @@session.max_insert_delayed_threads=0*/;\n"); while (--argc >= 0) { if (dump_log_entries(*(argv++))) From a86753b00e27409d1ec1223e20d872f1b8fa1848 Mon Sep 17 00:00:00 2001 From: "Sinisa@sinisa.nasamreza.org" <> Date: Thu, 11 Mar 2004 22:26:03 +0200 Subject: [PATCH 51/65] multi_update.result: Test case for a #2996 bug fix multi_update.test: test case for a #2996 bug fix sql_select.cc: Fix for a bug #2996 involving multi-table updates over the const tables --- mysql-test/r/multi_update.result | 14 ++++++++++++++ mysql-test/t/multi_update.test | 14 ++++++++++++++ sql/sql_select.cc | 4 ++-- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/multi_update.result b/mysql-test/r/multi_update.result index 21035c8bc60..df24a1cfd58 100644 --- a/mysql-test/r/multi_update.result +++ b/mysql-test/r/multi_update.result @@ -386,3 +386,17 @@ SELECT * from t2; a 1 DROP TABLE t1,t2; +create table `t1` ( `p_id` int(10) unsigned NOT NULL auto_increment, `p_code` varchar(20) NOT NULL default '', `p_created` datetime NOT NULL default '0000-00-00 00:00:00', `p_active` tinyint(1) unsigned NOT NULL default '1', PRIMARY KEY (`p_id`) ); +create table `t2` ( `c2_id` int(10) unsigned NULL auto_increment, `c2_p_id` int(10) unsigned NOT NULL default '0', `c2_note` text NOT NULL, `c2_created` datetime NOT NULL default '0000-00-00 00:00:00', `c2_active` tinyint(1) unsigned NOT NULL default '1', PRIMARY KEY (`c2_id`), KEY `c2_p_id` (`c2_p_id`) ); +insert into t1 values (0,'A01-Comp',now(),1); +insert into t1 values (0,'B01-Comp',now(),1); +insert into t2 values (0,1,'A Note',now(),1); +update t1 left join t2 on p_id = c2_p_id set c2_note = 'asdf-1' where p_id = 2; +select * from t1; +p_id p_code p_created p_active +1 A01-Comp 2004-03-11 23:21:29 1 +2 B01-Comp 2004-03-11 23:21:29 1 +select * from t2; +c2_id c2_p_id c2_note c2_created c2_active +1 1 A Note 2004-03-11 23:21:29 1 +drop table t1, t2; diff --git a/mysql-test/t/multi_update.test b/mysql-test/t/multi_update.test index 283637912a1..6ed340ad92b 100644 --- a/mysql-test/t/multi_update.test +++ b/mysql-test/t/multi_update.test @@ -325,3 +325,17 @@ DELETE t2 FROM t1 AS t2, t2 AS t1 where t1.a=t2.a and t1.a=2; SELECT * from t1; SELECT * from t2; DROP TABLE t1,t2; + +# +# Test update with const tables +# + +create table `t1` ( `p_id` int(10) unsigned NOT NULL auto_increment, `p_code` varchar(20) NOT NULL default '', `p_created` datetime NOT NULL default '0000-00-00 00:00:00', `p_active` tinyint(1) unsigned NOT NULL default '1', PRIMARY KEY (`p_id`) ); +create table `t2` ( `c2_id` int(10) unsigned NULL auto_increment, `c2_p_id` int(10) unsigned NOT NULL default '0', `c2_note` text NOT NULL, `c2_created` datetime NOT NULL default '0000-00-00 00:00:00', `c2_active` tinyint(1) unsigned NOT NULL default '1', PRIMARY KEY (`c2_id`), KEY `c2_p_id` (`c2_p_id`) ); +insert into t1 values (0,'A01-Comp',now(),1); +insert into t1 values (0,'B01-Comp',now(),1); +insert into t2 values (0,1,'A Note',now(),1); +update t1 left join t2 on p_id = c2_p_id set c2_note = 'asdf-1' where p_id = 2; +select * from t1; +select * from t2; +drop table t1, t2; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 3ffa4e6a92c..87812414881 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -4897,8 +4897,8 @@ join_read_const_table(JOIN_TAB *tab, POSITION *pos) if (tab->on_expr && !table->null_row) { if ((table->null_row= test(tab->on_expr->val_int() == 0))) - empty_record(table); - } + mark_as_null_row(table); + } if (!table->null_row) table->maybe_null=0; DBUG_RETURN(0); From 5b5d749294edbf57b461eaf11812c29b196c98b7 Mon Sep 17 00:00:00 2001 From: "marko@hundin.mysql.fi" <> Date: Thu, 11 Mar 2004 23:12:02 +0200 Subject: [PATCH 52/65] More consistent handling of magic numbers --- innobase/dict/dict0dict.c | 4 ++-- innobase/dict/dict0mem.c | 6 ++++-- innobase/ha/hash0hash.c | 38 ++++++----------------------------- innobase/include/data0data.h | 6 ++++-- innobase/include/dict0mem.h | 17 +++++++++------- innobase/include/hash0hash.h | 20 +++--------------- innobase/include/hash0hash.ic | 8 ++++++++ innobase/include/mtr0mtr.h | 14 +++++++------ innobase/include/row0ins.h | 5 +++-- innobase/include/row0upd.h | 5 +++-- innobase/row/row0ins.c | 10 +++++---- innobase/row/row0upd.c | 6 +++++- innobase/thr/thr0loc.c | 10 +++++---- 13 files changed, 68 insertions(+), 81 deletions(-) diff --git a/innobase/dict/dict0dict.c b/innobase/dict/dict0dict.c index 5b2a16ce9f3..223b4a941cc 100644 --- a/innobase/dict/dict0dict.c +++ b/innobase/dict/dict0dict.c @@ -3536,9 +3536,9 @@ dict_tree_create( tree->id = index->id; UT_LIST_INIT(tree->tree_indexes); - +#ifdef UNIV_DEBUG tree->magic_n = DICT_TREE_MAGIC_N; - +#endif /* UNIV_DEBUG */ rw_lock_create(&(tree->lock)); rw_lock_set_level(&(tree->lock), SYNC_INDEX_TREE); diff --git a/innobase/dict/dict0mem.c b/innobase/dict/dict0mem.c index 56efc0a0117..c9eb7a9d8bd 100644 --- a/innobase/dict/dict0mem.c +++ b/innobase/dict/dict0mem.c @@ -90,9 +90,9 @@ dict_mem_table_create( mutex_set_level(&(table->autoinc_mutex), SYNC_DICT_AUTOINC_MUTEX); table->autoinc_inited = FALSE; - +#ifdef UNIV_DEBUG table->magic_n = DICT_TABLE_MAGIC_N; - +#endif /* UNIV_DEBUG */ return(table); } @@ -217,7 +217,9 @@ dict_mem_index_create( index->stat_n_diff_key_vals = NULL; index->cached = FALSE; +#ifdef UNIV_DEBUG index->magic_n = DICT_INDEX_MAGIC_N; +#endif /* UNIV_DEBUG */ return(index); } diff --git a/innobase/ha/hash0hash.c b/innobase/ha/hash0hash.c index 1f7edf9d7d2..808aa88da3d 100644 --- a/innobase/ha/hash0hash.c +++ b/innobase/ha/hash0hash.c @@ -22,6 +22,7 @@ hash_mutex_enter( hash_table_t* table, /* in: hash table */ ulint fold) /* in: fold */ { + ut_ad(table->magic_n == HASH_TABLE_MAGIC_N); mutex_enter(hash_get_mutex(table, fold)); } @@ -34,41 +35,10 @@ hash_mutex_exit( hash_table_t* table, /* in: hash table */ ulint fold) /* in: fold */ { + ut_ad(table->magic_n == HASH_TABLE_MAGIC_N); mutex_exit(hash_get_mutex(table, fold)); } -/**************************************************************** -Reserves all the mutexes of a hash table, in an ascending order. */ - -void -hash_mutex_enter_all( -/*=================*/ - hash_table_t* table) /* in: hash table */ -{ - ulint i; - - for (i = 0; i < table->n_mutexes; i++) { - - mutex_enter(table->mutexes + i); - } -} - -/**************************************************************** -Releases all the mutexes of a hash table. */ - -void -hash_mutex_exit_all( -/*================*/ - hash_table_t* table) /* in: hash table */ -{ - ulint i; - - for (i = 0; i < table->n_mutexes; i++) { - - mutex_exit(table->mutexes + i); - } -} - /***************************************************************** Creates a hash table with >= n array cells. The actual number of cells is chosen to be a prime number slightly bigger than n. */ @@ -97,7 +67,9 @@ hash_create( table->mutexes = NULL; table->heaps = NULL; table->heap = NULL; +#ifdef UNIV_DEBUG table->magic_n = HASH_TABLE_MAGIC_N; +#endif /* UNIV_DEBUG */ /* Initialize the cell array */ @@ -118,6 +90,7 @@ hash_table_free( /*============*/ hash_table_t* table) /* in, own: hash table */ { + ut_ad(table->magic_n == HASH_TABLE_MAGIC_N); ut_a(table->mutexes == NULL); ut_free(table->array); @@ -139,6 +112,7 @@ hash_create_mutexes( ulint i; ut_a(n_mutexes == ut_2_power_up(n_mutexes)); + ut_ad(table->magic_n == HASH_TABLE_MAGIC_N); table->mutexes = mem_alloc(n_mutexes * sizeof(mutex_t)); diff --git a/innobase/include/data0data.h b/innobase/include/data0data.h index 2501d2b809f..c4e93bec738 100644 --- a/innobase/include/data0data.h +++ b/innobase/include/data0data.h @@ -402,9 +402,11 @@ struct dtuple_struct { UT_LIST_NODE_T(dtuple_t) tuple_list; /* data tuples can be linked into a list using this field */ - ulint magic_n; -}; +#ifdef UNIV_DEBUG + ulint magic_n; #define DATA_TUPLE_MAGIC_N 65478679 +#endif /* UNIV_DEBUG */ +}; /* A slot for a field in a big rec vector */ diff --git a/innobase/include/dict0mem.h b/innobase/include/dict0mem.h index 03dc913a7c9..1930825f601 100644 --- a/innobase/include/dict0mem.h +++ b/innobase/include/dict0mem.h @@ -198,10 +198,11 @@ struct dict_tree_struct{ the list; if the tree is of the mixed type, the first index in the list is the index of the cluster which owns the tree */ +#ifdef UNIV_DEBUG ulint magic_n;/* magic number */ -}; - #define DICT_TREE_MAGIC_N 7545676 +#endif /* UNIV_DEBUG */ +}; /* Data structure for an index */ struct dict_index_struct{ @@ -247,7 +248,10 @@ struct dict_index_struct{ ulint stat_n_leaf_pages; /* approximate number of leaf pages in the index tree */ +#ifdef UNIV_DEBUG ulint magic_n;/* magic number */ +#define DICT_INDEX_MAGIC_N 76789786 +#endif /* UNIV_DEBUG */ }; /* Data structure for a foreign key constraint; an example: @@ -298,9 +302,6 @@ a foreign key constraint is enforced, therefore RESTRICT just means no flag */ #define DICT_FOREIGN_ON_DELETE_NO_ACTION 16 #define DICT_FOREIGN_ON_UPDATE_NO_ACTION 32 - -#define DICT_INDEX_MAGIC_N 76789786 - /* Data structure for a database table */ struct dict_table_struct{ dulint id; /* id of the table or cluster */ @@ -412,10 +413,12 @@ struct dict_table_struct{ inited; MySQL gets the init value by executing SELECT MAX(auto inc column) */ ib_longlong autoinc;/* autoinc counter value to give to the - next inserted row */ + next inserted row */ +#ifdef UNIV_DEBUG ulint magic_n;/* magic number */ -}; #define DICT_TABLE_MAGIC_N 76333786 +#endif /* UNIV_DEBUG */ +}; /* Data structure for a stored procedure */ struct dict_proc_struct{ diff --git a/innobase/include/hash0hash.h b/innobase/include/hash0hash.h index 378925a5bea..2669520b753 100644 --- a/innobase/include/hash0hash.h +++ b/innobase/include/hash0hash.h @@ -300,21 +300,6 @@ hash_mutex_exit( /*============*/ hash_table_t* table, /* in: hash table */ ulint fold); /* in: fold */ -/**************************************************************** -Reserves all the mutexes of a hash table, in an ascending order. */ - -void -hash_mutex_enter_all( -/*=================*/ - hash_table_t* table); /* in: hash table */ -/**************************************************************** -Releases all the mutexes of a hash table. */ - -void -hash_mutex_exit_all( -/*================*/ - hash_table_t* table); /* in: hash table */ - struct hash_cell_struct{ void* node; /* hash chain node, NULL if none */ @@ -333,10 +318,11 @@ struct hash_table_struct { memory heaps; there are then n_mutexes many of these heaps */ mem_heap_t* heap; +#ifdef UNIV_DEBUG ulint magic_n; -}; - #define HASH_TABLE_MAGIC_N 76561114 +#endif /* UNIV_DEBUG */ +}; #ifndef UNIV_NONINL #include "hash0hash.ic" diff --git a/innobase/include/hash0hash.ic b/innobase/include/hash0hash.ic index 0d713140c13..1b9acfa2f34 100644 --- a/innobase/include/hash0hash.ic +++ b/innobase/include/hash0hash.ic @@ -18,6 +18,7 @@ hash_get_nth_cell( hash_table_t* table, /* in: hash table */ ulint n) /* in: cell index */ { + ut_ad(table->magic_n == HASH_TABLE_MAGIC_N); ut_ad(n < table->n_cells); return(table->array + n); @@ -32,6 +33,7 @@ hash_get_n_cells( /* out: number of cells */ hash_table_t* table) /* in: table */ { + ut_ad(table->magic_n == HASH_TABLE_MAGIC_N); return(table->n_cells); } @@ -45,6 +47,7 @@ hash_calc_hash( ulint fold, /* in: folded value */ hash_table_t* table) /* in: hash table */ { + ut_ad(table->magic_n == HASH_TABLE_MAGIC_N); return(ut_hash_ulint(fold, table->n_cells)); } @@ -58,6 +61,7 @@ hash_get_mutex_no( hash_table_t* table, /* in: hash table */ ulint fold) /* in: fold */ { + ut_ad(table->magic_n == HASH_TABLE_MAGIC_N); return(ut_2pow_remainder(fold, table->n_mutexes)); } @@ -71,6 +75,7 @@ hash_get_nth_heap( hash_table_t* table, /* in: hash table */ ulint i) /* in: index of the heap */ { + ut_ad(table->magic_n == HASH_TABLE_MAGIC_N); ut_ad(i < table->n_mutexes); return(table->heaps[i]); @@ -88,6 +93,8 @@ hash_get_heap( { ulint i; + ut_ad(table->magic_n == HASH_TABLE_MAGIC_N); + if (table->heap) { return(table->heap); } @@ -107,6 +114,7 @@ hash_get_nth_mutex( hash_table_t* table, /* in: hash table */ ulint i) /* in: index of the mutex */ { + ut_ad(table->magic_n == HASH_TABLE_MAGIC_N); ut_ad(i < table->n_mutexes); return(table->mutexes + i); diff --git a/innobase/include/mtr0mtr.h b/innobase/include/mtr0mtr.h index 86b7c3345ff..dd582adcb6f 100644 --- a/innobase/include/mtr0mtr.h +++ b/innobase/include/mtr0mtr.h @@ -290,7 +290,12 @@ struct mtr_memo_slot_struct{ /* Mini-transaction handle and buffer */ struct mtr_struct{ +#ifdef UNIV_DEBUG ulint state; /* MTR_ACTIVE, MTR_COMMITTING, MTR_COMMITTED */ +#define MTR_ACTIVE 12231 +#define MTR_COMMITTING 56456 +#define MTR_COMMITTED 34676 +#endif /* UNIV_DEBUG */ dyn_array_t memo; /* memo stack for locks etc. */ dyn_array_t log; /* mini-transaction log */ ibool modifications; @@ -305,15 +310,12 @@ struct mtr_struct{ this mtr */ dulint end_lsn;/* end lsn of the possible log entry for this mtr */ +#ifdef UNIV_DEBUG ulint magic_n; +#define MTR_MAGIC_N 54551 +#endif /* UNIV_DEBUG */ }; -#define MTR_MAGIC_N 54551 - -#define MTR_ACTIVE 12231 -#define MTR_COMMITTING 56456 -#define MTR_COMMITTED 34676 - #ifndef UNIV_NONINL #include "mtr0mtr.ic" #endif diff --git a/innobase/include/row0ins.h b/innobase/include/row0ins.h index a5b4b74e7fc..f3f0b7e8eca 100644 --- a/innobase/include/row0ins.h +++ b/innobase/include/row0ins.h @@ -145,10 +145,11 @@ struct ins_node_struct{ entry_list and sys fields are stored here; if this is NULL, entry list should be created and buffers for sys fields in row allocated */ +#ifdef UNIV_DEBUG ulint magic_n; -}; - #define INS_NODE_MAGIC_N 15849075 +#endif /* UNIV_DEBUG */ +}; /* Insert node types */ #define INS_SEARCHED 0 /* INSERT INTO ... SELECT ... */ diff --git a/innobase/include/row0upd.h b/innobase/include/row0upd.h index f5e0a88231f..687e90deee5 100644 --- a/innobase/include/row0upd.h +++ b/innobase/include/row0upd.h @@ -384,10 +384,11 @@ struct upd_node_struct{ sym_node_t* table_sym;/* table node in symbol table */ que_node_t* col_assign_list; /* column assignment list */ +#ifdef UNIV_DEBUG ulint magic_n; -}; - #define UPD_NODE_MAGIC_N 1579975 +#endif /* UNIV_DEBUG */ +}; /* Node execution states */ #define UPD_NODE_SET_IX_LOCK 1 /* execution came to the node from diff --git a/innobase/row/row0ins.c b/innobase/row/row0ins.c index f455eabd2e0..d4947357719 100644 --- a/innobase/row/row0ins.c +++ b/innobase/row/row0ins.c @@ -80,9 +80,9 @@ ins_node_create( node->trx_id = ut_dulint_zero; node->entry_sys_heap = mem_heap_create(128); - - node->magic_n = INS_NODE_MAGIC_N; - +#ifdef UNIV_DEBUG + node->magic_n = INS_NODE_MAGIC_N; +#endif /* UNIV_DEBUG */ return(node); } @@ -194,6 +194,7 @@ ins_node_set_new_row( ins_node_t* node, /* in: insert node */ dtuple_t* row) /* in: new row (or first row) for the node */ { + ut_ad(node->magic_n == INS_NODE_MAGIC_N); node->state = INS_NODE_SET_IX_LOCK; node->index = NULL; node->entry = NULL; @@ -2031,6 +2032,7 @@ row_ins( ulint err; ut_ad(node && thr); + ut_ad(node->magic_n == INS_NODE_MAGIC_N); if (node->state == INS_NODE_ALLOC_ROW_ID) { @@ -2095,7 +2097,7 @@ row_ins_step( trx_start_if_not_started(trx); node = thr->run_node; - + ut_ad(node->magic_n == INS_NODE_MAGIC_N); ut_ad(que_node_get_type(node) == QUE_NODE_INSERT); parent = que_node_get_parent(node); diff --git a/innobase/row/row0upd.c b/innobase/row/row0upd.c index ae373dfc621..ad6542845cb 100644 --- a/innobase/row/row0upd.c +++ b/innobase/row/row0upd.c @@ -287,7 +287,9 @@ upd_node_create( node->select = NULL; node->heap = mem_heap_create(128); - node->magic_n = UPD_NODE_MAGIC_N; +#ifdef UNIV_DEBUG + node->magic_n = UPD_NODE_MAGIC_N; +#endif /* UNIV_DEBUG */ node->cmpl_info = 0; @@ -1804,6 +1806,7 @@ row_upd_step( trx_start_if_not_started(trx); node = thr->run_node; + ut_ad(node->magic_n == UPD_NODE_MAGIC_N); sel_node = node->select; @@ -1923,6 +1926,7 @@ row_upd_in_place_in_select( node = que_node_get_parent(sel_node); + ut_ad(node->magic_n == UPD_NODE_MAGIC_N); ut_ad(que_node_get_type(node) == QUE_NODE_UPDATE); pcur = node->pcur; diff --git a/innobase/thr/thr0loc.c b/innobase/thr/thr0loc.c index 839cb024f25..5da1d7dfb41 100644 --- a/innobase/thr/thr0loc.c +++ b/innobase/thr/thr0loc.c @@ -46,10 +46,11 @@ struct thr_local_struct{ ibool in_ibuf;/* TRUE if the the thread is doing an ibuf operation */ hash_node_t hash; /* hash chain node */ +#ifdef UNIV_DEBUG ulint magic_n; -}; - #define THR_LOCAL_MAGIC_N 1231234 +#endif /* UNIV_DEBUG */ +}; /*********************************************************************** Returns the local storage struct for a thread. */ @@ -167,8 +168,9 @@ thr_local_create(void) local->id = os_thread_get_curr_id(); local->handle = os_thread_get_curr(); +#ifdef UNIV_DEBUG local->magic_n = THR_LOCAL_MAGIC_N; - +#endif /* UNIV_DEBUG */ local->in_ibuf = FALSE; mutex_enter(&thr_local_mutex); @@ -207,7 +209,7 @@ thr_local_free( mutex_exit(&thr_local_mutex); - ut_a(local->magic_n == THR_LOCAL_MAGIC_N); + ut_ad(local->magic_n == THR_LOCAL_MAGIC_N); mem_free(local); } From e27960a44e393ac67d037379f340db75a350495e Mon Sep 17 00:00:00 2001 From: "monty@mysql.com" <> Date: Fri, 12 Mar 2004 01:10:22 +0200 Subject: [PATCH 53/65] Ensure that install_test_db.sh script works with both 'make install' and 'make_binary_distribution' layouts Abort if we can't allocate memory for table cache Fix bug with multi-update-tables and BDB tables. --- extra/replace.c | 18 +++++++++--------- mysql-test/install_test_db.sh | 11 +++++++++-- mysql-test/mysql-test-run.sh | 2 +- sql/ha_berkeley.cc | 2 +- sql/mysql_priv.h | 2 +- sql/mysqld.cc | 14 ++++++++------ sql/sql_base.cc | 6 +++--- sql/sql_update.cc | 9 ++++++--- 8 files changed, 38 insertions(+), 26 deletions(-) diff --git a/extra/replace.c b/extra/replace.c index 792684918ea..422cfdbac36 100644 --- a/extra/replace.c +++ b/extra/replace.c @@ -14,18 +14,16 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* Replace strings in textfile +/* + Replace strings in textfile + This program replaces strings in files or from stdin to stdout. It accepts a list of from-string/to-string pairs and replaces each occurrence of a from-string with the corresponding to-string. The first occurrence of a found string is matched. If there is more than one possibility for the string to replace, longer matches are preferred before shorter matches. - This program replace strings in a file or on stdin/stdout. - It accepts a list of from-strings and to-strings and replaces all - occurents of from-strings to to-strings. - The first occurents of a found string is matched. If there are more than - one possibly replace the longer from-string is replaced. + Special characters in from string: \^ Match start of line. \$ Match end of line. @@ -956,9 +954,11 @@ static void free_buffer() } -/* Fill the buffer retaining the last n bytes at the beginning of the - newly filled buffer (for backward context). Returns the number of new - bytes read from disk. */ +/* + Fill the buffer retaining the last n bytes at the beginning of the + newly filled buffer (for backward context). Returns the number of new + bytes read from disk. +*/ static int fill_buffer_retaining(fd,n) File fd; diff --git a/mysql-test/install_test_db.sh b/mysql-test/install_test_db.sh index dcac79a6cf4..f2ce448b273 100644 --- a/mysql-test/install_test_db.sh +++ b/mysql-test/install_test_db.sh @@ -5,9 +5,16 @@ # This scripts creates the privilege tables db, host, user, tables_priv, # columns_priv in the mysql database, as well as the func table. -if [ x$1 = x"-bin" ]; then +if [ x$1 = x"--bin" ]; then shift 1 - execdir=../bin + +# Check if it's a binary distribution or a 'make install' +if test -x ../libexec/mysqld + then + execdir=../libexec + else + execdir=../bin +fi bindir=../bin BINARY_DIST=1 fix_bin=mysql-test diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index d362e885dee..bf6888f55fc 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -486,7 +486,7 @@ else MYSQL_MANAGER_CLIENT="$BASEDIR/bin/mysqlmanagerc" MYSQL_MANAGER_PWGEN="$BASEDIR/bin/mysqlmanager-pwgen" MYSQL="$BASEDIR/bin/mysql" - INSTALL_DB="./install_test_db -bin" + INSTALL_DB="./install_test_db --bin" if test -d "$BASEDIR/share/mysql/english" then LANGUAGE="$BASEDIR/share/mysql/english/" diff --git a/sql/ha_berkeley.cc b/sql/ha_berkeley.cc index 15eb7fc72c6..35e731f20da 100644 --- a/sql/ha_berkeley.cc +++ b/sql/ha_berkeley.cc @@ -1334,7 +1334,7 @@ int ha_berkeley::index_init(uint keynr) int ha_berkeley::index_end() { int error=0; - DBUG_ENTER("index_end"); + DBUG_ENTER("ha_berkely::index_end"); if (cursor) { DBUG_PRINT("enter",("table: '%s'", table->real_name)); diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 091e51629f0..204ab84025d 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -375,7 +375,7 @@ bool check_stack_overrun(THD *thd,char *dummy); #endif bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables); -void table_cache_init(void); +bool table_cache_init(void); void table_cache_free(void); uint cached_tables(void); void kill_mysql(void); diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 38faf95fd0e..671a78f6bfd 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -2225,8 +2225,10 @@ You should consider changing lower_case_table_names to 1 or 2", mysql_data_home[0]=FN_CURLIB; // all paths are relative from here mysql_data_home[1]=0; server_init(); - table_cache_init(); - hostname_cache_init(); + if (table_cache_init() || hostname_cache_init()) + { + unireg_abort(1); + } query_cache_result_size_limit(query_cache_limit); query_cache_resize(query_cache_size); randominit(&sql_rand,(ulong) start_time,(ulong) start_time/2); @@ -3749,11 +3751,11 @@ replicating a LOAD DATA INFILE command", 0, 0, 0, 0}, {"log-warnings", 'W', "Log some not critical warnings to the log file", (gptr*) &global_system_variables.log_warnings, - (gptr*) &max_system_variables.log_warnings, 0, GET_BOOL, NO_ARG, 0, 0, 0, + (gptr*) &max_system_variables.log_warnings, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, {"warnings", 'W', "Deprecated ; Use --log-warnings instead", (gptr*) &global_system_variables.log_warnings, - (gptr*) &max_system_variables.log_warnings, 0, GET_BOOL, NO_ARG, 0, 0, 0, + (gptr*) &max_system_variables.log_warnings, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, { "back_log", OPT_BACK_LOG, "The number of outstanding connection requests MySQL can have. This comes into play when the main MySQL thread gets very many connection requests in a very short time.", @@ -4100,8 +4102,8 @@ this value; if zero (the default): when the size exceeds max_binlog_size. \ 1, 0}, {"table_cache", OPT_TABLE_CACHE, "The number of open tables for all threads.", (gptr*) &table_cache_size, - (gptr*) &table_cache_size, 0, GET_ULONG, REQUIRED_ARG, 64, 1, ~0L, 0, 1, - 0}, + (gptr*) &table_cache_size, 0, GET_ULONG, REQUIRED_ARG, 64, 1, 512*1024L, + 0, 1, 0}, {"thread_concurrency", OPT_THREAD_CONCURRENCY, "Permits the application to give the threads system a hint for the desired number of threads that should be run at the same time.", (gptr*) &concurrency, (gptr*) &concurrency, 0, GET_ULONG, REQUIRED_ARG, diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 9da1f4e2231..dac8da12065 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -47,11 +47,11 @@ extern "C" byte *table_cache_key(const byte *record,uint *length, return (byte*) entry->table_cache_key; } -void table_cache_init(void) +bool table_cache_init(void) { - VOID(hash_init(&open_cache,table_cache_size+16,0,0,table_cache_key, - (hash_free_key) free_cache_entry,0)); mysql_rm_tmp_tables(); + return hash_init(&open_cache,table_cache_size+16,0,0,table_cache_key, + (hash_free_key) free_cache_entry,0) != 0; } diff --git a/sql/sql_update.cc b/sql/sql_update.cc index 0a8530aa141..02d2fe2c442 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -866,14 +866,16 @@ int multi_update::do_updates(bool from_send_error) DBUG_RETURN(0); for (cur_table= update_tables; cur_table ; cur_table= cur_table->next) { + byte *ref_pos; + TABLE *tmp_table; + table = cur_table->table; if (table == table_to_update) continue; // Already updated - org_updated= updated; - byte *ref_pos; - TABLE *tmp_table= tmp_tables[cur_table->shared]; + tmp_table= tmp_tables[cur_table->shared]; tmp_table->file->extra(HA_EXTRA_CACHE); // Change to read cache + (void) table->file->rnd_init(0); table->file->extra(HA_EXTRA_NO_CACHE); /* @@ -940,6 +942,7 @@ int multi_update::do_updates(bool from_send_error) else trans_safe= 0; // Can't do safe rollback } + (void) table->file->rnd_end(); } DBUG_RETURN(0); From 91a854611273507448fa5992489faee3e4056fc1 Mon Sep 17 00:00:00 2001 From: "monty@mysql.com" <> Date: Fri, 12 Mar 2004 09:15:08 +0200 Subject: [PATCH 54/65] Portability fixes & fixing of test suite --- mysql-test/r/func_math.result | 3 +++ mysql-test/r/multi_update.result | 20 ++++++++++---------- mysql-test/r/mysqlbinlog.result | 8 ++++++++ mysql-test/t/multi_update.test | 10 +++++----- sql/sql_parse.cc | 17 ++++++++++------- 5 files changed, 36 insertions(+), 22 deletions(-) diff --git a/mysql-test/r/func_math.result b/mysql-test/r/func_math.result index 1b6a0d43738..04dabcb5481 100644 --- a/mysql-test/r/func_math.result +++ b/mysql-test/r/func_math.result @@ -59,9 +59,12 @@ ASIN(0.8+0.2) SELECT ASIN(1.2-0.2); ASIN(1.2-0.2) 1.570796 +select floor(log(4)/log(2)); floor(log(4)/log(2)) 2 +select floor(log(8)/log(2)); floor(log(8)/log(2)) 3 +select floor(log(16)/log(2)); floor(log(16)/log(2)) 4 diff --git a/mysql-test/r/multi_update.result b/mysql-test/r/multi_update.result index df24a1cfd58..12cb965f045 100644 --- a/mysql-test/r/multi_update.result +++ b/mysql-test/r/multi_update.result @@ -386,17 +386,17 @@ SELECT * from t2; a 1 DROP TABLE t1,t2; -create table `t1` ( `p_id` int(10) unsigned NOT NULL auto_increment, `p_code` varchar(20) NOT NULL default '', `p_created` datetime NOT NULL default '0000-00-00 00:00:00', `p_active` tinyint(1) unsigned NOT NULL default '1', PRIMARY KEY (`p_id`) ); -create table `t2` ( `c2_id` int(10) unsigned NULL auto_increment, `c2_p_id` int(10) unsigned NOT NULL default '0', `c2_note` text NOT NULL, `c2_created` datetime NOT NULL default '0000-00-00 00:00:00', `c2_active` tinyint(1) unsigned NOT NULL default '1', PRIMARY KEY (`c2_id`), KEY `c2_p_id` (`c2_p_id`) ); -insert into t1 values (0,'A01-Comp',now(),1); -insert into t1 values (0,'B01-Comp',now(),1); -insert into t2 values (0,1,'A Note',now(),1); +create table `t1` (`p_id` int(10) unsigned NOT NULL auto_increment, `p_code` varchar(20) NOT NULL default '', `p_active` tinyint(1) unsigned NOT NULL default '1', PRIMARY KEY (`p_id`) ); +create table `t2` (`c2_id` int(10) unsigned NULL auto_increment, `c2_p_id` int(10) unsigned NOT NULL default '0', `c2_note` text NOT NULL, `c2_active` tinyint(1) unsigned NOT NULL default '1', PRIMARY KEY (`c2_id`), KEY `c2_p_id` (`c2_p_id`) ); +insert into t1 values (0,'A01-Comp',1); +insert into t1 values (0,'B01-Comp',1); +insert into t2 values (0,1,'A Note',1); update t1 left join t2 on p_id = c2_p_id set c2_note = 'asdf-1' where p_id = 2; select * from t1; -p_id p_code p_created p_active -1 A01-Comp 2004-03-11 23:21:29 1 -2 B01-Comp 2004-03-11 23:21:29 1 +p_id p_code p_active +1 A01-Comp 1 +2 B01-Comp 1 select * from t2; -c2_id c2_p_id c2_note c2_created c2_active -1 1 A Note 2004-03-11 23:21:29 1 +c2_id c2_p_id c2_note c2_active +1 1 A Note 1 drop table t1, t2; diff --git a/mysql-test/r/mysqlbinlog.result b/mysql-test/r/mysqlbinlog.result index df472eb9c80..79bf46280dd 100644 --- a/mysql-test/r/mysqlbinlog.result +++ b/mysql-test/r/mysqlbinlog.result @@ -14,6 +14,7 @@ insert into t1 values ("Alas"); flush logs; --- Local -- +/*!40019 SET @@session.max_insert_delayed_threads=0*/; use test; SET TIMESTAMP=1000000000; create table t1 (word varchar(20)); @@ -31,19 +32,23 @@ LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-4-0' INTO TABLE `t1` FI LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-5-0' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word); --- Broken LOAD DATA -- +/*!40019 SET @@session.max_insert_delayed_threads=0*/; use test; SET TIMESTAMP=1000000000; insert into t1 values ("Alas"); --- --database -- +/*!40019 SET @@session.max_insert_delayed_threads=0*/; SET INSERT_ID=1; --- --position -- +/*!40019 SET @@session.max_insert_delayed_threads=0*/; use test; SET TIMESTAMP=1000000000; insert into t1 values ("Alas"); --- Remote -- +/*!40019 SET @@session.max_insert_delayed_threads=0*/; use test; SET TIMESTAMP=1000000000; create table t1 (word varchar(20)); @@ -64,14 +69,17 @@ SET TIMESTAMP=1000000000; insert into t1 values ("Alas"); --- Broken LOAD DATA -- +/*!40019 SET @@session.max_insert_delayed_threads=0*/; use test; SET TIMESTAMP=1000000000; insert into t1 values ("Alas"); --- --database -- +/*!40019 SET @@session.max_insert_delayed_threads=0*/; SET INSERT_ID=1; --- --position -- +/*!40019 SET @@session.max_insert_delayed_threads=0*/; use test; SET TIMESTAMP=1000000000; insert into t1 values ("Alas"); diff --git a/mysql-test/t/multi_update.test b/mysql-test/t/multi_update.test index 6ed340ad92b..39ea136bde1 100644 --- a/mysql-test/t/multi_update.test +++ b/mysql-test/t/multi_update.test @@ -330,11 +330,11 @@ DROP TABLE t1,t2; # Test update with const tables # -create table `t1` ( `p_id` int(10) unsigned NOT NULL auto_increment, `p_code` varchar(20) NOT NULL default '', `p_created` datetime NOT NULL default '0000-00-00 00:00:00', `p_active` tinyint(1) unsigned NOT NULL default '1', PRIMARY KEY (`p_id`) ); -create table `t2` ( `c2_id` int(10) unsigned NULL auto_increment, `c2_p_id` int(10) unsigned NOT NULL default '0', `c2_note` text NOT NULL, `c2_created` datetime NOT NULL default '0000-00-00 00:00:00', `c2_active` tinyint(1) unsigned NOT NULL default '1', PRIMARY KEY (`c2_id`), KEY `c2_p_id` (`c2_p_id`) ); -insert into t1 values (0,'A01-Comp',now(),1); -insert into t1 values (0,'B01-Comp',now(),1); -insert into t2 values (0,1,'A Note',now(),1); +create table `t1` (`p_id` int(10) unsigned NOT NULL auto_increment, `p_code` varchar(20) NOT NULL default '', `p_active` tinyint(1) unsigned NOT NULL default '1', PRIMARY KEY (`p_id`) ); +create table `t2` (`c2_id` int(10) unsigned NULL auto_increment, `c2_p_id` int(10) unsigned NOT NULL default '0', `c2_note` text NOT NULL, `c2_active` tinyint(1) unsigned NOT NULL default '1', PRIMARY KEY (`c2_id`), KEY `c2_p_id` (`c2_p_id`) ); +insert into t1 values (0,'A01-Comp',1); +insert into t1 values (0,'B01-Comp',1); +insert into t2 values (0,1,'A Note',1); update t1 left join t2 on p_id = c2_p_id set c2_note = 'asdf-1' where p_id = 2; select * from t1; select * from t2; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 5b1487aa313..9d19458abf4 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -65,7 +65,7 @@ static bool create_total_list(THD *thd, LEX *lex, TABLE_LIST **result, bool skip_first); static bool check_one_table_access(THD *thd, ulong want_access, TABLE_LIST *table, bool no_errors); -static inline bool all_tables_not_ok(THD *thd, TABLE_LIST *tables); + const char *any_db="*any*"; // Special symbol for check_access @@ -108,6 +108,7 @@ static void unlock_locked_tables(THD *thd) } } + static bool end_active_trans(THD *thd) { int error=0; @@ -123,6 +124,14 @@ static bool end_active_trans(THD *thd) } +inline bool all_tables_not_ok(THD *thd, TABLE_LIST *tables) +{ + return (table_rules_on && tables && !tables_ok(thd,tables) && + ((thd->lex.sql_command != SQLCOM_DELETE_MULTI) || + !tables_ok(thd,(TABLE_LIST *)thd->lex.auxilliary_table_list.first))); +} + + static HASH hash_user_connections; extern pthread_mutex_t LOCK_user_conn; @@ -2967,12 +2976,6 @@ void mysql_init_multi_delete(LEX *lex) lex->select->table_list.save_and_clear(&lex->auxilliary_table_list); } -static inline bool all_tables_not_ok(THD *thd, TABLE_LIST *tables) -{ - return (table_rules_on && tables && !tables_ok(thd,tables) && - ((thd->lex.sql_command != SQLCOM_DELETE_MULTI) || - !tables_ok(thd,(TABLE_LIST *)thd->lex.auxilliary_table_list.first))); -} /* When you modify mysql_parse(), you may need to mofify From c8d6a195dc3f3e5a175a448e992a07ede147fe44 Mon Sep 17 00:00:00 2001 From: "marko@hundin.mysql.fi" <> Date: Fri, 12 Mar 2004 13:46:26 +0200 Subject: [PATCH 55/65] Replace ut_anp with ut_a --- innobase/fil/fil0fil.c | 6 +- innobase/fsp/fsp0fsp.c | 2 +- innobase/include/ut0dbg.h | 115 +++++++++----------------------------- innobase/log/log0log.c | 15 +++-- innobase/mem/mem0pool.c | 2 +- innobase/ut/ut0dbg.c | 13 +++++ 6 files changed, 50 insertions(+), 103 deletions(-) diff --git a/innobase/fil/fil0fil.c b/innobase/fil/fil0fil.c index f55df90846c..3bca2d460d0 100644 --- a/innobase/fil/fil0fil.c +++ b/innobase/fil/fil0fil.c @@ -632,7 +632,7 @@ fil_space_create( /* Spaces with an odd id number are reserved to replicate spaces used in log debugging */ - ut_anp((purpose == FIL_LOG) || (id % 2 == 0)); + ut_a((purpose == FIL_LOG) || (id % 2 == 0)); #endif mutex_enter(&(system->mutex)); @@ -1230,8 +1230,8 @@ loop: /* Do aio */ - ut_anp(byte_offset % OS_FILE_LOG_BLOCK_SIZE == 0); - ut_anp((len % OS_FILE_LOG_BLOCK_SIZE) == 0); + ut_a(byte_offset % OS_FILE_LOG_BLOCK_SIZE == 0); + ut_a((len % OS_FILE_LOG_BLOCK_SIZE) == 0); /* Queue the aio request */ ret = os_aio(type, mode | wake_later, node->name, node->handle, buf, diff --git a/innobase/fsp/fsp0fsp.c b/innobase/fsp/fsp0fsp.c index 2cb3ad43e7f..61114b93601 100644 --- a/innobase/fsp/fsp0fsp.c +++ b/innobase/fsp/fsp0fsp.c @@ -2940,7 +2940,7 @@ fseg_free_step( freed yet */ ut_a(descr); - ut_anp(xdes_get_bit(descr, XDES_FREE_BIT, buf_frame_get_page_no(header) + ut_a(xdes_get_bit(descr, XDES_FREE_BIT, buf_frame_get_page_no(header) % FSP_EXTENT_SIZE, mtr) == FALSE); inode = fseg_inode_get(header, mtr); diff --git a/innobase/include/ut0dbg.h b/innobase/include/ut0dbg.h index 54df031067f..bec9cdd42b5 100644 --- a/innobase/include/ut0dbg.h +++ b/innobase/include/ut0dbg.h @@ -10,7 +10,6 @@ Created 1/30/1994 Heikki Tuuri #define ut0dbg_h #include "univ.i" -#include #include #include "os0thread.h" @@ -20,110 +19,46 @@ extern ibool ut_dbg_stop_threads; extern ulint* ut_dbg_null_ptr; -#define ut_a(EXPR)\ -{\ - ulint dbg_i;\ -\ +extern const char* ut_dbg_msg_assert_fail; +extern const char* ut_dbg_msg_trap; +extern const char* ut_dbg_msg_stop; + +#define ut_a(EXPR) do {\ if (!((ulint)(EXPR) + ut_dbg_zero)) {\ ut_print_timestamp(stderr);\ - fprintf(stderr,\ - " InnoDB: Assertion failure in thread %lu in file %s line %lu\n",\ - os_thread_pf(os_thread_get_curr_id()), IB__FILE__,\ + fprintf(stderr, ut_dbg_msg_assert_fail,\ + os_thread_pf(os_thread_get_curr_id()), __FILE__,\ (ulint)__LINE__);\ - fprintf(stderr,\ - "InnoDB: Failing assertion: " #EXPR);\ - fprintf(stderr,\ - "\nInnoDB: We intentionally generate a memory trap.\n");\ - fprintf(stderr,\ - "InnoDB: Send a detailed bug report to mysql@lists.mysql.com\n"\ - "InnoDB: If you get repeated assertion failures or crashes, even\n"\ - "InnoDB: immediately after the mysqld startup, there may be\n"\ - "InnoDB: corruption in the InnoDB tablespace. See section 6.1 of\n"\ - "InnoDB: http://www.innodb.com/ibman.php about forcing recovery.\n");\ + fputs("InnoDB: Failing assertion: " #EXPR "\n", stderr);\ + fputs(ut_dbg_msg_trap, stderr);\ ut_dbg_stop_threads = TRUE;\ - dbg_i = *(ut_dbg_null_ptr);\ - if (dbg_i) {\ - ut_dbg_null_ptr = NULL;\ - }\ + if (*(ut_dbg_null_ptr)) ut_dbg_null_ptr = NULL;\ }\ if (ut_dbg_stop_threads) {\ - fprintf(stderr,\ - "InnoDB: Thread %lu stopped in file %s line %lu\n",\ - os_thread_pf(os_thread_get_curr_id()), IB__FILE__, (ulint)__LINE__);\ + fprintf(stderr, ut_dbg_msg_stop,\ + os_thread_pf(os_thread_get_curr_id()), __FILE__, (ulint)__LINE__);\ os_thread_sleep(1000000000);\ }\ -} +} while (0) -/* This can be used if there are % characters in the assertion formula: -if we try to printf the formula gcc would complain of illegal print -format characters */ -#define ut_anp(EXPR)\ -{\ - ulint dbg_i;\ -\ - if (!((ulint)(EXPR) + ut_dbg_zero)) {\ - ut_print_timestamp(stderr);\ - fprintf(stderr,\ - " InnoDB: Assertion failure in thread %lu in file %s line %lu\n",\ - os_thread_pf(os_thread_get_curr_id()), IB__FILE__,\ - (ulint)__LINE__);\ - fprintf(stderr,\ - "\nInnoDB: We intentionally generate a memory trap.\n");\ - fprintf(stderr,\ - "InnoDB: Send a detailed bug report to mysql@lists.mysql.com\n"\ - "InnoDB: If you get repeated assertion failures or crashes, even\n"\ - "InnoDB: immediately after the mysqld startup, there may be\n"\ - "InnoDB: corruption in the InnoDB tablespace. See section 6.1 of\n"\ - "InnoDB: http://www.innodb.com/ibman.php about forcing recovery.\n");\ - ut_dbg_stop_threads = TRUE;\ - dbg_i = *(ut_dbg_null_ptr);\ - if (dbg_i) {\ - ut_dbg_null_ptr = NULL;\ - }\ - }\ - if (ut_dbg_stop_threads) {\ - fprintf(stderr,\ - "InnoDB: Thread %lu stopped in file %s line %lu\n",\ - os_thread_pf(os_thread_get_curr_id()), IB__FILE__, (ulint)__LINE__);\ - os_thread_sleep(1000000000);\ - }\ -} - -#define ut_error {\ - ulint dbg_i;\ - ut_print_timestamp(stderr);\ - fprintf(stderr,\ - " InnoDB: Assertion failure in thread %lu in file %s line %lu\n",\ - os_thread_pf(os_thread_get_curr_id()), IB__FILE__, (ulint)__LINE__);\ - fprintf(stderr,\ - "InnoDB: We intentionally generate a memory trap.\n");\ - fprintf(stderr,\ - "InnoDB: Send a detailed bug report to mysql@lists.mysql.com\n"\ - "InnoDB: If you get repeated assertion failures or crashes, even\n"\ - "InnoDB: immediately after the mysqld startup, there may be\n"\ - "InnoDB: corruption in the InnoDB tablespace. See section 6.1 of\n"\ - "InnoDB: http://www.innodb.com/ibman.php about forcing recovery.\n");\ - ut_dbg_stop_threads = TRUE;\ - dbg_i = *(ut_dbg_null_ptr);\ - printf("%lu", dbg_i);\ -} +#define ut_error do {\ + ut_print_timestamp(stderr);\ + fprintf(stderr, ut_dbg_msg_assert_fail,\ + os_thread_pf(os_thread_get_curr_id()), __FILE__, (ulint)__LINE__);\ + fprintf(stderr, ut_dbg_msg_trap);\ + ut_dbg_stop_threads = TRUE;\ + if (*(ut_dbg_null_ptr)) ut_dbg_null_ptr = NULL;\ +} while (0) #ifdef UNIV_DEBUG -#define ut_ad(EXPR) ut_a(EXPR) -#define ut_d(EXPR) {EXPR;} +# define ut_ad(EXPR) ut_a(EXPR) +# define ut_d(EXPR) do {EXPR;} while (0) #else -#define ut_ad(EXPR) -#define ut_d(EXPR) +# define ut_ad(EXPR) +# define ut_d(EXPR) #endif - #define UT_NOT_USED(A) A = A - - - - - - #endif diff --git a/innobase/log/log0log.c b/innobase/log/log0log.c index 5df63e39296..cd2b6f520b0 100644 --- a/innobase/log/log0log.c +++ b/innobase/log/log0log.c @@ -407,7 +407,7 @@ log_pad_current_log_block(void) log_close(); log_release(); - ut_anp((ut_dulint_get_low(lsn) % OS_FILE_LOG_BLOCK_SIZE) + ut_a((ut_dulint_get_low(lsn) % OS_FILE_LOG_BLOCK_SIZE) == LOG_BLOCK_HDR_SIZE); } @@ -1117,8 +1117,8 @@ log_group_write_buf( ulint i; ut_ad(mutex_own(&(log_sys->mutex))); - ut_anp(len % OS_FILE_LOG_BLOCK_SIZE == 0); - ut_anp(ut_dulint_get_low(start_lsn) % OS_FILE_LOG_BLOCK_SIZE == 0); + ut_a(len % OS_FILE_LOG_BLOCK_SIZE == 0); + ut_a(ut_dulint_get_low(start_lsn) % OS_FILE_LOG_BLOCK_SIZE == 0); if (new_data_offset == 0) { write_header = TRUE; @@ -2190,11 +2190,11 @@ log_group_archive( start_lsn = log_sys->archived_lsn; - ut_anp(ut_dulint_get_low(start_lsn) % OS_FILE_LOG_BLOCK_SIZE == 0); + ut_a(ut_dulint_get_low(start_lsn) % OS_FILE_LOG_BLOCK_SIZE == 0); end_lsn = log_sys->next_archived_lsn; - ut_anp(ut_dulint_get_low(end_lsn) % OS_FILE_LOG_BLOCK_SIZE == 0); + ut_a(ut_dulint_get_low(end_lsn) % OS_FILE_LOG_BLOCK_SIZE == 0); buf = log_sys->archive_buf; @@ -2301,7 +2301,7 @@ loop: group->next_archived_file_no = group->archived_file_no + n_files; group->next_archived_offset = next_offset % group->file_size; - ut_anp(group->next_archived_offset % OS_FILE_LOG_BLOCK_SIZE == 0); + ut_a(group->next_archived_offset % OS_FILE_LOG_BLOCK_SIZE == 0); } /********************************************************* @@ -2496,8 +2496,7 @@ loop: start_lsn = log_sys->archived_lsn; if (calc_new_limit) { - ut_anp(log_sys->archive_buf_size % OS_FILE_LOG_BLOCK_SIZE - == 0); + ut_a(log_sys->archive_buf_size % OS_FILE_LOG_BLOCK_SIZE == 0); limit_lsn = ut_dulint_add(start_lsn, log_sys->archive_buf_size); diff --git a/innobase/mem/mem0pool.c b/innobase/mem/mem0pool.c index b004a8c4df7..5ed12fedf43 100644 --- a/innobase/mem/mem0pool.c +++ b/innobase/mem/mem0pool.c @@ -603,7 +603,7 @@ mem_pool_validate( } } - ut_anp(free + pool->reserved == pool->size + ut_a(free + pool->reserved == pool->size - (pool->size % MEM_AREA_MIN_SIZE)); mutex_exit(&(pool->mutex)); diff --git a/innobase/ut/ut0dbg.c b/innobase/ut/ut0dbg.c index d6593b70217..3697e31050f 100644 --- a/innobase/ut/ut0dbg.c +++ b/innobase/ut/ut0dbg.c @@ -18,3 +18,16 @@ ibool ut_dbg_stop_threads = FALSE; /* Null pointer used to generate memory trap */ ulint* ut_dbg_null_ptr = NULL; + +const char* ut_dbg_msg_assert_fail = +"InnoDB: Assertion failure in thread %lu in file %s line %lu\n"; +const char* ut_dbg_msg_trap = +"InnoDB: We intentionally generate a memory trap.\n" +"InnoDB: Send a detailed bug report to mysql@lists.mysql.com.\n" +"InnoDB: If you get repeated assertion failures or crashes, even\n" +"InnoDB: immediately after the mysqld startup, there may be\n" +"InnoDB: corruption in the InnoDB tablespace. See section 6.1 of\n" +"InnoDB: http://www.innodb.com/ibman.php about forcing recovery.\n"; + +const char* ut_dbg_msg_stop = +"InnoDB: Thread %lu stopped in file %s line %lu\n"; From 131fd37cef872ddb798ca9fc262976e558b9d4cd Mon Sep 17 00:00:00 2001 From: "vva@eagle.mysql.r18.ru" <> Date: Fri, 12 Mar 2004 17:55:33 +0400 Subject: [PATCH 56/65] extra correction of check_db_name, check_table_name and check_column_name --- sql/table.cc | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/sql/table.cc b/sql/table.cc index ffe901b9061..a495f1d4f6d 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -1140,7 +1140,7 @@ char *get_field(MEM_ROOT *mem, TABLE *table, uint fieldnr) bool check_db_name(char *name) { char *start=name; - bool space= false; + bool last_char_is_space= FALSE; if (lower_case_table_names) casedn_str(name); @@ -1148,7 +1148,7 @@ bool check_db_name(char *name) while (*name) { #if defined(USE_MB) && defined(USE_MB_IDENT) - space= my_isspace(default_charset_info, *name); + last_char_is_space= my_isspace(default_charset_info, *name); if (use_mb(default_charset_info)) { int len=my_ismbchar(default_charset_info, name, name+MBMAXLEN); @@ -1159,16 +1159,14 @@ bool check_db_name(char *name) } } #else - space= *name==' '; + last_char_is_space= *name==' '; #endif if (*name == '/' || *name == '\\' || *name == FN_LIBCHAR || *name == FN_EXTCHAR) return 1; name++; } - if (space) - return 1; - return name[-1]==' ' || (uint) (name - start) > NAME_LEN; + return last_char_is_space || (uint) (name - start) > NAME_LEN; } @@ -1186,7 +1184,7 @@ bool check_table_name(const char *name, uint length) if (!length || length > NAME_LEN) return 1; #if defined(USE_MB) && defined(USE_MB_IDENT) - bool space= false; + bool last_char_is_space= FALSE; #else if (name[length-1]==' ') return 1; @@ -1195,7 +1193,7 @@ bool check_table_name(const char *name, uint length) while (name != end) { #if defined(USE_MB) && defined(USE_MB_IDENT) - space= my_isspace(default_charset_info, *name); + last_char_is_space= my_isspace(default_charset_info, *name); if (use_mb(default_charset_info)) { int len=my_ismbchar(default_charset_info, name, end); @@ -1211,21 +1209,21 @@ bool check_table_name(const char *name, uint length) name++; } #if defined(USE_MB) && defined(USE_MB_IDENT) - if (space) - return 1; -#endif + return last_char_is_space; +#else return 0; +#endif } bool check_column_name(const char *name) { const char *start= name; - bool space= false; - + bool last_char_is_space= false; + while (*name) { #if defined(USE_MB) && defined(USE_MB_IDENT) - space= my_isspace(default_charset_info, *name); + last_char_is_space= my_isspace(default_charset_info, *name); if (use_mb(default_charset_info)) { int len=my_ismbchar(default_charset_info, name, name+MBMAXLEN); @@ -1236,16 +1234,14 @@ bool check_column_name(const char *name) } } #else - space= *name==' '; + last_char_is_space= *name==' '; #endif if (*name == NAMES_SEP_CHAR) return 1; name++; } - if (space) - return 1; /* Error if empty or too long column name */ - return (name == start || (uint) (name - start) > NAME_LEN); + return last_char_is_space || (name == start || (uint) (name - start) > NAME_LEN); } /* From e9e9ce659e24377e9f14780381672846b0aab864 Mon Sep 17 00:00:00 2001 From: "monty@mysql.com" <> Date: Fri, 12 Mar 2004 15:56:28 +0200 Subject: [PATCH 57/65] Fixes to newly pushed code --- sql/sql_db.cc | 4 ++-- sql/table.cc | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/sql/sql_db.cc b/sql/sql_db.cc index b5339f0d535..1217a909071 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -381,13 +381,13 @@ bool mysql_change_db(THD *thd,const char *name) ulong db_access; DBUG_ENTER("mysql_change_db"); - if (!dbname || !(db_length= strlength(dbname))) + if (!dbname || !(db_length= strlen(dbname))) { x_free(dbname); /* purecov: inspected */ send_error(&thd->net,ER_NO_DB_ERROR); /* purecov: inspected */ DBUG_RETURN(1); /* purecov: inspected */ } - if ((db_length > NAME_LEN) || check_db_name(dbname)) + if (check_db_name(dbname)) { net_printf(&thd->net,ER_WRONG_DB_NAME, dbname); x_free(dbname); diff --git a/sql/table.cc b/sql/table.cc index d7944e6dd80..01a09426634 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -1216,10 +1216,11 @@ bool check_table_name(const char *name, uint length) #endif } + bool check_column_name(const char *name) { const char *start= name; - bool last_char_is_space= false; + bool last_char_is_space= FALSE; while (*name) { From 4573eb566c6201103cda1ef5e079d010cd137802 Mon Sep 17 00:00:00 2001 From: "marko@hundin.mysql.fi" <> Date: Fri, 12 Mar 2004 17:14:51 +0200 Subject: [PATCH 58/65] Allow UNIV_SYNC_DEBUG to be disabled while UNIV_DEBUG is enabled --- innobase/btr/btr0btr.c | 13 ++++- innobase/btr/btr0cur.c | 18 ++++--- innobase/btr/btr0pcur.c | 4 +- innobase/btr/btr0sea.c | 64 +++++++++++++++++------- innobase/buf/buf0buf.c | 9 ++-- innobase/buf/buf0flu.c | 11 ++++- innobase/buf/buf0lru.c | 16 +++++- innobase/dict/dict0boot.c | 5 +- innobase/dict/dict0crea.c | 28 ++++++++--- innobase/dict/dict0dict.c | 52 +++++++++++++++++++- innobase/dict/dict0load.c | 20 ++++++++ innobase/fil/fil0fil.c | 8 +++ innobase/fsp/fsp0fsp.c | 51 +++++++++++++++---- innobase/ha/ha0ha.c | 9 ++-- innobase/ibuf/ibuf0ibuf.c | 32 ++++++++++-- innobase/include/btr0sea.ic | 6 ++- innobase/include/buf0buf.h | 10 ++-- innobase/include/buf0buf.ic | 12 ++++- innobase/include/buf0flu.ic | 4 ++ innobase/include/dict0dict.ic | 10 +++- innobase/include/fut0fut.ic | 2 + innobase/include/ha0ha.ic | 12 +++++ innobase/include/hash0hash.h | 55 ++++++++------------- innobase/include/lock0lock.ic | 2 + innobase/include/log0log.ic | 8 +++ innobase/include/row0upd.ic | 2 + innobase/include/sync0rw.h | 14 +++++- innobase/include/sync0rw.ic | 9 ++-- innobase/include/sync0sync.h | 14 ++++-- innobase/include/sync0sync.ic | 9 ++-- innobase/include/trx0rseg.ic | 4 ++ innobase/include/trx0sys.ic | 22 +++++++++ innobase/include/trx0undo.ic | 4 ++ innobase/lock/lock0lock.c | 92 +++++++++++++++++++++++++++++++++++ innobase/log/log0log.c | 54 +++++++++++++++++++- innobase/log/log0recv.c | 28 ++++++++--- innobase/mem/mem0pool.c | 2 + innobase/read/read0read.c | 12 +++-- innobase/row/row0ins.c | 4 +- innobase/row/row0mysql.c | 12 ++++- innobase/row/row0purge.c | 2 + innobase/row/row0sel.c | 2 + innobase/row/row0vers.c | 8 +++ innobase/srv/srv0que.c | 2 + innobase/srv/srv0srv.c | 10 ++++ innobase/sync/sync0arr.c | 22 ++++++--- innobase/sync/sync0rw.c | 34 +++++-------- innobase/sync/sync0sync.c | 75 +++++++++++++--------------- innobase/thr/thr0loc.c | 2 + innobase/trx/trx0purge.c | 20 ++++++++ innobase/trx/trx0rec.c | 6 +++ innobase/trx/trx0roll.c | 14 ++++++ innobase/trx/trx0rseg.c | 8 ++- innobase/trx/trx0sys.c | 16 ++++++ innobase/trx/trx0trx.c | 34 +++++++++++++ innobase/trx/trx0undo.c | 40 ++++++++++++--- 56 files changed, 830 insertions(+), 208 deletions(-) diff --git a/innobase/btr/btr0btr.c b/innobase/btr/btr0btr.c index 1af9336ce72..6c9bccb81e8 100644 --- a/innobase/btr/btr0btr.c +++ b/innobase/btr/btr0btr.c @@ -299,7 +299,9 @@ btr_page_alloc_for_ibuf( new_page = buf_page_get(dict_tree_get_space(tree), node_addr.page, RW_X_LATCH, mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(new_page, SYNC_TREE_NODE_NEW); +#endif /* UNIV_SYNC_DEBUG */ flst_remove(root + PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST, new_page + PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST_NODE, @@ -357,7 +359,9 @@ btr_page_alloc( new_page = buf_page_get(dict_tree_get_space(tree), new_page_no, RW_X_LATCH, mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(new_page, SYNC_TREE_NODE_NEW); +#endif /* UNIV_SYNC_DEBUG */ return(new_page); } @@ -663,8 +667,9 @@ btr_create( ibuf_hdr_frame = fseg_create(space, 0, IBUF_HEADER + IBUF_TREE_SEG_HEADER, mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(ibuf_hdr_frame, SYNC_TREE_NODE_NEW); - +#endif /* UNIV_SYNC_DEBUG */ ut_ad(buf_frame_get_page_no(ibuf_hdr_frame) == IBUF_HEADER_PAGE_NO); /* Allocate then the next page to the segment: it will be the @@ -689,7 +694,9 @@ btr_create( page_no = buf_frame_get_page_no(frame); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(frame, SYNC_TREE_NODE_NEW); +#endif /* UNIV_SYNC_DEBUG */ if (type & DICT_IBUF) { /* It is an insert buffer tree: initialize the free list */ @@ -704,7 +711,9 @@ btr_create( mtr); /* The fseg create acquires a second latch on the page, therefore we must declare it: */ +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(frame, SYNC_TREE_NODE_NEW); +#endif /* UNIV_SYNC_DEBUG */ } /* Create a new index page on the the allocated segment page */ @@ -1517,7 +1526,9 @@ func_start: ut_ad(mtr_memo_contains(mtr, dict_tree_get_lock(tree), MTR_MEMO_X_LOCK)); +#ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(dict_tree_get_lock(tree), RW_LOCK_EX)); +#endif /* UNIV_SYNC_DEBUG */ page = btr_cur_get_page(cursor); diff --git a/innobase/btr/btr0cur.c b/innobase/btr/btr0cur.c index d506c5a91a7..6e1794c2ff7 100644 --- a/innobase/btr/btr0cur.c +++ b/innobase/btr/btr0cur.c @@ -3146,8 +3146,10 @@ btr_store_big_rec_extern_fields( prev_page_no, RW_X_LATCH, &mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(prev_page, SYNC_EXTERN_STORAGE); +#endif /* UNIV_SYNC_DEBUG */ mlog_write_ulint(prev_page + FIL_PAGE_DATA + BTR_BLOB_HDR_NEXT_PAGE_NO, @@ -3182,9 +3184,9 @@ btr_store_big_rec_extern_fields( rec_page = buf_page_get(space_id, buf_frame_get_page_no(data), RW_X_LATCH, &mtr); - +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(rec_page, SYNC_NO_ORDER_CHECK); - +#endif /* UNIV_SYNC_DEBUG */ mlog_write_ulint(data + local_len + BTR_EXTERN_LEN, 0, MLOG_4BYTES, &mtr); mlog_write_ulint(data + local_len + BTR_EXTERN_LEN + 4, @@ -3276,9 +3278,9 @@ btr_free_externally_stored_field( rec_page = buf_page_get(buf_frame_get_space_id(data), buf_frame_get_page_no(data), RW_X_LATCH, &mtr); - +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(rec_page, SYNC_NO_ORDER_CHECK); - +#endif /* UNIV_SYNC_DEBUG */ space_id = mach_read_from_4(data + local_len + BTR_EXTERN_SPACE_ID); @@ -3321,9 +3323,9 @@ btr_free_externally_stored_field( } page = buf_page_get(space_id, page_no, RW_X_LATCH, &mtr); - +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_EXTERN_STORAGE); - +#endif /* UNIV_SYNC_DEBUG */ next_page_no = mach_read_from_4(page + FIL_PAGE_DATA + BTR_BLOB_HDR_NEXT_PAGE_NO); @@ -3501,9 +3503,9 @@ btr_copy_externally_stored_field( mtr_start(&mtr); page = buf_page_get(space_id, page_no, RW_S_LATCH, &mtr); - +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_EXTERN_STORAGE); - +#endif /* UNIV_SYNC_DEBUG */ blob_header = page + offset; part_len = btr_blob_get_part_len(blob_header); diff --git a/innobase/btr/btr0pcur.c b/innobase/btr/btr0pcur.c index 63e7763ef87..4725551d4d7 100644 --- a/innobase/btr/btr0pcur.c +++ b/innobase/btr/btr0pcur.c @@ -227,9 +227,9 @@ btr_pcur_restore_position( if (buf_page_optimistic_get(latch_mode, page, cursor->modify_clock, mtr)) { cursor->pos_state = BTR_PCUR_IS_POSITIONED; - +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_TREE_NODE); - +#endif /* UNIV_SYNC_DEBUG */ if (cursor->rel_pos == BTR_PCUR_ON) { cursor->latch_mode = latch_mode; diff --git a/innobase/btr/btr0sea.c b/innobase/btr/btr0sea.c index 68f631dcba5..9421ca48718 100644 --- a/innobase/btr/btr0sea.c +++ b/innobase/btr/btr0sea.c @@ -93,8 +93,10 @@ btr_search_check_free_space_in_heap(void) hash_table_t* table; mem_heap_t* heap; - ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_SHARED) - && !rw_lock_own(&btr_search_latch, RW_LOCK_EX)); +#ifdef UNIV_SYNC_DEBUG + ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_SHARED)); + ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_EX)); +#endif /* UNIV_SYNC_DEBUG */ table = btr_search_sys->hash_index; @@ -194,8 +196,10 @@ btr_search_info_update_hash( ulint n_unique; int cmp; - ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_SHARED) - && !rw_lock_own(&btr_search_latch, RW_LOCK_EX)); +#ifdef UNIV_SYNC_DEBUG + ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_SHARED)); + ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_EX)); +#endif /* UNIV_SYNC_DEBUG */ index = cursor->index; @@ -317,10 +321,12 @@ btr_search_update_block_hash_info( buf_block_t* block, /* in: buffer block */ btr_cur_t* cursor) /* in: cursor */ { - ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_SHARED) - && !rw_lock_own(&btr_search_latch, RW_LOCK_EX)); - ut_ad(rw_lock_own(&(block->lock), RW_LOCK_SHARED) - || rw_lock_own(&(block->lock), RW_LOCK_EX)); +#ifdef UNIV_SYNC_DEBUG + ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_SHARED)); + ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_EX)); + ut_ad(rw_lock_own(&((buf_block_t*) block)->lock, RW_LOCK_SHARED) + || rw_lock_own(&((buf_block_t*) block)->lock, RW_LOCK_EX)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(cursor); info->last_hash_succ = FALSE; @@ -398,9 +404,11 @@ btr_search_update_hash_ref( dulint tree_id; ut_ad(cursor->flag == BTR_CUR_HASH_FAIL); +#ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(&btr_search_latch, RW_LOCK_EX)); ut_ad(rw_lock_own(&(block->lock), RW_LOCK_SHARED) || rw_lock_own(&(block->lock), RW_LOCK_EX)); +#endif /* UNIV_SYNC_DEBUG */ if (block->is_hashed && (info->n_hash_potential > 0) && (block->curr_n_fields == info->n_fields) @@ -419,7 +427,9 @@ btr_search_update_hash_ref( fold = rec_fold(rec, block->curr_n_fields, block->curr_n_bytes, tree_id); +#ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(&btr_search_latch, RW_LOCK_EX)); +#endif /* UNIV_SYNC_DEBUG */ ha_insert_for_fold(btr_search_sys->hash_index, fold, rec); } @@ -439,8 +449,10 @@ btr_search_info_update_slow( ulint* params; ulint* params2; - ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_SHARED) - && !rw_lock_own(&btr_search_latch, RW_LOCK_EX)); +#ifdef UNIV_SYNC_DEBUG + ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_SHARED)); + ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_EX)); +#endif /* UNIV_SYNC_DEBUG */ block = buf_block_align(btr_cur_get_rec(cursor)); @@ -762,7 +774,9 @@ btr_search_guess_on_hash( can_only_compare_to_cursor_rec = FALSE; +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_TREE_NODE_FROM_HASH); +#endif /* UNIV_SYNC_DEBUG */ } block = buf_block_align(page); @@ -910,10 +924,12 @@ btr_search_drop_page_hash_index( ulint n_recs; ulint* folds; ulint i; - - ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_SHARED) - && !rw_lock_own(&btr_search_latch, RW_LOCK_EX)); - + +#ifdef UNIV_SYNC_DEBUG + ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_SHARED)); + ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_EX)); +#endif /* UNIV_SYNC_DEBUG */ + rw_lock_s_lock(&btr_search_latch); block = buf_block_align(page); @@ -927,9 +943,11 @@ btr_search_drop_page_hash_index( table = btr_search_sys->hash_index; +#ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(&(block->lock), RW_LOCK_SHARED) || rw_lock_own(&(block->lock), RW_LOCK_EX) || (block->buf_fix_count == 0)); +#endif /* UNIV_SYNC_DEBUG */ n_fields = block->curr_n_fields; n_bytes = block->curr_n_bytes; @@ -1029,8 +1047,10 @@ btr_search_drop_page_hash_when_freed( page = buf_page_get(space, page_no, RW_S_LATCH, &mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_TREE_NODE_FROM_HASH); - +#endif /* UNIV_SYNC_DEBUG */ + btr_search_drop_page_hash_index(page); mtr_commit(&mtr); @@ -1070,9 +1090,11 @@ btr_search_build_page_hash_index( block = buf_block_align(page); table = btr_search_sys->hash_index; +#ifdef UNIV_SYNC_DEBUG ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_EX)); ut_ad(rw_lock_own(&(block->lock), RW_LOCK_SHARED) || rw_lock_own(&(block->lock), RW_LOCK_EX)); +#endif /* UNIV_SYNC_DEBUG */ rw_lock_s_lock(&btr_search_latch); @@ -1235,8 +1257,10 @@ btr_search_move_or_delete_hash_entries( block = buf_block_align(page); new_block = buf_block_align(new_page); - ut_ad(rw_lock_own(&(block->lock), RW_LOCK_EX) - && rw_lock_own(&(new_block->lock), RW_LOCK_EX)); +#ifdef UNIV_SYNC_DEBUG + ut_ad(rw_lock_own(&(block->lock), RW_LOCK_EX)); + ut_ad(rw_lock_own(&(new_block->lock), RW_LOCK_EX)); +#endif /* UNIV_SYNC_DEBUG */ rw_lock_s_lock(&btr_search_latch); @@ -1296,7 +1320,9 @@ btr_search_update_hash_on_delete( block = buf_block_align(rec); +#ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(&(block->lock), RW_LOCK_EX)); +#endif /* UNIV_SYNC_DEBUG */ if (!block->is_hashed) { @@ -1337,7 +1363,9 @@ btr_search_update_hash_node_on_insert( block = buf_block_align(rec); +#ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(&(block->lock), RW_LOCK_EX)); +#endif /* UNIV_SYNC_DEBUG */ if (!block->is_hashed) { @@ -1398,7 +1426,9 @@ btr_search_update_hash_on_insert( block = buf_block_align(rec); +#ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(&(block->lock), RW_LOCK_EX)); +#endif /* UNIV_SYNC_DEBUG */ if (!block->is_hashed) { diff --git a/innobase/buf/buf0buf.c b/innobase/buf/buf0buf.c index 1c0315131b2..e2661725912 100644 --- a/innobase/buf/buf0buf.c +++ b/innobase/buf/buf0buf.c @@ -446,9 +446,10 @@ buf_block_init( rw_lock_create(&(block->read_lock)); rw_lock_set_level(&(block->read_lock), SYNC_NO_ORDER_CHECK); - +#ifdef UNIV_SYNC_DEBUG rw_lock_create(&(block->debug_latch)); rw_lock_set_level(&(block->debug_latch), SYNC_NO_ORDER_CHECK); +#endif /* UNIV_SYNC_DEBUG */ } /************************************************************************ @@ -1088,9 +1089,9 @@ buf_page_optimistic_get_func( } if (!UT_DULINT_EQ(modify_clock, block->modify_clock)) { - +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(block->frame, SYNC_NO_ORDER_CHECK); - +#endif /* UNIV_SYNC_DEBUG */ if (rw_latch == RW_S_LATCH) { rw_lock_s_unlock(&(block->lock)); } else { @@ -1285,7 +1286,9 @@ buf_page_init( in units of a page */ buf_block_t* block) /* in: block to init */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(buf_pool->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(block->state == BUF_BLOCK_READY_FOR_USE); /* Set the state of the block */ diff --git a/innobase/buf/buf0flu.c b/innobase/buf/buf0flu.c index c0999ee4841..9ed99096451 100644 --- a/innobase/buf/buf0flu.c +++ b/innobase/buf/buf0flu.c @@ -47,7 +47,9 @@ buf_flush_insert_into_flush_list( /*=============================*/ buf_block_t* block) /* in: block which is modified */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(buf_pool->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad((UT_LIST_GET_FIRST(buf_pool->flush_list) == NULL) || (ut_dulint_cmp( @@ -73,7 +75,9 @@ buf_flush_insert_sorted_into_flush_list( buf_block_t* prev_b; buf_block_t* b; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(buf_pool->mutex))); +#endif /* UNIV_SYNC_DEBUG */ prev_b = NULL; b = UT_LIST_GET_FIRST(buf_pool->flush_list); @@ -105,7 +109,9 @@ buf_flush_ready_for_replace( buf_block_t* block) /* in: buffer control block, must be in state BUF_BLOCK_FILE_PAGE and in the LRU list*/ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(buf_pool->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_a(block->state == BUF_BLOCK_FILE_PAGE); if ((ut_dulint_cmp(block->oldest_modification, ut_dulint_zero) > 0) @@ -129,7 +135,9 @@ buf_flush_ready_for_flush( BUF_BLOCK_FILE_PAGE */ ulint flush_type)/* in: BUF_FLUSH_LRU or BUF_FLUSH_LIST */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(buf_pool->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(block->state == BUF_BLOCK_FILE_PAGE); if ((ut_dulint_cmp(block->oldest_modification, ut_dulint_zero) > 0) @@ -161,8 +169,9 @@ buf_flush_write_complete( buf_block_t* block) /* in: pointer to the block in question */ { ut_ad(block); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(buf_pool->mutex))); - +#endif /* UNIV_SYNC_DEBUG */ block->oldest_modification = ut_dulint_zero; UT_LIST_REMOVE(flush_list, buf_pool->flush_list, block); diff --git a/innobase/buf/buf0lru.c b/innobase/buf/buf0lru.c index 1d49833969f..c0b0cfbb6ea 100644 --- a/innobase/buf/buf0lru.c +++ b/innobase/buf/buf0lru.c @@ -370,7 +370,9 @@ buf_LRU_old_adjust_len(void) ulint new_len; ut_ad(buf_pool->LRU_old); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(buf_pool->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(3 * (BUF_LRU_OLD_MIN_LEN / 8) > BUF_LRU_OLD_TOLERANCE + 5); for (;;) { @@ -440,7 +442,9 @@ buf_LRU_remove_block( { ut_ad(buf_pool); ut_ad(block); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(buf_pool->mutex))); +#endif /* UNIV_SYNC_DEBUG */ /* If the LRU_old pointer is defined and points to just this block, move it backward one step */ @@ -493,7 +497,9 @@ buf_LRU_add_block_to_end_low( ut_ad(buf_pool); ut_ad(block); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(buf_pool->mutex))); +#endif /* UNIV_SYNC_DEBUG */ block->old = TRUE; @@ -545,7 +551,9 @@ buf_LRU_add_block_low( ut_ad(buf_pool); ut_ad(block); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(buf_pool->mutex))); +#endif /* UNIV_SYNC_DEBUG */ block->old = old; cl = buf_pool_clock_tic(); @@ -632,7 +640,9 @@ buf_LRU_block_free_non_file_page( /*=============================*/ buf_block_t* block) /* in: block, must not contain a file page */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(buf_pool->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(block); ut_ad((block->state == BUF_BLOCK_MEMORY) @@ -658,7 +668,9 @@ buf_LRU_block_remove_hashed_page( be in a state where it can be freed; there may or may not be a hash index to the page */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(buf_pool->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(block); ut_ad(block->state == BUF_BLOCK_FILE_PAGE); @@ -672,7 +684,7 @@ buf_LRU_block_remove_hashed_page( buf_pool->freed_page_clock += 1; buf_frame_modify_clock_inc(block->frame); - + HASH_DELETE(buf_block_t, hash, buf_pool->page_hash, buf_page_address_fold(block->space, block->offset), block); @@ -689,7 +701,9 @@ buf_LRU_block_free_hashed_page( buf_block_t* block) /* in: block, must contain a file page and be in a state where it can be freed */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(buf_pool->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(block->state == BUF_BLOCK_REMOVE_HASH); block->state = BUF_BLOCK_MEMORY; diff --git a/innobase/dict/dict0boot.c b/innobase/dict/dict0boot.c index 0bf2ace3324..7985dbeee66 100644 --- a/innobase/dict/dict0boot.c +++ b/innobase/dict/dict0boot.c @@ -39,8 +39,9 @@ dict_hdr_get( header = DICT_HDR + buf_page_get(DICT_HDR_SPACE, DICT_HDR_PAGE_NO, RW_X_LATCH, mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(header, SYNC_DICT_HEADER); - +#endif /* UNIV_SYNC_DEBUG */ return(header); } @@ -94,7 +95,9 @@ dict_hdr_flush_row_id(void) dulint id; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ id = dict_sys->row_id; diff --git a/innobase/dict/dict0crea.c b/innobase/dict/dict0crea.c index d6e817d465e..36fa0fc640e 100644 --- a/innobase/dict/dict0crea.c +++ b/innobase/dict/dict0crea.c @@ -270,9 +270,10 @@ dict_build_table_def_step( dict_table_t* cluster_table; dtuple_t* row; - UT_NOT_USED(thr); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); - +#endif /* UNIV_SYNC_DEBUG */ + table = node->table; table->id = dict_hdr_get_new_id(DICT_HDR_TABLE_ID); @@ -341,7 +342,9 @@ dict_create_sys_indexes_tuple( byte* ptr; UT_NOT_USED(trx); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(index && heap); sys_indexes = dict_sys->sys_indexes; @@ -534,8 +537,9 @@ dict_build_index_def_step( dict_index_t* index; dtuple_t* row; - UT_NOT_USED(thr); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ index = node->index; @@ -607,8 +611,10 @@ dict_create_index_tree_step( dtuple_t* search_tuple; btr_pcur_t pcur; mtr_t mtr; - + +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ UT_NOT_USED(thr); index = node->index; @@ -670,7 +676,9 @@ dict_drop_index_tree( byte* ptr; ulint len; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ptr = rec_get_nth_field(rec, DICT_SYS_INDEXES_PAGE_NO_FIELD, &len); @@ -791,8 +799,10 @@ dict_create_table_step( trx_t* trx; ut_ad(thr); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); - +#endif /* UNIV_SYNC_DEBUG */ + trx = thr_get_trx(thr); node = thr->run_node; @@ -899,7 +909,9 @@ dict_create_index_step( trx_t* trx; ut_ad(thr); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ trx = thr_get_trx(thr); @@ -1160,7 +1172,9 @@ dict_create_add_foreigns_to_dictionary( ulint i; char buf[10000]; - ut_ad(mutex_own(&(dict_sys->mutex))); +#ifdef UNIV_SYNC_DEBUG + ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ if (NULL == dict_table_get_low((char *) "SYS_FOREIGN")) { fprintf(stderr, @@ -1221,7 +1235,7 @@ loop: foreign->referenced_col_names[i]); } - ut_a(len < (sizeof buf) - 19) + ut_a(len < (sizeof buf) - 19); len += sprintf(buf + len,"COMMIT WORK;\nEND;\n"); graph = pars_sql(buf); diff --git a/innobase/dict/dict0dict.c b/innobase/dict/dict0dict.c index 223b4a941cc..a9e0a5c4600 100644 --- a/innobase/dict/dict0dict.c +++ b/innobase/dict/dict0dict.c @@ -615,7 +615,9 @@ dict_table_get_on_id( if we are doing a rollback to handle an error in TABLE CREATE, for example, we already have the mutex! */ +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ return(dict_table_get_on_id_low(table_id, trx)); } @@ -761,7 +763,9 @@ dict_table_add_to_cache( ulint i; ut_ad(table); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(table->n_def == table->n_cols - DATA_N_SYS_COLS); ut_ad(table->magic_n == DICT_TABLE_MAGIC_N); ut_ad(table->cached == FALSE); @@ -896,8 +900,10 @@ dict_table_rename_in_cache( ulint i; ut_ad(table); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); - +#endif /* UNIV_SYNC_DEBUG */ + old_size = mem_heap_get_size(table->heap); fold = ut_fold_string(new_name); @@ -1095,7 +1101,9 @@ dict_table_remove_from_cache( ulint i; ut_ad(table); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(table->magic_n == DICT_TABLE_MAGIC_N); /* printf("Removing table %s from dictionary cache\n", table->name); */ @@ -1166,7 +1174,9 @@ dict_table_LRU_trim(void) ut_a(0); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ table = UT_LIST_GET_LAST(dict_sys->table_LRU); @@ -1195,7 +1205,9 @@ dict_col_add_to_cache( ulint fold; ut_ad(table && col); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(table->magic_n == DICT_TABLE_MAGIC_N); fold = ut_fold_ulint_pair(ut_fold_string(table->name), @@ -1226,7 +1238,9 @@ dict_col_remove_from_cache( ulint fold; ut_ad(table && col); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(table->magic_n == DICT_TABLE_MAGIC_N); fold = ut_fold_ulint_pair(ut_fold_string(table->name), @@ -1249,7 +1263,9 @@ dict_col_reposition_in_cache( ulint fold; ut_ad(table && col); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(table->magic_n == DICT_TABLE_MAGIC_N); fold = ut_fold_ulint_pair(ut_fold_string(table->name), @@ -1283,7 +1299,9 @@ dict_index_add_to_cache( ulint i; ut_ad(index); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(index->n_def == index->n_fields); ut_ad(index->magic_n == DICT_INDEX_MAGIC_N); @@ -1409,7 +1427,9 @@ dict_index_remove_from_cache( ut_ad(table && index); ut_ad(table->magic_n == DICT_TABLE_MAGIC_N); ut_ad(index->magic_n == DICT_INDEX_MAGIC_N); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(UT_LIST_GET_LEN((index->tree)->tree_indexes) == 1); dict_tree_free(index->tree); @@ -1453,7 +1473,9 @@ dict_index_find_cols( ut_ad(table && index); ut_ad(table->magic_n == DICT_TABLE_MAGIC_N); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ for (i = 0; i < index->n_fields; i++) { field = dict_index_get_nth_field(index, i); @@ -1594,7 +1616,9 @@ dict_index_build_internal_clust( ut_ad(table && index); ut_ad(index->type & DICT_CLUSTERED); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(table->magic_n == DICT_TABLE_MAGIC_N); /* Create a new index object with certainly enough fields */ @@ -1763,7 +1787,9 @@ dict_index_build_internal_non_clust( ut_ad(table && index); ut_ad(0 == (index->type & DICT_CLUSTERED)); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(table->magic_n == DICT_TABLE_MAGIC_N); /* The clustered index should be the first in the list of indexes */ @@ -1882,7 +1908,9 @@ dict_foreign_remove_from_cache( /*===========================*/ dict_foreign_t* foreign) /* in, own: foreign constraint */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_a(foreign); if (foreign->referenced_table) { @@ -1911,7 +1939,9 @@ dict_foreign_find( { dict_foreign_t* foreign; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ foreign = UT_LIST_GET_FIRST(table->foreign_list); @@ -2020,7 +2050,9 @@ dict_foreign_add_to_cache( ibool added_to_referenced_list = FALSE; char* buf = dict_foreign_err_buf; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ for_table = dict_table_check_if_in_cache_low( foreign->foreign_table_name); @@ -2691,7 +2723,9 @@ dict_create_foreign_constraints_low( ulint column_name_lens[500]; char referenced_table_name[2500]; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ table = dict_table_get_low(name); @@ -3271,7 +3305,9 @@ dict_foreign_parse_drop_constraints( str = dict_strip_comments(*(trx->mysql_query_str)); ptr = str; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ loop: ptr = dict_scan_to(ptr, (char *) "DROP"); @@ -3411,7 +3447,9 @@ dict_procedure_reserve_parsed_copy( que_t* graph; proc_node_t* proc_node; +#ifdef UNIV_SYNC_DEBUG ut_ad(!mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ mutex_enter(&(dict_sys->mutex)); @@ -3459,7 +3497,9 @@ dict_procedure_release_parsed_copy( { proc_node_t* proc_node; +#ifdef UNIV_SYNC_DEBUG ut_ad(!mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ mutex_enter(&(dict_sys->mutex)); @@ -3936,7 +3976,9 @@ dict_foreign_print_low( { ulint i; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ printf(" FOREIGN KEY CONSTRAINT %s: %s (", foreign->id, foreign->foreign_table_name); @@ -4001,7 +4043,9 @@ dict_table_print_low( dict_foreign_t* foreign; ulint i; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ dict_update_statistics_low(table, TRUE); @@ -4054,7 +4098,9 @@ dict_col_print_low( { dtype_t* type; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ type = dict_col_get_type(col); printf("%s: ", col->name); @@ -4074,7 +4120,9 @@ dict_index_print_low( ib_longlong n_vals; ulint i; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ tree = index->tree; @@ -4120,7 +4168,9 @@ dict_field_print_low( /*=================*/ dict_field_t* field) /* in: field */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ printf(" %s", field->name); diff --git a/innobase/dict/dict0load.c b/innobase/dict/dict0load.c index 48c445fa0c9..d4b6a5ff9cb 100644 --- a/innobase/dict/dict0load.c +++ b/innobase/dict/dict0load.c @@ -42,7 +42,9 @@ dict_get_first_table_name_in_db( char* table_name; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ heap = mem_heap_create(1000); @@ -212,7 +214,9 @@ dict_load_columns( ulint i; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ mtr_start(&mtr); @@ -310,7 +314,9 @@ dict_load_fields( ulint i; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ UT_NOT_USED(table); @@ -422,7 +428,9 @@ dict_load_indexes( dulint id; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ if ((ut_dulint_get_high(table->id) == 0) && (ut_dulint_get_low(table->id) < DICT_HDR_FIRST_ID)) { @@ -591,7 +599,9 @@ dict_load_table( ulint err; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ heap = mem_heap_create(1000); @@ -744,7 +754,9 @@ dict_load_table_on_id( char* name; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ /* NOTE that the operation of this function is protected by the dictionary mutex, and therefore no deadlocks can occur @@ -829,7 +841,9 @@ dict_load_sys_table( { mem_heap_t* heap; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ heap = mem_heap_create(1000); @@ -860,7 +874,9 @@ dict_load_foreign_cols( ulint i; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ foreign->foreign_col_names = mem_heap_alloc(foreign->heap, foreign->n_fields * sizeof(void*)); @@ -941,7 +957,9 @@ dict_load_foreign( ulint err; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ heap2 = mem_heap_create(1000); @@ -1073,7 +1091,9 @@ dict_load_foreigns( ulint err; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ sys_foreign = dict_table_get_low((char *) "SYS_FOREIGN"); diff --git a/innobase/fil/fil0fil.c b/innobase/fil/fil0fil.c index 3bca2d460d0..45b3d53d270 100644 --- a/innobase/fil/fil0fil.c +++ b/innobase/fil/fil0fil.c @@ -332,7 +332,9 @@ fil_node_close( ibool ret; ut_ad(node && system); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(system->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_a(node->open); ut_a(node->n_pending == 0); @@ -356,7 +358,9 @@ fil_node_free( fil_space_t* space) /* in: space where the file node is chained */ { ut_ad(node && system && space); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(system->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_a(node->magic_n == FIL_NODE_MAGIC_N); if (node->open) { @@ -875,7 +879,9 @@ fil_node_prepare_for_io( fil_node_t* last_node; ut_ad(node && system && space); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(system->mutex))); +#endif /* UNIV_SYNC_DEBUG */ if (node->open == FALSE) { /* File is closed */ @@ -952,7 +958,9 @@ fil_node_complete_io( { ut_ad(node); ut_ad(system); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(system->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_a(node->n_pending > 0); node->n_pending--; diff --git a/innobase/fsp/fsp0fsp.c b/innobase/fsp/fsp0fsp.c index 61114b93601..f1c86e1f571 100644 --- a/innobase/fsp/fsp0fsp.c +++ b/innobase/fsp/fsp0fsp.c @@ -301,9 +301,9 @@ fsp_get_space_header( ut_ad(mtr); header = FSP_HEADER_OFFSET + buf_page_get(id, 0, RW_X_LATCH, mtr); - +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(header, SYNC_FSP_PAGE); - +#endif /* UNIV_SYNC_DEBUG */ return(header); } @@ -658,7 +658,9 @@ xdes_get_descriptor_with_space_hdr( } else { descr_page = buf_page_get(space, descr_page_no, RW_X_LATCH, mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(descr_page, SYNC_FSP_PAGE); +#endif /* UNIV_SYNC_DEBUG */ } return(descr_page + XDES_ARR_OFFSET @@ -688,8 +690,9 @@ xdes_get_descriptor( sp_header = FSP_HEADER_OFFSET + buf_page_get(space, 0, RW_X_LATCH, mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(sp_header, SYNC_FSP_PAGE); - +#endif /* UNIV_SYNC_DEBUG */ return(xdes_get_descriptor_with_space_hdr(sp_header, space, offset, mtr)); } @@ -840,10 +843,13 @@ fsp_header_init( mtr_x_lock(fil_space_get_latch(space), mtr); page = buf_page_create(space, 0, mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_FSP_PAGE); - +#endif /* UNIV_SYNC_DEBUG */ buf_page_get(space, 0, RW_X_LATCH, mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_FSP_PAGE); +#endif /* UNIV_SYNC_DEBUG */ /* The prior contents of the file page should be ignored */ @@ -1083,11 +1089,15 @@ fsp_fill_free_list( if (i > 0) { descr_page = buf_page_create(space, i, mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(descr_page, SYNC_FSP_PAGE); +#endif /* UNIV_SYNC_DEBUG */ buf_page_get(space, i, RW_X_LATCH, mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(descr_page, SYNC_FSP_PAGE); +#endif /* UNIV_SYNC_DEBUG */ fsp_init_file_page(descr_page, mtr); } @@ -1100,12 +1110,14 @@ fsp_fill_free_list( ibuf_page = buf_page_create(space, i + FSP_IBUF_BITMAP_OFFSET, &ibuf_mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(ibuf_page, SYNC_IBUF_BITMAP); - +#endif /* UNIV_SYNC_DEBUG */ buf_page_get(space, i + FSP_IBUF_BITMAP_OFFSET, RW_X_LATCH, &ibuf_mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(ibuf_page, SYNC_FSP_PAGE); - +#endif /* UNIV_SYNC_DEBUG */ fsp_init_file_page(ibuf_page, &ibuf_mtr); ibuf_bitmap_page_init(ibuf_page, &ibuf_mtr); @@ -1297,8 +1309,9 @@ fsp_alloc_free_page( buf_page_create(space, page_no, mtr); page = buf_page_get(space, page_no, RW_X_LATCH, mtr); - +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_FSP_PAGE); +#endif /* UNIV_SYNC_DEBUG */ /* Prior contents of the page should be ignored */ fsp_init_file_page(page, mtr); @@ -1532,8 +1545,9 @@ fsp_alloc_seg_inode_page( buf_block_align(page)->check_index_page_at_flush = FALSE; fil_page_set_type(page, FIL_PAGE_INODE); - +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_FSP_PAGE); +#endif /* UNIV_SYNC_DEBUG */ for (i = 0; i < FSP_SEG_INODES_PER_PAGE; i++) { @@ -1580,7 +1594,9 @@ fsp_alloc_seg_inode( page = buf_page_get(buf_frame_get_space_id(space_header), page_no, RW_X_LATCH, mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_FSP_PAGE); +#endif /* UNIV_SYNC_DEBUG */ n = fsp_seg_inode_page_find_free(page, 0, mtr); @@ -1831,9 +1847,11 @@ fseg_create_general( mtr); } +#ifdef UNIV_SYNC_DEBUG ut_ad(!mutex_own(&kernel_mutex) || mtr_memo_contains(mtr, fil_space_get_latch(space), MTR_MEMO_X_LOCK)); +#endif /* UNIV_SYNC_DEBUG */ latch = fil_space_get_latch(space); mtr_x_lock(latch, mtr); @@ -1985,9 +2003,11 @@ fseg_n_reserved_pages( space = buf_frame_get_space_id(header); +#ifdef UNIV_SYNC_DEBUG ut_ad(!mutex_own(&kernel_mutex) || mtr_memo_contains(mtr, fil_space_get_latch(space), MTR_MEMO_X_LOCK)); +#endif /* UNIV_SYNC_DEBUG */ mtr_x_lock(fil_space_get_latch(space), mtr); inode = fseg_inode_get(header, mtr); @@ -2292,7 +2312,9 @@ fseg_alloc_free_page_low( ut_a(page == buf_page_get(space, ret_page, RW_X_LATCH, mtr)); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_FSP_PAGE); +#endif /* UNIV_SYNC_DEBUG */ /* The prior contents of the page should be ignored */ fsp_init_file_page(page, mtr); @@ -2345,9 +2367,11 @@ fseg_alloc_free_page_general( space = buf_frame_get_space_id(seg_header); +#ifdef UNIV_SYNC_DEBUG ut_ad(!mutex_own(&kernel_mutex) || mtr_memo_contains(mtr, fil_space_get_latch(space), MTR_MEMO_X_LOCK)); +#endif /* UNIV_SYNC_DEBUG */ latch = fil_space_get_latch(space); mtr_x_lock(latch, mtr); @@ -2442,9 +2466,11 @@ fsp_reserve_free_extents( ulint n_pages_added; ut_ad(mtr); +#ifdef UNIV_SYNC_DEBUG ut_ad(!mutex_own(&kernel_mutex) || mtr_memo_contains(mtr, fil_space_get_latch(space), MTR_MEMO_X_LOCK)); +#endif /* UNIV_SYNC_DEBUG */ latch = fil_space_get_latch(space); mtr_x_lock(latch, mtr); @@ -2534,8 +2560,9 @@ fsp_get_available_space_in_free_extents( rw_lock_t* latch; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(!mutex_own(&kernel_mutex)); - +#endif /* UNIV_SYNC_DEBUG */ mtr_start(&mtr); latch = fil_space_get_latch(space); @@ -2820,9 +2847,11 @@ fseg_free_page( { fseg_inode_t* seg_inode; +#ifdef UNIV_SYNC_DEBUG ut_ad(!mutex_own(&kernel_mutex) || mtr_memo_contains(mtr, fil_space_get_latch(space), MTR_MEMO_X_LOCK)); +#endif /* UNIV_SYNC_DEBUG */ mtr_x_lock(fil_space_get_latch(space), mtr); seg_inode = fseg_inode_get(seg_header, mtr); @@ -2929,9 +2958,11 @@ fseg_free_step( space = buf_frame_get_space_id(header); +#ifdef UNIV_SYNC_DEBUG ut_ad(!mutex_own(&kernel_mutex) || mtr_memo_contains(mtr, fil_space_get_latch(space), MTR_MEMO_X_LOCK)); +#endif /* UNIV_SYNC_DEBUG */ mtr_x_lock(fil_space_get_latch(space), mtr); descr = xdes_get_descriptor(space, buf_frame_get_page_no(header), mtr); @@ -3002,9 +3033,11 @@ fseg_free_step_not_header( space = buf_frame_get_space_id(header); +#ifdef UNIV_SYNC_DEBUG ut_ad(!mutex_own(&kernel_mutex) || mtr_memo_contains(mtr, fil_space_get_latch(space), MTR_MEMO_X_LOCK)); +#endif /* UNIV_SYNC_DEBUG */ mtr_x_lock(fil_space_get_latch(space), mtr); inode = fseg_inode_get(header, mtr); diff --git a/innobase/ha/ha0ha.c b/innobase/ha/ha0ha.c index 6021a0846a2..ad833312963 100644 --- a/innobase/ha/ha0ha.c +++ b/innobase/ha/ha0ha.c @@ -82,8 +82,9 @@ ha_insert_for_fold( ulint hash; ut_ad(table && data); +#ifdef UNIV_SYNC_DEBUG ut_ad(!table->mutexes || mutex_own(hash_get_mutex(table, fold))); - +#endif /* UNIV_SYNC_DEBUG */ hash = hash_calc_hash(fold, table); cell = hash_get_nth_cell(table, hash); @@ -163,8 +164,9 @@ ha_delete( { ha_node_t* node; +#ifdef UNIV_SYNC_DEBUG ut_ad(!table->mutexes || mutex_own(hash_get_mutex(table, fold))); - +#endif /* UNIV_SYNC_DEBUG */ node = ha_search_with_data(table, fold, data); ut_a(node); @@ -185,8 +187,9 @@ ha_remove_all_nodes_to_page( { ha_node_t* node; +#ifdef UNIV_SYNC_DEBUG ut_ad(!table->mutexes || mutex_own(hash_get_mutex(table, fold))); - +#endif /* UNIV_SYNC_DEBUG */ node = ha_chain_get_first(table, fold); while (node) { diff --git a/innobase/ibuf/ibuf0ibuf.c b/innobase/ibuf/ibuf0ibuf.c index 7c31ca7c320..d851e7c4d01 100644 --- a/innobase/ibuf/ibuf0ibuf.c +++ b/innobase/ibuf/ibuf0ibuf.c @@ -49,7 +49,7 @@ The solution is the following: We put into each tablespace an insert buffer of its own. Let all the tree and page latches connected with the insert buffer be later in the latching order than the fsp latch and fsp page latches. Insert buffer pages must be such that the insert buffer is never invoked -when these pages area accessed as this would result in a recursion violating +when these pages are accessed as this would result in a recursion violating the latching order. We let a special i/o-handler thread take care of i/o to the insert buffer pages and the ibuf bitmap pages, as well as the fsp bitmap pages and the first inode page, which contains the inode of the ibuf tree: let @@ -239,7 +239,9 @@ ibuf_header_page_get( page = buf_page_get(space, FSP_IBUF_HEADER_PAGE_NO, RW_X_LATCH, mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_IBUF_HEADER); +#endif /* UNIV_SYNC_DEBUG */ return(page); } @@ -263,7 +265,9 @@ ibuf_tree_root_get( page = buf_page_get(space, FSP_IBUF_TREE_ROOT_PAGE_NO, RW_X_LATCH, mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_TREE_NODE); +#endif /* UNIV_SYNC_DEBUG */ return(page); } @@ -375,7 +379,9 @@ ibuf_data_sizes_update( { ulint old_size; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&ibuf_mutex)); +#endif /* UNIV_SYNC_DEBUG */ old_size = data->size; @@ -455,7 +461,9 @@ ibuf_data_init_for_space( root = buf_page_get(space, FSP_IBUF_TREE_ROOT_PAGE_NO, RW_X_LATCH, &mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(root, SYNC_TREE_NODE); +#endif /* UNIV_SYNC_DEBUG */ data->size = 0; data->n_inserts = 0; @@ -679,7 +687,9 @@ ibuf_bitmap_get_map_page( page = buf_page_get(space, ibuf_bitmap_page_no_calc(page_no), RW_X_LATCH, mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_IBUF_BITMAP); +#endif /* UNIV_SYNC_DEBUG */ return(page); } @@ -1198,7 +1208,9 @@ ibuf_data_enough_free_for_insert( /* out: TRUE if enough free pages in list */ ibuf_data_t* data) /* in: ibuf data for the space */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&ibuf_mutex)); +#endif /* UNIV_SYNC_DEBUG */ /* We want a big margin of free pages, because a B-tree can sometimes grow in size also if records are deleted from it, as the node pointers @@ -1224,7 +1236,9 @@ ibuf_data_too_much_free( /* out: TRUE if enough free pages in list */ ibuf_data_t* data) /* in: ibuf data for the space */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&ibuf_mutex)); +#endif /* UNIV_SYNC_DEBUG */ if (data->free_list_len >= 3 + data->size / 2 + 3 * data->height) { @@ -1282,7 +1296,9 @@ ibuf_add_free_page( page = buf_page_get(space, page_no, RW_X_LATCH, &mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_TREE_NODE_NEW); +#endif /* UNIV_SYNC_DEBUG */ ibuf_enter(); @@ -1402,7 +1418,9 @@ ibuf_remove_free_page( page = buf_page_get(space, page_no, RW_X_LATCH, &mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_TREE_NODE); +#endif /* UNIV_SYNC_DEBUG */ /* Remove the page from the free list and update the ibuf size data */ @@ -1443,8 +1461,9 @@ ibuf_free_excess_pages( { ibuf_data_t* ibuf_data; ulint i; - +#ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(fil_space_get_latch(space), RW_LOCK_EX)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(rw_lock_get_x_lock_count(fil_space_get_latch(space)) == 1); ut_ad(!ibuf_inside()); @@ -1909,7 +1928,9 @@ ibuf_get_volume_buffered( prev_page = buf_page_get(space, prev_page_no, RW_X_LATCH, mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(prev_page, SYNC_TREE_NODE); +#endif /* UNIV_SYNC_DEBUG */ rec = page_get_supremum_rec(prev_page); rec = page_rec_get_prev(rec); @@ -1968,7 +1989,9 @@ count_later: next_page = buf_page_get(space, next_page_no, RW_X_LATCH, mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(next_page, SYNC_TREE_NODE); +#endif /* UNIV_SYNC_DEBUG */ rec = page_get_infimum_rec(next_page); rec = page_rec_get_next(rec); @@ -2592,8 +2615,9 @@ loop: IB__FILE__, __LINE__, &mtr); ut_a(success); - +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_TREE_NODE); +#endif /* UNIV_SYNC_DEBUG */ } /* Position pcur in the insert buffer at the first entry for this @@ -2744,7 +2768,9 @@ ibuf_validate_low(void) ibuf_data_t* data; ulint sum_sizes; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&ibuf_mutex)); +#endif /* UNIV_SYNC_DEBUG */ sum_sizes = 0; diff --git a/innobase/include/btr0sea.ic b/innobase/include/btr0sea.ic index 63a3a658cf4..8a41042f713 100644 --- a/innobase/include/btr0sea.ic +++ b/innobase/include/btr0sea.ic @@ -44,8 +44,10 @@ btr_search_info_update( { btr_search_t* info; - ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_SHARED) - && !rw_lock_own(&btr_search_latch, RW_LOCK_EX)); +#ifdef UNIV_SYNC_DEBUG + ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_SHARED)); + ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_EX)); +#endif /* UNIV_SYNC_DEBUG */ info = btr_search_get_info(index); diff --git a/innobase/include/buf0buf.h b/innobase/include/buf0buf.h index 2963efd6396..72cedafa7e1 100644 --- a/innobase/include/buf0buf.h +++ b/innobase/include/buf0buf.h @@ -525,11 +525,11 @@ buf_pool_invalidate(void); --------------------------- LOWER LEVEL ROUTINES ------------------------- =========================================================================*/ +#ifdef UNIV_SYNC_DEBUG /************************************************************************* Adds latch level info for the rw-lock protecting the buffer frame. This should be called in the debug version after a successful latching of a -page if we know the latching order level of the acquired latch. If -UNIV_SYNC_DEBUG is not defined, compiles to an empty function. */ +page if we know the latching order level of the acquired latch. */ UNIV_INLINE void buf_page_dbg_add_level( @@ -537,6 +537,7 @@ buf_page_dbg_add_level( buf_frame_t* frame, /* in: buffer page where we have acquired a latch */ ulint level); /* in: latching order level */ +#endif /* UNIV_SYNC_DEBUG */ /************************************************************************* Gets a pointer to the memory frame of a block. */ UNIV_INLINE @@ -778,11 +779,12 @@ struct buf_block_struct{ BTR_SEARCH_RIGHT_SIDE in hash indexing */ /* 6. Debug fields */ - +#ifdef UNIV_SYNC_DEBUG rw_lock_t debug_latch; /* in the debug version, each thread which bufferfixes the block acquires an s-latch here; so we can use the debug utilities in sync0rw */ +#endif ibool file_page_was_freed; /* this is set to TRUE when fsp frees a page in buffer pool */ @@ -822,7 +824,7 @@ struct buf_pool_struct{ ulint n_pages_created;/* number of pages created in the pool with no read */ ulint n_page_gets; /* number of page gets performed; - also successful seraches through + also successful searches through the adaptive hash index are counted as page gets; this field is NOT protected by the buffer diff --git a/innobase/include/buf0buf.ic b/innobase/include/buf0buf.ic index d8e5857a570..0957dcf4402 100644 --- a/innobase/include/buf0buf.ic +++ b/innobase/include/buf0buf.ic @@ -129,7 +129,9 @@ buf_pool_clock_tic(void) /*====================*/ /* out: new clock value */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(buf_pool->mutex))); +#endif /* UNIV_SYNC_DEBUG */ buf_pool->ulint_clock++; @@ -471,8 +473,10 @@ buf_frame_modify_clock_inc( block = buf_block_align_low(frame); +#ifdef UNIV_SYNC_DEBUG ut_ad((mutex_own(&(buf_pool->mutex)) && (block->buf_fix_count == 0)) || rw_lock_own(&(block->lock), RW_LOCK_EXCLUSIVE)); +#endif /* UNIV_SYNC_DEBUG */ UT_DULINT_INC(block->modify_clock); @@ -495,8 +499,10 @@ buf_frame_get_modify_clock( block = buf_block_align(frame); +#ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(&(block->lock), RW_LOCK_SHARED) || rw_lock_own(&(block->lock), RW_LOCK_EXCLUSIVE)); +#endif /* UNIV_SYNC_DEBUG */ return(block->modify_clock); } @@ -546,7 +552,9 @@ buf_page_hash_get( ulint fold; ut_ad(buf_pool); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(buf_pool->mutex))); +#endif /* UNIV_SYNC_DEBUG */ /* Look for the page in the hash table */ @@ -644,6 +652,7 @@ buf_page_release( } } +#ifdef UNIV_SYNC_DEBUG /************************************************************************* Adds latch level info for the rw-lock protecting the buffer frame. This should be called in the debug version after a successful latching of a @@ -658,7 +667,6 @@ buf_page_dbg_add_level( ulint level __attribute__((unused))) /* in: latching order level */ { -#ifdef UNIV_SYNC_DEBUG sync_thread_add_level(&(buf_block_align(frame)->lock), level); -#endif } +#endif /* UNIV_SYNC_DEBUG */ diff --git a/innobase/include/buf0flu.ic b/innobase/include/buf0flu.ic index e2faf773cab..d6dbdcc0865 100644 --- a/innobase/include/buf0flu.ic +++ b/innobase/include/buf0flu.ic @@ -40,8 +40,10 @@ buf_flush_note_modification( ut_ad(block); ut_ad(block->state == BUF_BLOCK_FILE_PAGE); ut_ad(block->buf_fix_count > 0); +#ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(&(block->lock), RW_LOCK_EX)); ut_ad(mutex_own(&(buf_pool->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(ut_dulint_cmp(mtr->start_lsn, ut_dulint_zero) != 0); ut_ad(mtr->modifications); @@ -76,7 +78,9 @@ buf_flush_recv_note_modification( ut_ad(block); ut_ad(block->state == BUF_BLOCK_FILE_PAGE); ut_ad(block->buf_fix_count > 0); +#ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(&(block->lock), RW_LOCK_EX)); +#endif /* UNIV_SYNC_DEBUG */ mutex_enter(&(buf_pool->mutex)); diff --git a/innobase/include/dict0dict.ic b/innobase/include/dict0dict.ic index c5982c162a7..b70822e331f 100644 --- a/innobase/include/dict0dict.ic +++ b/innobase/include/dict0dict.ic @@ -543,8 +543,10 @@ dict_table_check_if_in_cache_low( ulint table_fold; ut_ad(table_name); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); - +#endif /* UNIV_SYNC_DEBUG */ + /* Look for the table name in the hash table */ table_fold = ut_fold_string(table_name); @@ -566,8 +568,10 @@ dict_table_get_low( dict_table_t* table; ut_ad(table_name); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); - +#endif /* UNIV_SYNC_DEBUG */ + table = dict_table_check_if_in_cache_low(table_name); if (table == NULL) { @@ -621,7 +625,9 @@ dict_table_get_on_id_low( dict_table_t* table; ulint fold; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ UT_NOT_USED(trx); /* Look for the table name in the hash table */ diff --git a/innobase/include/fut0fut.ic b/innobase/include/fut0fut.ic index 0f1aa9dd9ae..6a107786376 100644 --- a/innobase/include/fut0fut.ic +++ b/innobase/include/fut0fut.ic @@ -30,7 +30,9 @@ fut_get_ptr( ptr = buf_page_get(space, addr.page, rw_latch, mtr) + addr.boffset; +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(ptr, SYNC_NO_ORDER_CHECK); +#endif /* UNIV_SYNC_DEBUG */ return(ptr); } diff --git a/innobase/include/ha0ha.ic b/innobase/include/ha0ha.ic index 761bc3b20de..f6faf84b9f5 100644 --- a/innobase/include/ha0ha.ic +++ b/innobase/include/ha0ha.ic @@ -84,7 +84,9 @@ ha_search( { ha_node_t* node; +#ifdef UNIV_SYNC_DEBUG ut_ad(!table->mutexes || mutex_own(hash_get_mutex(table, fold))); +#endif /* UNIV_SYNC_DEBUG */ node = ha_chain_get_first(table, fold); @@ -114,7 +116,9 @@ ha_search_and_get_data( { ha_node_t* node; +#ifdef UNIV_SYNC_DEBUG ut_ad(!table->mutexes || mutex_own(hash_get_mutex(table, fold))); +#endif /* UNIV_SYNC_DEBUG */ node = ha_chain_get_first(table, fold); @@ -146,7 +150,9 @@ ha_next( fold = node->fold; +#ifdef UNIV_SYNC_DEBUG ut_ad(!table->mutexes || mutex_own(hash_get_mutex(table, fold))); +#endif /* UNIV_SYNC_DEBUG */ node = ha_chain_get_next(table, node); @@ -176,7 +182,9 @@ ha_search_with_data( { ha_node_t* node; +#ifdef UNIV_SYNC_DEBUG ut_ad(!table->mutexes || mutex_own(hash_get_mutex(table, fold))); +#endif /* UNIV_SYNC_DEBUG */ node = ha_chain_get_first(table, fold); @@ -206,7 +214,9 @@ ha_search_and_update_if_found( { ha_node_t* node; +#ifdef UNIV_SYNC_DEBUG ut_ad(!table->mutexes || mutex_own(hash_get_mutex(table, fold))); +#endif /* UNIV_SYNC_DEBUG */ node = ha_search_with_data(table, fold, data); @@ -229,7 +239,9 @@ ha_search_and_delete_if_found( { ha_node_t* node; +#ifdef UNIV_SYNC_DEBUG ut_ad(!table->mutexes || mutex_own(hash_get_mutex(table, fold))); +#endif /* UNIV_SYNC_DEBUG */ node = ha_search_with_data(table, fold, data); diff --git a/innobase/include/hash0hash.h b/innobase/include/hash0hash.h index 2669520b753..d325636f511 100644 --- a/innobase/include/hash0hash.h +++ b/innobase/include/hash0hash.h @@ -53,15 +53,24 @@ hash_calc_hash( /* out: hashed value */ ulint fold, /* in: folded value */ hash_table_t* table); /* in: hash table */ +/************************************************************************ +Assert that the mutex for the table in a hash operation is owned. */ +#ifdef UNIV_SYNC_DEBUG +# define HASH_ASSERT_OWNED(TABLE, FOLD) \ +ut_ad(!(TABLE)->mutexes || mutex_own(hash_get_mutex(TABLE, FOLD))); +#else +# define HASH_ASSERT_OWNED(TABLE, FOLD) +#endif + /*********************************************************************** Inserts a struct to a hash table. */ #define HASH_INSERT(TYPE, NAME, TABLE, FOLD, DATA)\ -{\ +do {\ hash_cell_t* cell3333;\ TYPE* struct3333;\ \ - ut_ad(!(TABLE)->mutexes || mutex_own(hash_get_mutex(TABLE, FOLD)));\ + HASH_ASSERT_OWNED(TABLE, FOLD)\ \ (DATA)->NAME = NULL;\ \ @@ -79,17 +88,17 @@ Inserts a struct to a hash table. */ \ struct3333->NAME = DATA;\ }\ -} +} while (0) /*********************************************************************** Deletes a struct from a hash table. */ #define HASH_DELETE(TYPE, NAME, TABLE, FOLD, DATA)\ -{\ +do {\ hash_cell_t* cell3333;\ TYPE* struct3333;\ \ - ut_ad(!(TABLE)->mutexes || mutex_own(hash_get_mutex(TABLE, FOLD)));\ + HASH_ASSERT_OWNED(TABLE, FOLD)\ \ cell3333 = hash_get_nth_cell(TABLE, hash_calc_hash(FOLD, TABLE));\ \ @@ -100,13 +109,13 @@ Deletes a struct from a hash table. */ \ while (struct3333->NAME != DATA) {\ \ - ut_ad(struct3333)\ + ut_ad(struct3333);\ struct3333 = struct3333->NAME;\ }\ \ struct3333->NAME = DATA->NAME;\ }\ -} +} while (0) /*********************************************************************** Gets the first struct in a hash chain, NULL if none. */ @@ -124,7 +133,7 @@ Looks for a struct in a hash table. */ #define HASH_SEARCH(NAME, TABLE, FOLD, DATA, TEST)\ {\ \ - ut_ad(!(TABLE)->mutexes || mutex_own(hash_get_mutex(TABLE, FOLD)));\ + HASH_ASSERT_OWNED(TABLE, FOLD)\ \ (DATA) = HASH_GET_FIRST(TABLE, hash_calc_hash(FOLD, TABLE));\ \ @@ -160,7 +169,7 @@ the heap. The fold value must be stored in the struct NODE in a field named 'fold'. */ #define HASH_DELETE_AND_COMPACT(TYPE, NAME, TABLE, NODE)\ -{\ +do {\ TYPE* node111;\ TYPE* top_node111;\ hash_cell_t* cell111;\ @@ -211,33 +220,7 @@ the heap. The fold value must be stored in the struct NODE in a field named /* Free the space occupied by the top node */\ \ mem_heap_free_top(hash_get_heap(TABLE, fold111), sizeof(TYPE));\ -} - -/*********************************************************************** -Calculates the number of stored structs in a hash table. */ - -#define HASH_GET_N_NODES(TYPE, NAME, TABLE, N)\ -{\ - hash_cell_t* cell3333;\ - TYPE* struct3333;\ - ulint i3333;\ -\ - (N) = 0;\ -\ - for (i3333 = 0; i3333 < hash_get_n_cells(TABLE); i3333++) {\ -\ - cell3333 = hash_get_nth_cell(TABLE, i3333);\ -\ - struct3333 = cell3333->node;\ -\ - while (struct3333) {\ -\ - (N) = (N) + 1;\ -\ - struct = HASH_GET_NEXT(NAME, struct3333);\ - }\ - }\ -} +} while (0) /**************************************************************** Gets the mutex index for a fold value in a hash table. */ diff --git a/innobase/include/lock0lock.ic b/innobase/include/lock0lock.ic index 64c43c88d2e..fabc9256401 100644 --- a/innobase/include/lock0lock.ic +++ b/innobase/include/lock0lock.ic @@ -64,7 +64,9 @@ lock_clust_rec_some_has_impl( { dulint trx_id; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(index->type & DICT_CLUSTERED); ut_ad(page_rec_is_user_rec(rec)); diff --git a/innobase/include/log0log.ic b/innobase/include/log0log.ic index 8de239df0bd..587291883f7 100644 --- a/innobase/include/log0log.ic +++ b/innobase/include/log0log.ic @@ -255,7 +255,9 @@ log_block_init( { ulint no; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ no = log_block_convert_lsn_to_no(lsn); @@ -277,7 +279,9 @@ log_block_init_in_old_format( { ulint no; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ no = log_block_convert_lsn_to_no(lsn); @@ -407,7 +411,9 @@ log_get_online_backup_lsn_low(void) /* out: online_backup_lsn, the caller must own the log_sys mutex */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(log_sys->online_backup_state); return(log_sys->online_backup_lsn); @@ -422,7 +428,9 @@ log_get_online_backup_state_low(void) /* out: online backup state, the caller must own the log_sys mutex */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ return(log_sys->online_backup_state); } diff --git a/innobase/include/row0upd.ic b/innobase/include/row0upd.ic index 7015b2eda13..3e00978be2f 100644 --- a/innobase/include/row0upd.ic +++ b/innobase/include/row0upd.ic @@ -107,8 +107,10 @@ row_upd_rec_sys_fields( dulint roll_ptr)/* in: roll ptr of the undo log record */ { ut_ad(index->type & DICT_CLUSTERED); +#ifdef UNIV_SYNC_DEBUG ut_ad(!buf_block_align(rec)->is_hashed || rw_lock_own(&btr_search_latch, RW_LOCK_EX)); +#endif /* UNIV_SYNC_DEBUG */ row_set_rec_trx_id(rec, index, trx->id); row_set_rec_roll_ptr(rec, index, roll_ptr); diff --git a/innobase/include/sync0rw.h b/innobase/include/sync0rw.h index 5aa3dcdffc3..d71691b4353 100644 --- a/innobase/include/sync0rw.h +++ b/innobase/include/sync0rw.h @@ -25,13 +25,16 @@ smaller than 30 and the order of the numerical values like below! */ #define RW_NO_LATCH 3 typedef struct rw_lock_struct rw_lock_t; +#ifdef UNIV_SYNC_DEBUG typedef struct rw_lock_debug_struct rw_lock_debug_t; +#endif /* UNIV_SYNC_DEBUG */ typedef UT_LIST_BASE_NODE_T(rw_lock_t) rw_lock_list_t; extern rw_lock_list_t rw_lock_list; extern mutex_t rw_lock_list_mutex; +#ifdef UNIV_SYNC_DEBUG /* The global mutex which protects debug info lists of all rw-locks. To modify the debug info list of an rw-lock, this mutex has to be @@ -42,6 +45,7 @@ extern os_event_t rw_lock_debug_event; /* If deadlock detection does may wait for this event */ extern ibool rw_lock_debug_waiters; /* This is set to TRUE, if there may be waiters for the event */ +#endif /* UNIV_SYNC_DEBUG */ extern ulint rw_s_system_call_count; extern ulint rw_s_spin_wait_count; @@ -327,6 +331,7 @@ ulint rw_lock_get_reader_count( /*=====================*/ rw_lock_t* lock); +#ifdef UNIV_SYNC_DEBUG /********************************************************************** Checks if the thread has locked the rw-lock in the specified mode, with the pass value == 0. */ @@ -337,6 +342,7 @@ rw_lock_own( rw_lock_t* lock, /* in: rw-lock */ ulint lock_type); /* in: lock type: RW_LOCK_SHARED, RW_LOCK_EX */ +#endif /* UNIV_SYNC_DEBUG */ /********************************************************************** Checks if somebody has locked the rw-lock in the specified mode. */ @@ -346,6 +352,7 @@ rw_lock_is_locked( rw_lock_t* lock, /* in: rw-lock */ ulint lock_type); /* in: lock type: RW_LOCK_SHARED, RW_LOCK_EX */ +#ifdef UNIV_SYNC_DEBUG /******************************************************************* Prints debug info of an rw-lock. */ @@ -392,6 +399,7 @@ void rw_lock_debug_print( /*================*/ rw_lock_debug_t* info); /* in: debug struct */ +#endif /* UNIV_SYNC_DEBUG */ /* NOTE! The structure appears here only for the compiler to know its size. Do not use its fields directly! The structure used in the spin lock @@ -434,10 +442,12 @@ struct rw_lock_struct { UT_LIST_NODE_T(rw_lock_t) list; /* All allocated rw locks are put into a list */ +#ifdef UNIV_SYNC_DEBUG UT_LIST_BASE_NODE_T(rw_lock_debug_t) debug_list; /* In the debug version: pointer to the debug info list of the lock */ - ulint level; /* Debug version: level in the global latching +#endif /* UNIV_SYNC_DEBUG */ + ulint level; /* Level in the global latching order; default SYNC_LEVEL_NONE */ char* cfile_name; /* File name where lock created */ ulint cline; /* Line where created */ @@ -450,6 +460,7 @@ struct rw_lock_struct { #define RW_LOCK_MAGIC_N 22643 +#ifdef UNIV_SYNC_DEBUG /* The structure for storing debug info of an rw-lock */ struct rw_lock_debug_struct { @@ -464,6 +475,7 @@ struct rw_lock_debug_struct { /* Debug structs are linked in a two-way list */ }; +#endif /* UNIV_SYNC_DEBUG */ #ifndef UNIV_NONINL #include "sync0rw.ic" diff --git a/innobase/include/sync0rw.ic b/innobase/include/sync0rw.ic index caf6f5f1de4..8fc93f4a9da 100644 --- a/innobase/include/sync0rw.ic +++ b/innobase/include/sync0rw.ic @@ -20,6 +20,7 @@ rw_lock_s_lock_spin( be passed to another thread to unlock */ char* file_name,/* in: file name where lock requested */ ulint line); /* in: line where requested */ +#ifdef UNIV_SYNC_DEBUG /********************************************************************** Inserts the debug information for an rw-lock. */ @@ -40,7 +41,7 @@ rw_lock_remove_debug_info( rw_lock_t* lock, /* in: rw-lock */ ulint pass, /* in: pass value */ ulint lock_type); /* in: lock type */ - +#endif /* UNIV_SYNC_DEBUG */ /************************************************************************ Accessor functions for rw lock. */ @@ -132,8 +133,9 @@ rw_lock_s_lock_low( char* file_name, /* in: file name where lock requested */ ulint line) /* in: line where requested */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(rw_lock_get_mutex(lock))); - +#endif /* UNIV_SYNC_DEBUG */ /* Check if the writer field is free */ if (lock->writer == RW_LOCK_NOT_LOCKED) { @@ -144,7 +146,6 @@ rw_lock_s_lock_low( rw_lock_add_debug_info(lock, pass, RW_LOCK_SHARED, file_name, line); #endif - lock->last_s_file_name = file_name; lock->last_s_line = line; @@ -236,7 +237,9 @@ rw_lock_s_lock_func( the threads which have s-locked a latch. This would use some CPU time. */ +#ifdef UNIV_SYNC_DEBUG ut_ad(!rw_lock_own(lock, RW_LOCK_SHARED)); /* see NOTE above */ +#endif /* UNIV_SYNC_DEBUG */ mutex_enter(rw_lock_get_mutex(lock)); diff --git a/innobase/include/sync0sync.h b/innobase/include/sync0sync.h index 71263f5d136..3acf3415889 100644 --- a/innobase/include/sync0sync.h +++ b/innobase/include/sync0sync.h @@ -185,6 +185,7 @@ sync_thread_levels_empty_gen( allowed to be owned by the thread, also purge_is_running mutex is allowed */ +#ifdef UNIV_SYNC_DEBUG /********************************************************************** Checks that the current thread owns the mutex. Works only in the debug version. */ @@ -217,6 +218,7 @@ Prints debug info of currently reserved mutexes. */ void mutex_list_print_info(void); /*========================*/ +#endif /* UNIV_SYNC_DEBUG */ /********************************************************************** NOT to be used outside this module except in debugging! Gets the value of the lock word. */ @@ -225,6 +227,7 @@ ulint mutex_get_lock_word( /*================*/ mutex_t* mutex); /* in: mutex */ +#ifdef UNIV_SYNC_DEBUG /********************************************************************** NOT to be used outside this module except in debugging! Gets the waiters field in a mutex. */ @@ -234,6 +237,7 @@ mutex_get_waiters( /*==============*/ /* out: value to set */ mutex_t* mutex); /* in: mutex */ +#endif /* UNIV_SYNC_DEBUG */ /* LATCHING ORDER WITHIN THE DATABASE @@ -442,13 +446,13 @@ struct mutex_struct { Otherwise, this is 0. */ UT_LIST_NODE_T(mutex_t) list; /* All allocated mutexes are put into a list. Pointers to the next and prev. */ +#ifdef UNIV_SYNC_DEBUG + const char* file_name; /* File where the mutex was locked */ + ulint line; /* Line where the mutex was locked */ os_thread_id_t thread_id; /* Debug version: The thread id of the thread which locked the mutex. */ - char* file_name; /* Debug version: File name where the mutex - was locked */ - ulint line; /* Debug version: Line where the mutex was - locked */ - ulint level; /* Debug version: level in the global latching +#endif /* UNIV_SYNC_DEBUG */ + ulint level; /* Level in the global latching order; default SYNC_LEVEL_NONE */ char* cfile_name; /* File name where mutex created */ ulint cline; /* Line where created */ diff --git a/innobase/include/sync0sync.ic b/innobase/include/sync0sync.ic index 816b44a5bd3..758c8524f66 100644 --- a/innobase/include/sync0sync.ic +++ b/innobase/include/sync0sync.ic @@ -25,6 +25,7 @@ mutex_spin_wait( mutex_t* mutex, /* in: pointer to mutex */ char* file_name,/* in: file name where mutex requested */ ulint line); /* in: line where requested */ +#ifdef UNIV_SYNC_DEBUG /********************************************************************** Sets the debug information for a reserved mutex. */ @@ -34,6 +35,7 @@ mutex_set_debug_info( mutex_t* mutex, /* in: mutex */ char* file_name, /* in: file where requested */ ulint line); /* in: line where requested */ +#endif /* UNIV_SYNC_DEBUG */ /********************************************************************** Releases the threads waiting in the primary wait array for this mutex. */ @@ -200,9 +202,9 @@ mutex_exit( /*=======*/ mutex_t* mutex) /* in: pointer to mutex */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(mutex)); -#ifdef UNIV_SYNC_DEBUG mutex->thread_id = ULINT_UNDEFINED; sync_thread_reset_level(mutex); @@ -249,14 +251,9 @@ mutex_enter_func( the atomic test_and_set; we could peek, and possibly save time. */ if (!mutex_test_and_set(mutex)) { - #ifdef UNIV_SYNC_DEBUG mutex_set_debug_info(mutex, file_name, line); #endif - - mutex->file_name = file_name; - mutex->line = line; - return; /* Succeeded! */ } diff --git a/innobase/include/trx0rseg.ic b/innobase/include/trx0rseg.ic index 423447d5566..840d61a6840 100644 --- a/innobase/include/trx0rseg.ic +++ b/innobase/include/trx0rseg.ic @@ -24,7 +24,9 @@ trx_rsegf_get( header = TRX_RSEG + buf_page_get(space, page_no, RW_X_LATCH, mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(header, SYNC_RSEG_HEADER); +#endif /* UNIV_SYNC_DEBUG */ return(header); } @@ -45,7 +47,9 @@ trx_rsegf_get_new( header = TRX_RSEG + buf_page_get(space, page_no, RW_X_LATCH, mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(header, SYNC_RSEG_HEADER_NEW); +#endif /* UNIV_SYNC_DEBUG */ return(header); } diff --git a/innobase/include/trx0sys.ic b/innobase/include/trx0sys.ic index 343e6d7c2fa..8f455e554ea 100644 --- a/innobase/include/trx0sys.ic +++ b/innobase/include/trx0sys.ic @@ -60,7 +60,9 @@ trx_sys_get_nth_rseg( trx_sys_t* sys, /* in: trx system */ ulint n) /* in: index of slot */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(kernel_mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(n < TRX_SYS_N_RSEGS); return(sys->rseg_array[n]); @@ -98,7 +100,9 @@ trx_sysf_get( header = TRX_SYS + buf_page_get(TRX_SYS_SPACE, TRX_SYS_PAGE_NO, RW_X_LATCH, mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(header, SYNC_TRX_SYS_HEADER); +#endif /* UNIV_SYNC_DEBUG */ return(header); } @@ -115,7 +119,9 @@ trx_sysf_rseg_get_space( ulint i, /* in: slot index == rseg id */ mtr_t* mtr) /* in: mtr */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(kernel_mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(sys_header); ut_ad(i < TRX_SYS_N_RSEGS); @@ -138,7 +144,9 @@ trx_sysf_rseg_get_page_no( mtr_t* mtr) /* in: mtr */ { ut_ad(sys_header); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(kernel_mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(i < TRX_SYS_N_RSEGS); return(mtr_read_ulint(sys_header + TRX_SYS_RSEGS @@ -158,7 +166,9 @@ trx_sysf_rseg_set_space( ulint space, /* in: space id */ mtr_t* mtr) /* in: mtr */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(kernel_mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(sys_header); ut_ad(i < TRX_SYS_N_RSEGS); @@ -182,7 +192,9 @@ trx_sysf_rseg_set_page_no( slot is reset to unused */ mtr_t* mtr) /* in: mtr */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(kernel_mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(sys_header); ut_ad(i < TRX_SYS_N_RSEGS); @@ -236,7 +248,9 @@ trx_get_on_id( { trx_t* trx; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(kernel_mutex))); +#endif /* UNIV_SYNC_DEBUG */ trx = UT_LIST_GET_FIRST(trx_sys->trx_list); @@ -266,7 +280,9 @@ trx_list_get_min_trx_id(void) { trx_t* trx; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(kernel_mutex))); +#endif /* UNIV_SYNC_DEBUG */ trx = UT_LIST_GET_LAST(trx_sys->trx_list); @@ -289,7 +305,9 @@ trx_is_active( { trx_t* trx; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(kernel_mutex))); +#endif /* UNIV_SYNC_DEBUG */ if (ut_dulint_cmp(trx_id, trx_list_get_min_trx_id()) < 0) { @@ -325,7 +343,9 @@ trx_sys_get_new_trx_id(void) { dulint id; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ /* VERY important: after the database is started, max_trx_id value is divisible by TRX_SYS_TRX_ID_WRITE_MARGIN, and the following if @@ -355,7 +375,9 @@ trx_sys_get_new_trx_no(void) /*========================*/ /* out: new, allocated trx number */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ return(trx_sys_get_new_trx_id()); } diff --git a/innobase/include/trx0undo.ic b/innobase/include/trx0undo.ic index bedbc02b00b..a04b234b495 100644 --- a/innobase/include/trx0undo.ic +++ b/innobase/include/trx0undo.ic @@ -126,7 +126,9 @@ trx_undo_page_get( page = buf_page_get(space, page_no, RW_X_LATCH, mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_TRX_UNDO_PAGE); +#endif /* UNIV_SYNC_DEBUG */ return(page); } @@ -146,7 +148,9 @@ trx_undo_page_get_s_latched( page = buf_page_get(space, page_no, RW_S_LATCH, mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_TRX_UNDO_PAGE); +#endif /* UNIV_SYNC_DEBUG */ return(page); } diff --git a/innobase/lock/lock0lock.c b/innobase/lock/lock0lock.c index dd033b037ad..fab6dda98cb 100644 --- a/innobase/lock/lock0lock.c +++ b/innobase/lock/lock0lock.c @@ -953,7 +953,9 @@ lock_rec_get_next_on_page( ulint space; ulint page_no; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(lock_get_type(lock) == LOCK_REC); space = lock->un_member.rec_lock.space; @@ -990,7 +992,9 @@ lock_rec_get_first_on_page_addr( { lock_t* lock; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ lock = HASH_GET_FIRST(lock_sys->rec_hash, lock_rec_hash(space, page_no)); @@ -1048,7 +1052,9 @@ lock_rec_get_first_on_page( ulint space; ulint page_no; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ hash = buf_frame_get_lock_hash_val(ptr); @@ -1080,7 +1086,9 @@ lock_rec_get_next( rec_t* rec, /* in: record on a page */ lock_t* lock) /* in: lock */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(lock_get_type(lock) == LOCK_REC); for (;;) { @@ -1109,7 +1117,9 @@ lock_rec_get_first( { lock_t* lock; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ lock = lock_rec_get_first_on_page(rec); @@ -1197,7 +1207,9 @@ lock_rec_get_prev( ulint page_no; lock_t* found_lock = NULL; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(lock_get_type(in_lock) == LOCK_REC); space = in_lock->un_member.rec_lock.space; @@ -1237,7 +1249,9 @@ lock_table_has( { lock_t* lock; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ /* Look for stronger locks the same trx already has on the table */ @@ -1281,7 +1295,9 @@ lock_rec_has_expl( { lock_t* lock; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad((precise_mode & LOCK_MODE_MASK) == LOCK_S || (precise_mode & LOCK_MODE_MASK) == LOCK_X); ut_ad(!(precise_mode & LOCK_INSERT_INTENTION)); @@ -1328,7 +1344,9 @@ lock_rec_other_has_expl_req( { lock_t* lock; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(mode == LOCK_X || mode == LOCK_S); ut_ad(gap == 0 || gap == LOCK_GAP); ut_ad(wait == 0 || wait == LOCK_WAIT); @@ -1367,7 +1385,9 @@ lock_rec_other_has_conflicting( { lock_t* lock; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ lock = lock_rec_get_first(rec); @@ -1399,7 +1419,9 @@ lock_rec_find_similar_on_page( lock_t* lock; ulint heap_no; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ heap_no = rec_get_heap_no(rec); @@ -1433,7 +1455,9 @@ lock_sec_rec_some_has_impl_off_kernel( { page_t* page; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(!(index->type & DICT_CLUSTERED)); ut_ad(page_rec_is_user_rec(rec)); @@ -1491,7 +1515,9 @@ lock_rec_create( ulint n_bits; ulint n_bytes; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ page = buf_frame_align(rec); space = buf_frame_get_space_id(page); @@ -1575,7 +1601,9 @@ lock_rec_enqueue_waiting( lock_t* lock; trx_t* trx; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ /* Test if there already is some other reason to suspend thread: we do not enqueue a lock request if the query thread should be @@ -1660,7 +1688,9 @@ lock_rec_add_to_queue( page_t* page; ibool somebody_waits = FALSE; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad((type_mode & (LOCK_WAIT | LOCK_GAP)) || ((type_mode & LOCK_MODE_MASK) != LOCK_S) || !lock_rec_other_has_expl_req(LOCK_X, 0, LOCK_WAIT, rec, trx)); @@ -1740,7 +1770,9 @@ lock_rec_lock_fast( lock_t* lock; ulint heap_no; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad((LOCK_MODE_MASK & mode) != LOCK_S || lock_table_has(thr_get_trx(thr), index->table, LOCK_IS)); ut_ad((LOCK_MODE_MASK & mode) != LOCK_X @@ -1804,7 +1836,9 @@ lock_rec_lock_slow( trx_t* trx; ulint err; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad((LOCK_MODE_MASK & mode) != LOCK_S || lock_table_has(thr_get_trx(thr), index->table, LOCK_IS)); ut_ad((LOCK_MODE_MASK & mode) != LOCK_X @@ -1866,7 +1900,9 @@ lock_rec_lock( { ulint err; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad((LOCK_MODE_MASK & mode) != LOCK_S || lock_table_has(thr_get_trx(thr), index->table, LOCK_IS)); ut_ad((LOCK_MODE_MASK & mode) != LOCK_X @@ -1904,7 +1940,9 @@ lock_rec_has_to_wait_in_queue( ulint page_no; ulint heap_no; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(lock_get_wait(wait_lock)); ut_ad(lock_get_type(wait_lock) == LOCK_REC); @@ -1937,7 +1975,9 @@ lock_grant( /*=======*/ lock_t* lock) /* in: waiting lock request */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ lock_reset_lock_and_trx_wait(lock); @@ -1979,7 +2019,9 @@ lock_rec_cancel( /*============*/ lock_t* lock) /* in: waiting record lock request */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(lock_get_type(lock) == LOCK_REC); /* Reset the bit (there can be only one set bit) in the lock bitmap */ @@ -2012,7 +2054,9 @@ lock_rec_dequeue_from_page( lock_t* lock; trx_t* trx; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(lock_get_type(in_lock) == LOCK_REC); trx = in_lock->trx; @@ -2055,7 +2099,9 @@ lock_rec_discard( ulint page_no; trx_t* trx; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(lock_get_type(in_lock) == LOCK_REC); trx = in_lock->trx; @@ -2084,7 +2130,9 @@ lock_rec_free_all_from_discard_page( lock_t* lock; lock_t* next_lock; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ space = buf_frame_get_space_id(page); page_no = buf_frame_get_page_no(page); @@ -2117,7 +2165,9 @@ lock_rec_reset_and_release_wait( lock_t* lock; ulint heap_no; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ heap_no = rec_get_heap_no(rec); @@ -2149,7 +2199,9 @@ lock_rec_inherit_to_gap( { lock_t* lock; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ lock = lock_rec_get_first(rec); @@ -2179,7 +2231,9 @@ lock_rec_inherit_to_gap_if_gap_lock( { lock_t* lock; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ lock = lock_rec_get_first(rec); @@ -2212,7 +2266,9 @@ lock_rec_move( ulint heap_no; ulint type_mode; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ heap_no = rec_get_heap_no(donator); @@ -2848,7 +2904,9 @@ lock_deadlock_occurs( char* err_buf; ut_ad(trx && lock); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ retry: /* We check that adding this trx to the waits-for graph does not produce a cycle. First mark all active transactions @@ -2924,7 +2982,9 @@ lock_deadlock_recursive( ulint ret; ut_a(trx && start && wait_lock); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ if (trx->deadlock_mark == 1) { /* We have already exhaustively searched the subtree starting @@ -3115,7 +3175,9 @@ lock_table_create( lock_t* lock; ut_ad(table && trx); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ if (type_mode == LOCK_AUTO_INC) { /* Only one trx can have the lock on the table @@ -3165,7 +3227,9 @@ lock_table_remove_low( dict_table_t* table; trx_t* trx; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ table = lock->un_member.tab_lock.table; trx = lock->trx; @@ -3199,7 +3263,9 @@ lock_table_enqueue_waiting( lock_t* lock; trx_t* trx; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ /* Test if there already is some other reason to suspend thread: we do not enqueue a lock request if the query thread should be @@ -3269,7 +3335,9 @@ lock_table_other_has_incompatible( { lock_t* lock; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ lock = UT_LIST_GET_LAST(table->locks); @@ -3419,7 +3487,9 @@ lock_table_dequeue( { lock_t* lock; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(lock_get_type(in_lock) == LOCK_TABLE); lock = UT_LIST_GET_NEXT(un_member.tab_lock.locks, in_lock); @@ -3475,7 +3545,9 @@ lock_release_off_kernel( ulint count; lock_t* lock; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ lock = UT_LIST_GET_LAST(trx->trx_locks); @@ -3535,7 +3607,9 @@ lock_cancel_waiting_and_release( /*============================*/ lock_t* lock) /* in: waiting lock request */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ if (lock_get_type(lock) == LOCK_REC) { @@ -3568,7 +3642,9 @@ lock_reset_all_on_table_for_trx( lock_t* lock; lock_t* prev_lock; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ lock = UT_LIST_GET_LAST(trx->trx_locks); @@ -3630,7 +3706,9 @@ lock_table_print( 500 bytes */ lock_t* lock) /* in: table type lock */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_a(lock_get_type(lock) == LOCK_TABLE); buf += sprintf(buf, "TABLE LOCK table %s trx id %lu %lu", @@ -3677,7 +3755,9 @@ lock_rec_print( char* buf_start = buf; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_a(lock_get_type(lock) == LOCK_REC); space = lock->un_member.rec_lock.space; @@ -3739,7 +3819,9 @@ lock_rec_print( } if (page) { +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_NO_ORDER_CHECK); +#endif /* UNIV_SYNC_DEBUG */ } for (i = 0; i < lock_rec_get_n_bits(lock); i++) { @@ -3783,7 +3865,9 @@ lock_get_n_rec_locks(void) ulint n_locks = 0; ulint i; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ for (i = 0; i < hash_get_n_cells(lock_sys->rec_hash); i++) { @@ -4055,7 +4139,9 @@ lock_table_queue_validate( lock_t* lock; ibool is_waiting; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ is_waiting = FALSE; @@ -4208,12 +4294,16 @@ lock_rec_validate_page( ulint i; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(!mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ mtr_start(&mtr); page = buf_page_get(space, page_no, RW_X_LATCH, &mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_NO_ORDER_CHECK); +#endif /* UNIV_SYNC_DEBUG */ lock_mutex_enter_kernel(); loop: @@ -4458,7 +4548,9 @@ lock_rec_convert_impl_to_expl( { trx_t* impl_trx; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(page_rec_is_user_rec(rec)); if (index->type & DICT_CLUSTERED) { diff --git a/innobase/log/log0log.c b/innobase/log/log0log.c index cd2b6f520b0..256de701c0f 100644 --- a/innobase/log/log0log.c +++ b/innobase/log/log0log.c @@ -140,7 +140,9 @@ log_buf_pool_get_oldest_modification(void) { dulint lsn; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ lsn = buf_pool_get_oldest_modification(); @@ -239,7 +241,9 @@ log_write_low( ulint data_len; byte* log_block; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log->mutex))); +#endif /* UNIV_SYNC_DEBUG */ part_loop: /* Calculate a part length */ @@ -306,7 +310,9 @@ log_close(void) log_t* log = log_sys; ulint checkpoint_age; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log->mutex))); +#endif /* UNIV_SYNC_DEBUG */ lsn = log->lsn; @@ -421,7 +427,9 @@ log_group_get_capacity( /* out: capacity in bytes */ log_group_t* group) /* in: log group */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ return((group->file_size - LOG_FILE_HDR_SIZE) * group->n_files); } @@ -437,7 +445,9 @@ log_group_calc_size_offset( ulint offset, /* in: real offset within the log group */ log_group_t* group) /* in: log group */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ return(offset - LOG_FILE_HDR_SIZE * (1 + offset / group->file_size)); } @@ -453,7 +463,9 @@ log_group_calc_real_offset( ulint offset, /* in: size offset within the log group */ log_group_t* group) /* in: log group */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ return(offset + LOG_FILE_HDR_SIZE * (1 + offset / (group->file_size - LOG_FILE_HDR_SIZE))); @@ -475,7 +487,9 @@ log_group_calc_lsn_offset( ib_longlong group_size; ib_longlong offset; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ /* If total log file size is > 2 GB we can easily get overflows with 32-bit integers. Use 64-bit integers instead. */ @@ -589,7 +603,9 @@ log_calc_max_ages(void) ulint archive_margin; ulint smallest_archive_margin; +#ifdef UNIV_SYNC_DEBUG ut_ad(!mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ mutex_enter(&(log_sys->mutex)); @@ -876,7 +892,9 @@ log_flush_do_unlocks( ulint code) /* in: any ORed combination of LOG_UNLOCK_FLUSH_LOCK and LOG_UNLOCK_NONE_FLUSHED_LOCK */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ /* NOTE that we must own the log mutex when doing the setting of the events: this is because transactions will wait for these events to @@ -908,7 +926,9 @@ log_group_check_flush_completion( /* out: LOG_UNLOCK_NONE_FLUSHED_LOCK or 0 */ log_group_t* group) /* in: log group */ { - ut_ad(mutex_own(&(log_sys->mutex))); +#ifdef UNIV_SYNC_DEBUG + ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ if (!log_sys->one_flushed && group->n_pending_writes == 0) { @@ -941,7 +961,9 @@ log_sys_check_flush_completion(void) ulint move_start; ulint move_end; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ if (log_sys->n_pending_writes == 0) { @@ -1048,7 +1070,9 @@ log_group_file_header_flush( UT_NOT_USED(type); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_a(nth_file < group->n_files); @@ -1116,7 +1140,9 @@ log_group_write_buf( ulint next_offset; ulint i; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_a(len % OS_FILE_LOG_BLOCK_SIZE == 0); ut_a(ut_dulint_get_low(start_lsn) % OS_FILE_LOG_BLOCK_SIZE == 0); @@ -1513,7 +1539,9 @@ void log_complete_checkpoint(void) /*=========================*/ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(log_sys->n_pending_checkpoint_writes == 0); log_sys->next_checkpoint_no @@ -1603,7 +1631,9 @@ log_group_checkpoint( byte* buf; ulint i; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_a(LOG_CHECKPOINT_SIZE <= OS_FILE_LOG_BLOCK_SIZE); buf = group->checkpoint_buf; @@ -1757,7 +1787,9 @@ log_group_read_checkpoint_info( log_group_t* group, /* in: log group */ ulint field) /* in: LOG_CHECKPOINT_1 or LOG_CHECKPOINT_2 */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ log_sys->n_log_ios++; @@ -1775,7 +1807,9 @@ log_groups_write_checkpoint_info(void) { log_group_t* group; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ group = UT_LIST_GET_FIRST(log_sys->log_groups); @@ -2040,7 +2074,9 @@ log_group_read_log_seg( ulint source_offset; ibool sync; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ sync = FALSE; @@ -2110,7 +2146,9 @@ log_group_archive_file_header_write( byte* buf; ulint dest_offset; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_a(nth_file < group->n_files); @@ -2147,7 +2185,9 @@ log_group_archive_completed_header_write( byte* buf; ulint dest_offset; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_a(nth_file < group->n_files); buf = *(group->archive_file_header_bufs + nth_file); @@ -2186,7 +2226,9 @@ log_group_archive( ulint n_files; ulint open_mode; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ start_lsn = log_sys->archived_lsn; @@ -2314,7 +2356,9 @@ log_archive_groups(void) { log_group_t* group; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ group = UT_LIST_GET_FIRST(log_sys->log_groups); @@ -2337,7 +2381,9 @@ log_archive_write_complete_groups(void) dulint end_lsn; ulint i; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ group = UT_LIST_GET_FIRST(log_sys->log_groups); @@ -2399,7 +2445,9 @@ void log_archive_check_completion_low(void) /*==================================*/ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ if (log_sys->n_pending_archive_ios == 0 && log_sys->archiving_phase == LOG_ARCHIVE_READ) { @@ -2630,7 +2678,9 @@ log_archive_close_groups( log_group_t* group; ulint trunc_len; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ group = UT_LIST_GET_FIRST(log_sys->log_groups); @@ -3124,7 +3174,9 @@ log_check_log_recs( byte* buf1; byte* scan_buf; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ if (len == 0) { diff --git a/innobase/log/log0recv.c b/innobase/log/log0recv.c index a4ca1b4327c..1129146f768 100644 --- a/innobase/log/log0recv.c +++ b/innobase/log/log0recv.c @@ -152,7 +152,9 @@ void recv_sys_empty_hash(void) /*=====================*/ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(recv_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ if (recv_sys->n_addrs != 0) { fprintf(stderr, "InnoDB: Error: %lu pages with log records were left unprocessed!\n" @@ -1044,7 +1046,9 @@ recv_recover_page( &mtr); ut_a(success); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_NO_ORDER_CHECK); +#endif /* UNIV_SYNC_DEBUG */ } /* Read the newest modification lsn from the page */ @@ -1245,14 +1249,13 @@ loop: goto loop; } +#ifdef UNIV_SYNC_DEBUG + ut_ad(!allow_ibuf == mutex_own(&log_sys->mutex)); +#endif /* UNIV_SYNC_DEBUG */ if (!allow_ibuf) { - ut_ad(mutex_own(&(log_sys->mutex))); - recv_no_ibuf_operations = TRUE; - } else { - ut_ad(!mutex_own(&(log_sys->mutex))); } - + recv_sys->apply_log_recs = TRUE; recv_sys->apply_batch_on = TRUE; @@ -1282,8 +1285,10 @@ loop: page = buf_page_get(space, page_no, RW_X_LATCH, &mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_NO_ORDER_CHECK); +#endif /* UNIV_SYNC_DEBUG */ recv_recover_page(FALSE, FALSE, page, space, page_no); mtr_commit(&mtr); @@ -1505,7 +1510,9 @@ recv_update_replicate( replica = buf_page_get(space + RECV_REPLICA_SPACE_ADD, page_no, RW_X_LATCH, &mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(replica, SYNC_NO_ORDER_CHECK); +#endif /* UNIV_SYNC_DEBUG */ ptr = recv_parse_or_apply_log_rec_body(type, body, end_ptr, replica, &mtr); @@ -1574,7 +1581,9 @@ recv_compare_replicate( replica = buf_page_get(space + RECV_REPLICA_SPACE_ADD, page_no, RW_X_LATCH, &mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(replica, SYNC_NO_ORDER_CHECK); +#endif /* UNIV_SYNC_DEBUG */ recv_check_identical(page + FIL_PAGE_DATA, replica + FIL_PAGE_DATA, @@ -1615,7 +1624,9 @@ recv_compare_spaces( IB__FILE__, __LINE__, &mtr); if (frame) { +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(frame, SYNC_NO_ORDER_CHECK); +#endif /* UNIV_SYNC_DEBUG */ ut_memcpy(page, frame, UNIV_PAGE_SIZE); } else { /* Read it from file */ @@ -1628,7 +1639,9 @@ recv_compare_spaces( IB__FILE__, __LINE__, &mtr); if (frame) { +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(frame, SYNC_NO_ORDER_CHECK); +#endif /* UNIV_SYNC_DEBUG */ ut_memcpy(replica, frame, UNIV_PAGE_SIZE); } else { /* Read it from file */ @@ -1880,7 +1893,9 @@ recv_parse_log_recs( byte* body; ulint n_recs; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(!ut_dulint_is_zero(recv_sys->parse_start_lsn)); loop: ptr = recv_sys->buf + recv_sys->recovered_offset; @@ -2775,8 +2790,9 @@ recv_reset_logs( { log_group_t* group; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(log_sys->mutex))); - +#endif /* UNIV_SYNC_DEBUG */ log_sys->lsn = ut_dulint_align_up(lsn, OS_FILE_LOG_BLOCK_SIZE); group = UT_LIST_GET_FIRST(log_sys->log_groups); diff --git a/innobase/mem/mem0pool.c b/innobase/mem/mem0pool.c index 5ed12fedf43..6e02b2b20f1 100644 --- a/innobase/mem/mem0pool.c +++ b/innobase/mem/mem0pool.c @@ -259,7 +259,9 @@ mem_pool_fill_free_list( mem_area_t* area2; ibool ret; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(pool->mutex))); +#endif /* UNIV_SYNC_DEBUG */ if (i >= 63) { /* We come here when we have run out of space in the diff --git a/innobase/read/read0read.c b/innobase/read/read0read.c index 5c1d2d5418e..64b6d87283d 100644 --- a/innobase/read/read0read.c +++ b/innobase/read/read0read.c @@ -54,9 +54,10 @@ read_view_oldest_copy_or_open_new( ulint insert_done = 0; ulint n; ulint i; - - ut_ad(mutex_own(&kernel_mutex)); +#ifdef UNIV_SYNC_DEBUG + ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ old_view = UT_LIST_GET_LAST(trx_sys->view_list); if (old_view == NULL) { @@ -132,9 +133,9 @@ read_view_open_now( read_view_t* view; trx_t* trx; ulint n; - +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); - +#endif /* UNIV_SYNC_DEBUG */ view = read_view_create_low(UT_LIST_GET_LEN(trx_sys->trx_list), heap); view->creator = cr_trx; @@ -195,8 +196,9 @@ read_view_close( /*============*/ read_view_t* view) /* in: read view */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); - +#endif /* UNIV_SYNC_DEBUG */ UT_LIST_REMOVE(view_list, trx_sys->view_list, view); } diff --git a/innobase/row/row0ins.c b/innobase/row/row0ins.c index d4947357719..3acddba8235 100644 --- a/innobase/row/row0ins.c +++ b/innobase/row/row0ins.c @@ -1032,8 +1032,10 @@ row_ins_check_foreign_constraint( mtr_t mtr; run_again: +#ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(&dict_operation_lock, RW_LOCK_SHARED)); - +#endif /* UNIV_SYNC_DEBUG */ + err = DB_SUCCESS; if (thr_get_trx(thr)->check_foreigns == FALSE) { diff --git a/innobase/row/row0mysql.c b/innobase/row/row0mysql.c index 576c2bc1597..6fd9f6f0769 100644 --- a/innobase/row/row0mysql.c +++ b/innobase/row/row0mysql.c @@ -1267,9 +1267,11 @@ row_create_table_for_mysql( ulint err; ut_ad(trx->mysql_thread_id == os_thread_get_curr_id()); +#ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(&dict_operation_lock, RW_LOCK_EX)); - ut_ad(trx->dict_operation_lock_mode == RW_X_LATCH); ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ + ut_ad(trx->dict_operation_lock_mode == RW_X_LATCH); if (srv_created_new_raw) { fprintf(stderr, @@ -1471,8 +1473,10 @@ row_create_index_for_mysql( ulint err; ulint i, j; +#ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(&dict_operation_lock, RW_LOCK_EX)); ut_ad(mutex_own(&(dict_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(trx->mysql_thread_id == os_thread_get_curr_id()); trx->op_info = (char *) "creating index"; @@ -1576,8 +1580,10 @@ row_table_add_foreign_constraints( ulint keywordlen; ulint err; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); ut_ad(rw_lock_own(&dict_operation_lock, RW_LOCK_EX)); +#endif /* UNIV_SYNC_DEBUG */ ut_a(sql_string); trx->op_info = (char *) "adding foreign keys"; @@ -1748,7 +1754,9 @@ row_get_background_drop_list_len_low(void) /*======================================*/ /* out: how many tables in list */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ if (!row_mysql_drop_list_inited) { @@ -1968,8 +1976,10 @@ row_drop_table_for_mysql( locked_dictionary = TRUE; } +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); ut_ad(rw_lock_own(&dict_operation_lock, RW_LOCK_EX)); +#endif /* UNIV_SYNC_DEBUG */ graph = pars_sql(buf); diff --git a/innobase/row/row0purge.c b/innobase/row/row0purge.c index 104d71eda2d..42c4ee60b8a 100644 --- a/innobase/row/row0purge.c +++ b/innobase/row/row0purge.c @@ -447,8 +447,10 @@ skip_secondaries: data_field = buf_page_get(0, page_no, RW_X_LATCH, &mtr) + offset + internal_offset; +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(buf_frame_align(data_field), SYNC_TRX_UNDO_PAGE); +#endif /* UNIV_SYNC_DEBUG */ data_field_len = ufield->new_val.len; diff --git a/innobase/row/row0sel.c b/innobase/row/row0sel.c index fce47a8f9af..9dd308e62a1 100644 --- a/innobase/row/row0sel.c +++ b/innobase/row/row0sel.c @@ -930,7 +930,9 @@ row_sel_try_search_shortcut( ut_ad(node->read_view); ut_ad(plan->unique_search); ut_ad(!plan->must_get_clust); +#ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(&btr_search_latch, RW_LOCK_SHARED)); +#endif /* UNIV_SYNC_DEBUG */ row_sel_open_pcur(node, plan, TRUE, mtr); diff --git a/innobase/row/row0vers.c b/innobase/row/row0vers.c index fca56389e45..bc17ede89e3 100644 --- a/innobase/row/row0vers.c +++ b/innobase/row/row0vers.c @@ -60,8 +60,10 @@ row_vers_impl_x_locked_off_kernel( ulint err; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); ut_ad(!rw_lock_own(&(purge_sys->latch), RW_LOCK_SHARED)); +#endif /* UNIV_SYNC_DEBUG */ mutex_exit(&kernel_mutex); @@ -254,7 +256,9 @@ row_vers_must_preserve_del_marked( mtr_t* mtr) /* in: mtr holding the latch on the clustered index record; it will also hold the latch on purge_view */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(!rw_lock_own(&(purge_sys->latch), RW_LOCK_SHARED)); +#endif /* UNIV_SYNC_DEBUG */ mtr_s_lock(&(purge_sys->latch), mtr); @@ -302,7 +306,9 @@ row_vers_old_has_index_entry( ut_ad(mtr_memo_contains(mtr, buf_block_align(rec), MTR_MEMO_PAGE_X_FIX) || mtr_memo_contains(mtr, buf_block_align(rec), MTR_MEMO_PAGE_S_FIX)); +#ifdef UNIV_SYNC_DEBUG ut_ad(!rw_lock_own(&(purge_sys->latch), RW_LOCK_SHARED)); +#endif /* UNIV_SYNC_DEBUG */ mtr_s_lock(&(purge_sys->latch), mtr); clust_index = dict_table_get_first_index(index->table); @@ -411,7 +417,9 @@ row_vers_build_for_consistent_read( ut_ad(mtr_memo_contains(mtr, buf_block_align(rec), MTR_MEMO_PAGE_X_FIX) || mtr_memo_contains(mtr, buf_block_align(rec), MTR_MEMO_PAGE_S_FIX)); +#ifdef UNIV_SYNC_DEBUG ut_ad(!rw_lock_own(&(purge_sys->latch), RW_LOCK_SHARED)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(!read_view_sees_trx_id(view, row_get_rec_trx_id(rec, index))); rw_lock_s_lock(&(purge_sys->latch)); diff --git a/innobase/srv/srv0que.c b/innobase/srv/srv0que.c index 4d36adfefa4..ac8bd7d0e65 100644 --- a/innobase/srv/srv0que.c +++ b/innobase/srv/srv0que.c @@ -83,7 +83,9 @@ srv_que_task_enqueue_low( { ut_ad(thr); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ UT_LIST_ADD_LAST(queue, srv_sys->tasks, thr); diff --git a/innobase/srv/srv0srv.c b/innobase/srv/srv0srv.c index 3daf0fe9767..0658da71837 100644 --- a/innobase/srv/srv0srv.c +++ b/innobase/srv/srv0srv.c @@ -606,7 +606,9 @@ srv_suspend_thread(void) ulint slot_no; ulint type; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ slot_no = thr_local_get_slot_no(os_thread_get_curr_id()); @@ -656,7 +658,9 @@ srv_release_threads( ut_ad(type >= SRV_WORKER); ut_ad(type <= SRV_MASTER); ut_ad(n > 0); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ for (i = 0; i < OS_THREAD_MAX_N; i++) { @@ -1148,7 +1152,9 @@ srv_table_reserve_slot_for_mysql(void) srv_slot_t* slot; ulint i; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ i = 0; slot = srv_mysql_table + i; @@ -1213,7 +1219,9 @@ srv_suspend_mysql_thread( ibool had_dict_lock = FALSE; ibool was_declared_inside_innodb = FALSE; +#ifdef UNIV_SYNC_DEBUG ut_ad(!mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ trx = thr_get_trx(thr); @@ -1332,7 +1340,9 @@ srv_release_mysql_thread_if_suspended( srv_slot_t* slot; ulint i; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ for (i = 0; i < OS_THREAD_MAX_N; i++) { diff --git a/innobase/sync/sync0arr.c b/innobase/sync/sync0arr.c index 06e9fdcd63d..dbfac6ac086 100644 --- a/innobase/sync/sync0arr.c +++ b/innobase/sync/sync0arr.c @@ -100,6 +100,7 @@ struct sync_array_struct { since creation of the array */ }; +#ifdef UNIV_SYNC_DEBUG /********************************************************************** This function is called only in the debug version. Detects a deadlock of one or more threads because of waits of semaphores. */ @@ -113,6 +114,7 @@ sync_array_detect_deadlock( sync_cell_t* start, /* in: cell where recursive search started */ sync_cell_t* cell, /* in: cell to search */ ulint depth); /* in: recursion depth */ +#endif /* UNIV_SYNC_DEBUG */ /********************************************************************* Gets the nth cell in array. */ @@ -464,12 +466,17 @@ sync_array_cell_print( mutex = cell->old_wait_mutex; buf += sprintf(buf, - "Mutex at %lx created file %s line %lu, lock var %lu\n", - (ulint)mutex, mutex->cfile_name, mutex->cline, - mutex->lock_word); - buf += sprintf(buf, - "Last time reserved in file %s line %lu, waiters flag %lu\n", - mutex->file_name, mutex->line, mutex->waiters); + "Mutex at %p created file %s line %lu, lock var %lu\n" +#ifdef UNIV_SYNC_DEBUG + "Last time reserved in file %s line %lu, " +#endif /* UNIV_SYNC_DEBUG */ + "waiters flag %lu\n", + mutex, mutex->cfile_name, mutex->cline, + mutex->lock_word, +#ifdef UNIV_SYNC_DEBUG + mutex->file_name, mutex->line, +#endif /* UNIV_SYNC_DEBUG */ + mutex->waiters); } else if (type == RW_LOCK_EX || type == RW_LOCK_SHARED) { @@ -518,6 +525,7 @@ sync_array_cell_print( } } +#ifdef UNIV_SYNC_DEBUG /********************************************************************** Looks for a cell with the given thread id. */ static @@ -689,7 +697,6 @@ sync_array_detect_deadlock( sync_array_cell_print(buf, cell); printf("rw-lock %lx %s ", (ulint) lock, buf); rw_lock_debug_print(debug); - return(TRUE); } } @@ -739,6 +746,7 @@ sync_array_detect_deadlock( return(TRUE); /* Execution never reaches this line: for compiler fooling only */ } +#endif /* UNIV_SYNC_DEBUG */ /********************************************************************** Determines if we can wake up the thread waiting for a sempahore. */ diff --git a/innobase/sync/sync0rw.c b/innobase/sync/sync0rw.c index fd52d5aac2e..86924c437c7 100644 --- a/innobase/sync/sync0rw.c +++ b/innobase/sync/sync0rw.c @@ -31,6 +31,7 @@ ulint rw_x_exit_count = 0; rw_lock_list_t rw_lock_list; mutex_t rw_lock_list_mutex; +#ifdef UNIV_SYNC_DEBUG /* The global mutex which protects debug info lists of all rw-locks. To modify the debug info list of an rw-lock, this mutex has to be acquired in addition to the mutex protecting the lock. */ @@ -76,6 +77,7 @@ rw_lock_debug_free( { mem_free(info); } +#endif /* UNIV_SYNC_DEBUG */ /********************************************************************** Creates, or rather, initializes an rw-lock object in a specified memory @@ -107,10 +109,12 @@ rw_lock_create_func( lock->writer_is_wait_ex = FALSE; +#ifdef UNIV_SYNC_DEBUG UT_LIST_INIT(lock->debug_list); - lock->magic_n = RW_LOCK_MAGIC_N; lock->level = SYNC_LEVEL_NONE; +#endif /* UNIV_SYNC_DEBUG */ + lock->magic_n = RW_LOCK_MAGIC_N; lock->cfile_name = cfile_name; lock->cline = cline; @@ -307,8 +311,9 @@ rw_lock_x_lock_low( char* file_name,/* in: file name where lock requested */ ulint line) /* in: line where requested */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(rw_lock_get_mutex(lock))); - +#endif /* UNIV_SYNC_DEBUG */ if (rw_lock_get_writer(lock) == RW_LOCK_NOT_LOCKED) { if (rw_lock_get_reader_count(lock) == 0) { @@ -516,6 +521,7 @@ lock_loop: goto lock_loop; } +#ifdef UNIV_SYNC_DEBUG /********************************************************************** Acquires the debug mutex. We cannot use the mutex defined in sync0sync, because the debug mutex is also acquired in sync0arr while holding the OS @@ -641,6 +647,7 @@ rw_lock_remove_debug_info( ut_error; } +#endif /* UNIV_SYNC_DEBUG */ /********************************************************************** Sets the rw-lock latching level field. */ @@ -654,6 +661,7 @@ rw_lock_set_level( lock->level = level; } +#ifdef UNIV_SYNC_DEBUG /********************************************************************** Checks if the thread has locked the rw-lock in the specified mode, with the pass value == 0. */ @@ -671,9 +679,6 @@ rw_lock_own( ut_ad(lock); ut_ad(rw_lock_validate(lock)); -#ifndef UNIV_SYNC_DEBUG - ut_error; -#endif mutex_enter(&(lock->mutex)); info = UT_LIST_GET_FIRST(lock->debug_list); @@ -696,6 +701,7 @@ rw_lock_own( return(FALSE); } +#endif /* UNIV_SYNC_DEBUG */ /********************************************************************** Checks if somebody has locked the rw-lock in the specified mode. */ @@ -732,6 +738,7 @@ rw_lock_is_locked( return(ret); } +#ifdef UNIV_SYNC_DEBUG /******************************************************************* Prints debug info of currently locked rw-locks. */ @@ -739,8 +746,6 @@ void rw_lock_list_print_info(void) /*=========================*/ { -#ifndef UNIV_SYNC_DEBUG -#else rw_lock_t* lock; ulint count = 0; rw_lock_debug_t* info; @@ -784,7 +789,6 @@ rw_lock_list_print_info(void) printf("Total number of rw-locks %ld\n", count); mutex_exit(&rw_lock_list_mutex); -#endif } /******************************************************************* @@ -795,11 +799,6 @@ rw_lock_print( /*==========*/ rw_lock_t* lock __attribute__((unused))) /* in: rw-lock */ { -#ifndef UNIV_SYNC_DEBUG - printf( - "Sorry, cannot give rw-lock info in non-debug version!\n"); -#else - ulint count = 0; rw_lock_debug_t* info; printf("-------------\n"); @@ -822,7 +821,6 @@ rw_lock_print( info = UT_LIST_GET_NEXT(list, info); } } -#endif } /************************************************************************* @@ -862,12 +860,6 @@ ulint rw_lock_n_locked(void) /*==================*/ { -#ifndef UNIV_SYNC_DEBUG - printf( - "Sorry, cannot give rw-lock info in non-debug version!\n"); - ut_error; - return(0); -#else rw_lock_t* lock; ulint count = 0; @@ -890,5 +882,5 @@ rw_lock_n_locked(void) mutex_exit(&rw_lock_list_mutex); return(count); -#endif } +#endif /* UNIV_SYNC_DEBUG */ diff --git a/innobase/sync/sync0sync.c b/innobase/sync/sync0sync.c index 178511b8996..4f5d27bcc7c 100644 --- a/innobase/sync/sync0sync.c +++ b/innobase/sync/sync0sync.c @@ -188,8 +188,10 @@ mutex_create_func( #endif mutex_set_waiters(mutex, 0); mutex->magic_n = MUTEX_MAGIC_N; +#ifdef UNIV_SYNC_DEBUG mutex->line = 0; mutex->file_name = (char *) "not yet reserved"; +#endif /* UNIV_SYNC_DEBUG */ mutex->level = SYNC_LEVEL_NONE; mutex->cfile_name = cfile_name; mutex->cline = cline; @@ -253,9 +255,11 @@ mutex_enter_nowait( /*===============*/ /* out: 0 if succeed, 1 if not */ mutex_t* mutex, /* in: pointer to mutex */ - char* file_name, /* in: file name where mutex + char* file_name __attribute__((unused)), + /* in: file name where mutex requested */ - ulint line) /* in: line where requested */ + ulint line __attribute__((unused))) + /* in: line where requested */ { ut_ad(mutex_validate(mutex)); @@ -264,9 +268,6 @@ mutex_enter_nowait( #ifdef UNIV_SYNC_DEBUG mutex_set_debug_info(mutex, file_name, line); #endif - - mutex->file_name = file_name; - mutex->line = line; return(0); /* Succeeded! */ } @@ -366,9 +367,6 @@ spin_loop: mutex_set_debug_info(mutex, file_name, line); #endif - mutex->file_name = file_name; - mutex->line = line; - return; } @@ -413,9 +411,6 @@ spin_loop: mutex_set_debug_info(mutex, file_name, line); #endif - mutex->file_name = file_name; - mutex->line = line; - if (srv_print_latch_waits) { printf( "Thread %lu spin wait succeeds at 2: mutex at %lx\n", @@ -465,6 +460,7 @@ mutex_signal_object( sync_array_signal_object(sync_primary_wait_array, mutex); } +#ifdef UNIV_SYNC_DEBUG /********************************************************************** Sets the debug information for a reserved mutex. */ @@ -502,7 +498,8 @@ mutex_get_debug_info( *file_name = mutex->file_name; *line = mutex->line; *thread_id = mutex->thread_id; -} +} +#endif /* UNIV_SYNC_DEBUG */ /********************************************************************** Sets the mutex latching level field. */ @@ -516,6 +513,7 @@ mutex_set_level( mutex->level = level; } +#ifdef UNIV_SYNC_DEBUG /********************************************************************** Checks that the current thread owns the mutex. Works only in the debug version. */ @@ -548,8 +546,6 @@ void mutex_list_print_info(void) /*=======================*/ { -#ifndef UNIV_SYNC_DEBUG -#else mutex_t* mutex; char* file_name; ulint line; @@ -582,7 +578,6 @@ mutex_list_print_info(void) printf("Total number of mutexes %ld\n", count); mutex_exit(&mutex_list_mutex); -#endif } /********************************************************************** @@ -592,12 +587,6 @@ ulint mutex_n_reserved(void) /*==================*/ { -#ifndef UNIV_SYNC_DEBUG - printf("Sorry, cannot give mutex info in non-debug version!\n"); - ut_error; - - return(0); -#else mutex_t* mutex; ulint count = 0; @@ -620,7 +609,6 @@ mutex_n_reserved(void) return(count - 1); /* Subtract one, because this function itself was holding one mutex (mutex_list_mutex) */ -#endif } /********************************************************************** @@ -631,19 +619,9 @@ ibool sync_all_freed(void) /*================*/ { -#ifdef UNIV_SYNC_DEBUG - if (mutex_n_reserved() + rw_lock_n_locked() == 0) { - - return(TRUE); - } else { - return(FALSE); - } -#else - ut_error; - - return(FALSE); -#endif + return(mutex_n_reserved() + rw_lock_n_locked() == 0); } +#endif /* UNIV_SYNC_DEBUG */ /********************************************************************** Gets the value in the nth slot in the thread level arrays. */ @@ -740,9 +718,6 @@ sync_thread_levels_g( thread */ ulint limit) /* in: level limit */ { - char* file_name; - ulint line; - os_thread_id_t thread_id; sync_level_t* slot; rw_lock_t* lock; mutex_t* mutex; @@ -767,18 +742,28 @@ sync_thread_levels_g( mutex->cline); if (mutex_get_lock_word(mutex) != 0) { +#ifdef UNIV_SYNC_DEBUG + char* file_name; + ulint line; + os_thread_id_t thread_id; mutex_get_debug_info(mutex, &file_name, &line, &thread_id); - printf("InnoDB: Locked mutex: addr %lx thread %ld file %s line %ld\n", - (ulint)mutex, os_thread_pf(thread_id), - file_name, line); + fprintf(stderr, + "InnoDB: Locked mutex: addr %p thread %ld file %s line %ld\n", + mutex, os_thread_pf(thread_id), file_name, line); +#else /* UNIV_SYNC_DEBUG */ + fprintf(stderr, + "InnoDB: Locked mutex: addr %p\n", mutex); +#endif /* UNIV_SYNC_DEBUG */ } else { - printf("Not locked\n"); + fputs("Not locked\n", stderr); } } else { +#ifdef UNIV_SYNC_DEBUG rw_lock_print(lock); +#endif /* UNIV_SYNC_DEBUG */ } return(FALSE); @@ -918,7 +903,9 @@ sync_thread_add_level( if ((latch == (void*)&sync_thread_mutex) || (latch == (void*)&mutex_list_mutex) +#ifdef UNIV_SYNC_DEBUG || (latch == (void*)&rw_lock_debug_mutex) +#endif /* UNIV_SYNC_DEBUG */ || (latch == (void*)&rw_lock_list_mutex)) { return; @@ -1098,7 +1085,9 @@ sync_thread_reset_level( if ((latch == (void*)&sync_thread_mutex) || (latch == (void*)&mutex_list_mutex) +#ifdef UNIV_SYNC_DEBUG || (latch == (void*)&rw_lock_debug_mutex) +#endif /* UNIV_SYNC_DEBUG */ || (latch == (void*)&rw_lock_list_mutex)) { return(FALSE); @@ -1184,11 +1173,13 @@ sync_init(void) mutex_create(&rw_lock_list_mutex); mutex_set_level(&rw_lock_list_mutex, SYNC_NO_ORDER_CHECK); +#ifdef UNIV_SYNC_DEBUG mutex_create(&rw_lock_debug_mutex); mutex_set_level(&rw_lock_debug_mutex, SYNC_NO_ORDER_CHECK); rw_lock_debug_event = os_event_create(NULL); rw_lock_debug_waiters = FALSE; +#endif /* UNIV_SYNC_DEBUG */ } /********************************************************************** @@ -1250,9 +1241,11 @@ sync_print( char* buf, /* in/out: buffer where to print */ char* buf_end) /* in: buffer end */ { +#ifdef UNIV_SYNC_DEBUG mutex_list_print_info(); rw_lock_list_print_info(); +#endif /* UNIV_SYNC_DEBUG */ sync_array_print_info(buf, buf_end, sync_primary_wait_array); diff --git a/innobase/thr/thr0loc.c b/innobase/thr/thr0loc.c index 5da1d7dfb41..a17d09fcca6 100644 --- a/innobase/thr/thr0loc.c +++ b/innobase/thr/thr0loc.c @@ -65,7 +65,9 @@ thr_local_get( try_again: ut_ad(thr_local_hash); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&thr_local_mutex)); +#endif /* UNIV_SYNC_DEBUG */ /* Look for the local struct in the hash table */ diff --git a/innobase/trx/trx0purge.c b/innobase/trx/trx0purge.c index 222ca6debbd..c5984c5dea4 100644 --- a/innobase/trx/trx0purge.c +++ b/innobase/trx/trx0purge.c @@ -45,7 +45,9 @@ trx_purge_update_undo_must_exist( the undo log still exists in the system */ dulint trx_id) /* in: transaction id */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(&(purge_sys->latch), RW_LOCK_SHARED)); +#endif /* UNIV_SYNC_DEBUG */ if (!read_view_sees_trx_id(purge_sys->view, trx_id)) { @@ -195,7 +197,9 @@ void trx_purge_sys_create(void) /*======================*/ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ purge_sys = mem_alloc(sizeof(trx_purge_t)); @@ -258,7 +262,9 @@ trx_purge_add_update_undo_to_history( ut_ad(undo); rseg = undo->rseg; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(rseg->mutex))); +#endif /* UNIV_SYNC_DEBUG */ rseg_header = trx_rsegf_get(rseg->space, rseg->page_no, mtr); @@ -334,7 +340,9 @@ trx_purge_free_segment( /* printf("Freeing an update undo log segment\n"); */ +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(purge_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ loop: mtr_start(&mtr); mutex_enter(&(rseg->mutex)); @@ -430,7 +438,9 @@ trx_purge_truncate_rseg_history( ulint n_removed_logs = 0; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(purge_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ mtr_start(&mtr); mutex_enter(&(rseg->mutex)); @@ -516,7 +526,9 @@ trx_purge_truncate_history(void) dulint limit_trx_no; dulint limit_undo_no; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(purge_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ trx_purge_arr_get_biggest(purge_sys->arr, &limit_trx_no, &limit_undo_no); @@ -556,7 +568,9 @@ trx_purge_truncate_if_arr_empty(void) /*=================================*/ /* out: TRUE if array empty */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(purge_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ if (purge_sys->arr->n_used == 0) { @@ -585,7 +599,9 @@ trx_purge_rseg_get_next_history_log( ibool del_marks; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(purge_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ mutex_enter(&(rseg->mutex)); @@ -665,7 +681,9 @@ trx_purge_choose_next_log(void) ulint offset = 0; /* remove warning (??? bug ???) */ mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(purge_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(purge_sys->next_stored == FALSE); rseg = UT_LIST_GET_FIRST(trx_sys->rseg_list); @@ -766,7 +784,9 @@ trx_purge_get_next_rec( ulint cmpl_info; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(purge_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(purge_sys->next_stored); space = purge_sys->rseg->space; diff --git a/innobase/trx/trx0rec.c b/innobase/trx/trx0rec.c index c62f311d6a4..9d944e16a1e 100644 --- a/innobase/trx/trx0rec.c +++ b/innobase/trx/trx0rec.c @@ -1069,7 +1069,9 @@ trx_undo_report_row_operation( IB__FILE__, __LINE__, &mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(undo_page, SYNC_TRX_UNDO_PAGE); +#endif /* UNIV_SYNC_DEBUG */ if (op_type == TRX_UNDO_INSERT_OP) { offset = trx_undo_page_report_insert(undo_page, trx, @@ -1196,7 +1198,9 @@ trx_undo_get_undo_rec( trx_undo_rec_t** undo_rec, /* out, own: copy of the record */ mem_heap_t* heap) /* in: memory heap where copied */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(&(purge_sys->latch), RW_LOCK_SHARED)); +#endif /* UNIV_SYNC_DEBUG */ if (!trx_purge_update_undo_must_exist(trx_id)) { @@ -1256,7 +1260,9 @@ trx_undo_prev_version_build( ulint i; char err_buf[1000]; +#ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(&(purge_sys->latch), RW_LOCK_SHARED)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(mtr_memo_contains(index_mtr, buf_block_align(index_rec), MTR_MEMO_PAGE_S_FIX) || mtr_memo_contains(index_mtr, buf_block_align(index_rec), diff --git a/innobase/trx/trx0roll.c b/innobase/trx/trx0roll.c index 206aeb1d2ce..c00c6f0c862 100644 --- a/innobase/trx/trx0roll.c +++ b/innobase/trx/trx0roll.c @@ -676,8 +676,10 @@ trx_roll_try_truncate( dulint limit; dulint biggest; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(trx->undo_mutex))); ut_ad(mutex_own(&((trx->rseg)->mutex))); +#endif /* UNIV_SYNC_DEBUG */ trx->pages_undone = 0; @@ -720,7 +722,9 @@ trx_roll_pop_top_rec( trx_undo_rec_t* prev_rec; page_t* prev_rec_page; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(trx->undo_mutex))); +#endif /* UNIV_SYNC_DEBUG */ undo_page = trx_undo_page_get_s_latched(undo->space, undo->top_page_no, mtr); @@ -944,7 +948,9 @@ trx_rollback( que_thr_t* thr; /* que_thr_t* thr2; */ +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad((trx->undo_no_arr == NULL) || ((trx->undo_no_arr)->n_used == 0)); /* Initialize the rollback field in the transaction */ @@ -1013,7 +1019,9 @@ trx_roll_graph_build( que_thr_t* thr; /* que_thr_t* thr2; */ +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ heap = mem_heap_create(512); fork = que_fork_create(NULL, NULL, QUE_FORK_ROLLBACK, heap); @@ -1040,7 +1048,9 @@ trx_finish_error_processing( trx_sig_t* sig; trx_sig_t* next_sig; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ sig = UT_LIST_GET_FIRST(trx->signals); @@ -1073,7 +1083,9 @@ trx_finish_partial_rollback_off_kernel( { trx_sig_t* sig; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ sig = UT_LIST_GET_FIRST(trx->signals); @@ -1104,7 +1116,9 @@ trx_finish_rollback_off_kernel( trx_sig_t* sig; trx_sig_t* next_sig; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_a(trx->undo_no_arr == NULL || trx->undo_no_arr->n_used == 0); diff --git a/innobase/trx/trx0rseg.c b/innobase/trx/trx0rseg.c index b1fb8a9539c..d50bc9d8ba4 100644 --- a/innobase/trx/trx0rseg.c +++ b/innobase/trx/trx0rseg.c @@ -60,7 +60,9 @@ trx_rseg_header_create( page_t* page; ut_ad(mtr); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(mtr_memo_contains(mtr, fil_space_get_latch(space), MTR_MEMO_X_LOCK)); sys_header = trx_sysf_get(mtr); @@ -81,7 +83,9 @@ trx_rseg_header_create( return(FIL_NULL); } +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_RSEG_HEADER_NEW); +#endif /* UNIV_SYNC_DEBUG */ page_no = buf_frame_get_page_no(page); @@ -132,7 +136,9 @@ trx_rseg_mem_create( fil_addr_t node_addr; ulint sum_of_undo_sizes; - ut_ad(mutex_own(&kernel_mutex)); +#ifdef UNIV_SYNC_DEBUG + ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ rseg = mem_alloc(sizeof(trx_rseg_t)); diff --git a/innobase/trx/trx0sys.c b/innobase/trx/trx0sys.c index 3b5f024d39e..f7b1f9bb085 100644 --- a/innobase/trx/trx0sys.c +++ b/innobase/trx/trx0sys.c @@ -56,7 +56,9 @@ trx_sys_mark_downgraded_from_4_1_1(void) mtr_start(&mtr); page = buf_page_get(TRX_SYS_SPACE, TRX_SYS_PAGE_NO, RW_X_LATCH, &mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_NO_ORDER_CHECK); +#endif /* UNIV_SYNC_DEBUG */ doublewrite = page + TRX_SYS_DOUBLEWRITE; @@ -169,7 +171,9 @@ start_again: mtr_start(&mtr); page = buf_page_get(TRX_SYS_SPACE, TRX_SYS_PAGE_NO, RW_X_LATCH, &mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_NO_ORDER_CHECK); +#endif /* UNIV_SYNC_DEBUG */ doublewrite = page + TRX_SYS_DOUBLEWRITE; @@ -228,7 +232,9 @@ start_again: /* fseg_create acquires a second latch on the page, therefore we must declare it: */ +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page2, SYNC_NO_ORDER_CHECK); +#endif /* UNIV_SYNC_DEBUG */ if (page2 == NULL) { fprintf(stderr, @@ -271,7 +277,9 @@ start_again: new_page = buf_page_get(TRX_SYS_SPACE, page_no, RW_X_LATCH, &mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(new_page, SYNC_NO_ORDER_CHECK); +#endif /* UNIV_SYNC_DEBUG */ /* Make a dummy change to the page to ensure it will be written to disk in a flush */ @@ -490,7 +498,9 @@ trx_in_trx_list( { trx_t* trx; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(kernel_mutex))); +#endif /* UNIV_SYNC_DEBUG */ trx = UT_LIST_GET_FIRST(trx_sys->trx_list); @@ -517,7 +527,9 @@ trx_sys_flush_max_trx_id(void) trx_sysf_t* sys_header; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ mtr_start(&mtr); @@ -716,7 +728,9 @@ trx_sysf_rseg_find_free( ulint page_no; ulint i; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(kernel_mutex))); +#endif /* UNIV_SYNC_DEBUG */ sys_header = trx_sysf_get(mtr); @@ -762,7 +776,9 @@ trx_sysf_create( mtr); ut_a(buf_frame_get_page_no(page) == TRX_SYS_PAGE_NO); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_TRX_SYS_HEADER); +#endif /* UNIV_SYNC_DEBUG */ sys_header = trx_sysf_get(mtr); diff --git a/innobase/trx/trx0trx.c b/innobase/trx/trx0trx.c index 78a7e277657..793a3421742 100644 --- a/innobase/trx/trx0trx.c +++ b/innobase/trx/trx0trx.c @@ -73,7 +73,9 @@ trx_create( { trx_t* trx; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ trx = mem_alloc(sizeof(trx_t)); @@ -239,7 +241,9 @@ trx_free( { char err_buf[1000]; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ if (trx->declared_to_be_inside_innodb) { ut_print_timestamp(stderr); @@ -345,7 +349,9 @@ trx_list_insert_ordered( { trx_t* trx2; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ trx2 = UT_LIST_GET_FIRST(trx_sys->trx_list); @@ -507,7 +513,9 @@ trx_assign_rseg(void) { trx_rseg_t* rseg = trx_sys->latest_rseg; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ loop: /* Get next rseg in a round-robin fashion */ @@ -544,7 +552,9 @@ trx_start_low( { trx_rseg_t* rseg; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(trx->rseg == NULL); if (trx->type == TRX_PURGE) { @@ -619,7 +629,9 @@ trx_commit_off_kernel( ibool must_flush_log = FALSE; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ rseg = trx->rseg; @@ -713,7 +725,9 @@ trx_commit_off_kernel( } ut_ad(trx->conc_state == TRX_ACTIVE); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ /* The following assignment makes the transaction committed in memory and makes its changes to data visible to other transactions. @@ -893,7 +907,9 @@ trx_handle_commit_sig_off_kernel( trx_sig_t* sig; trx_sig_t* next_sig; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ trx->que_state = TRX_QUE_COMMITTING; @@ -933,7 +949,9 @@ trx_end_lock_wait( { que_thr_t* thr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(trx->que_state == TRX_QUE_LOCK_WAIT); thr = UT_LIST_GET_FIRST(trx->wait_thrs); @@ -960,7 +978,9 @@ trx_lock_wait_to_suspended( { que_thr_t* thr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(trx->que_state == TRX_QUE_LOCK_WAIT); thr = UT_LIST_GET_FIRST(trx->wait_thrs); @@ -988,7 +1008,9 @@ trx_sig_reply_wait_to_suspended( trx_sig_t* sig; que_thr_t* thr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ sig = UT_LIST_GET_FIRST(trx->reply_signals); @@ -1021,7 +1043,9 @@ trx_sig_is_compatible( { trx_sig_t* sig; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ if (UT_LIST_GET_LEN(trx->signals) == 0) { @@ -1109,7 +1133,9 @@ trx_sig_send( trx_t* receiver_trx; ut_ad(trx); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ if (!trx_sig_is_compatible(trx, type, sender)) { /* The signal is not compatible with the other signals in @@ -1188,7 +1214,9 @@ trx_end_signal_handling( /*====================*/ trx_t* trx) /* in: trx */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(trx->handling_signals == TRUE); trx->handling_signals = FALSE; @@ -1222,7 +1250,9 @@ loop: we can process immediately */ ut_ad(trx); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ if (trx->handling_signals && (UT_LIST_GET_LEN(trx->signals) == 0)) { @@ -1323,7 +1353,9 @@ trx_sig_reply( trx_t* receiver_trx; ut_ad(sig); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ if (sig->receiver != NULL) { ut_ad((sig->receiver)->state == QUE_THR_SIG_REPLY_WAIT); @@ -1351,7 +1383,9 @@ trx_sig_remove( trx_sig_t* sig) /* in, own: signal */ { ut_ad(trx && sig); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(sig->receiver == NULL); diff --git a/innobase/trx/trx0undo.c b/innobase/trx/trx0undo.c index 0b82a929878..7f7967477eb 100644 --- a/innobase/trx/trx0undo.c +++ b/innobase/trx/trx0undo.c @@ -390,7 +390,9 @@ trx_undo_seg_create( ibool success; ut_ad(mtr && id && rseg_hdr); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(rseg->mutex))); +#endif /* UNIV_SYNC_DEBUG */ /* if (type == TRX_UNDO_INSERT) { printf("Creating insert undo log segment\n"); @@ -430,7 +432,9 @@ trx_undo_seg_create( return(NULL); } +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(undo_page, SYNC_TRX_UNDO_PAGE); +#endif /* UNIV_SYNC_DEBUG */ page_hdr = undo_page + TRX_UNDO_PAGE_HDR; seg_hdr = undo_page + TRX_UNDO_SEG_HDR; @@ -735,13 +739,14 @@ trx_undo_add_page( ulint page_no; ibool success; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(trx->undo_mutex))); ut_ad(!mutex_own(&kernel_mutex)); + ut_ad(mutex_own(&(trx->rseg->mutex))); +#endif /* UNIV_SYNC_DEBUG */ rseg = trx->rseg; - ut_ad(mutex_own(&(rseg->mutex))); - if (rseg->curr_size == rseg->max_size) { return(FIL_NULL); @@ -811,8 +816,10 @@ trx_undo_free_page( UT_NOT_USED(hdr_offset); ut_a(hdr_page_no != page_no); +#ifdef UNIV_SYNC_DEBUG ut_ad(!mutex_own(&kernel_mutex)); ut_ad(mutex_own(&(rseg->mutex))); +#endif /* UNIV_SYNC_DEBUG */ undo_page = trx_undo_page_get(space, page_no, mtr); @@ -859,7 +866,9 @@ trx_undo_free_page_in_rollback( ulint last_page_no; ut_ad(undo->hdr_page_no != page_no); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(trx->undo_mutex))); +#endif /* UNIV_SYNC_DEBUG */ last_page_no = trx_undo_free_page(undo->rseg, FALSE, undo->space, undo->hdr_page_no, undo->hdr_offset, @@ -913,12 +922,13 @@ trx_undo_truncate_end( trx_rseg_t* rseg; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(trx->undo_mutex))); + ut_ad(mutex_own(&(trx->rseg->mutex))); +#endif /* UNIV_SYNC_DEBUG */ rseg = trx->rseg; - ut_ad(mutex_own(&(rseg->mutex))); - for (;;) { mtr_start(&mtr); @@ -992,7 +1002,9 @@ trx_undo_truncate_start( ulint page_no; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(rseg->mutex))); +#endif /* UNIV_SYNC_DEBUG */ if (0 == ut_dulint_cmp(limit, ut_dulint_zero)) { @@ -1058,8 +1070,9 @@ trx_undo_seg_free( while (!finished) { mtr_start(&mtr); - +#ifdef UNIV_SYNC_DEBUG ut_ad(!mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ mutex_enter(&(rseg->mutex)); seg_header = trx_undo_page_get(undo->space, undo->hdr_page_no, @@ -1268,7 +1281,9 @@ trx_undo_mem_create( { trx_undo_t* undo; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(rseg->mutex))); +#endif /* UNIV_SYNC_DEBUG */ if (id >= TRX_RSEG_N_SLOTS) { fprintf(stderr, @@ -1312,7 +1327,9 @@ trx_undo_mem_init_for_reuse( is created */ ulint offset) /* in: undo log header byte offset on page */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&((undo->rseg)->mutex))); +#endif /* UNIV_SYNC_DEBUG */ if (undo->id >= TRX_RSEG_N_SLOTS) { fprintf(stderr, "InnoDB: Error: undo->id is %lu\n", undo->id); @@ -1370,7 +1387,9 @@ trx_undo_create( trx_undo_t* undo; page_t* undo_page; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(rseg->mutex))); +#endif /* UNIV_SYNC_DEBUG */ if (rseg->curr_size == rseg->max_size) { @@ -1421,7 +1440,9 @@ trx_undo_reuse_cached( page_t* undo_page; ulint offset; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(rseg->mutex))); +#endif /* UNIV_SYNC_DEBUG */ if (type == TRX_UNDO_INSERT) { @@ -1517,11 +1538,15 @@ trx_undo_assign_undo( rseg = trx->rseg; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(trx->undo_mutex))); +#endif /* UNIV_SYNC_DEBUG */ mtr_start(&mtr); +#ifdef UNIV_SYNC_DEBUG ut_ad(!mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ mutex_enter(&(rseg->mutex)); undo = trx_undo_reuse_cached(rseg, type, trx->id, &mtr); @@ -1626,8 +1651,9 @@ trx_undo_update_cleanup( undo = trx->update_undo; rseg = trx->rseg; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(rseg->mutex))); - +#endif /* UNIV_SYNC_DEBUG */ trx_purge_add_update_undo_to_history(trx, undo_page, mtr); UT_LIST_REMOVE(undo_list, rseg->update_undo_list, undo); @@ -1666,8 +1692,10 @@ trx_undo_update_cleanup_by_discard( undo = trx->update_undo; rseg = trx->rseg; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(rseg->mutex))); ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(undo->size == 1); ut_ad(undo->del_marks == FALSE); ut_ad(UT_LIST_GET_LEN(trx_sys->view_list) == 1); From 9287264b6ba206b0538ea9331bf57e6d43b68588 Mon Sep 17 00:00:00 2001 From: "marko@hundin.mysql.fi" <> Date: Fri, 12 Mar 2004 17:44:25 +0200 Subject: [PATCH 59/65] Remove constant parameter MLOG_8BYTES from mtr_read_dulint() and mlog_write_dulint() --- innobase/dict/dict0boot.c | 20 ++++------ innobase/fsp/fsp0fsp.c | 76 +++++++++++++++++-------------------- innobase/include/btr0btr.ic | 3 +- innobase/include/mtr0log.h | 1 - innobase/include/mtr0mtr.h | 1 - innobase/mtr/mtr0log.c | 5 +-- innobase/mtr/mtr0mtr.c | 2 - innobase/trx/trx0purge.c | 3 +- innobase/trx/trx0rseg.c | 3 +- innobase/trx/trx0sys.c | 7 ++-- innobase/trx/trx0undo.c | 8 ++-- 11 files changed, 53 insertions(+), 76 deletions(-) diff --git a/innobase/dict/dict0boot.c b/innobase/dict/dict0boot.c index 7985dbeee66..3abb71a842d 100644 --- a/innobase/dict/dict0boot.c +++ b/innobase/dict/dict0boot.c @@ -65,7 +65,7 @@ dict_hdr_get_new_id( dict_hdr = dict_hdr_get(&mtr); - id = mtr_read_dulint(dict_hdr + type, MLOG_8BYTES, &mtr); + id = mtr_read_dulint(dict_hdr + type, &mtr); /* Add some dummy code here because otherwise pgcc seems to compile wrong */ @@ -76,7 +76,7 @@ dict_hdr_get_new_id( id = ut_dulint_add(id, 1); - mlog_write_dulint(dict_hdr + type, id, MLOG_8BYTES, &mtr); + mlog_write_dulint(dict_hdr + type, id, &mtr); mtr_commit(&mtr); @@ -105,7 +105,7 @@ dict_hdr_flush_row_id(void) dict_hdr = dict_hdr_get(&mtr); - mlog_write_dulint(dict_hdr + DICT_HDR_ROW_ID, id, MLOG_8BYTES, &mtr); + mlog_write_dulint(dict_hdr + DICT_HDR_ROW_ID, id, &mtr); mtr_commit(&mtr); } @@ -141,20 +141,16 @@ dict_hdr_create( /* Start counting row, table, index, and tree ids from DICT_HDR_FIRST_ID */ mlog_write_dulint(dict_header + DICT_HDR_ROW_ID, - ut_dulint_create(0, DICT_HDR_FIRST_ID), - MLOG_8BYTES, mtr); + ut_dulint_create(0, DICT_HDR_FIRST_ID), mtr); mlog_write_dulint(dict_header + DICT_HDR_TABLE_ID, - ut_dulint_create(0, DICT_HDR_FIRST_ID), - MLOG_8BYTES, mtr); + ut_dulint_create(0, DICT_HDR_FIRST_ID), mtr); mlog_write_dulint(dict_header + DICT_HDR_INDEX_ID, - ut_dulint_create(0, DICT_HDR_FIRST_ID), - MLOG_8BYTES, mtr); + ut_dulint_create(0, DICT_HDR_FIRST_ID), mtr); mlog_write_dulint(dict_header + DICT_HDR_MIX_ID, - ut_dulint_create(0, DICT_HDR_FIRST_ID), - MLOG_8BYTES, mtr); + ut_dulint_create(0, DICT_HDR_FIRST_ID), mtr); /* Create the B-tree roots for the clustered indexes of the basic system tables */ @@ -250,7 +246,7 @@ dict_boot(void) dict_sys->row_id = ut_dulint_add( ut_dulint_align_up( mtr_read_dulint(dict_hdr + DICT_HDR_ROW_ID, - MLOG_8BYTES, &mtr), + &mtr), DICT_HDR_ROW_ID_WRITE_MARGIN), DICT_HDR_ROW_ID_WRITE_MARGIN); diff --git a/innobase/fsp/fsp0fsp.c b/innobase/fsp/fsp0fsp.c index f1c86e1f571..de6e2a2a4c0 100644 --- a/innobase/fsp/fsp0fsp.c +++ b/innobase/fsp/fsp0fsp.c @@ -868,8 +868,7 @@ fsp_header_init( flst_init(header + FSP_SEG_INODES_FULL, mtr); flst_init(header + FSP_SEG_INODES_FREE, mtr); - mlog_write_dulint(header + FSP_SEG_ID, ut_dulint_create(0, 1), - MLOG_8BYTES, mtr); + mlog_write_dulint(header + FSP_SEG_ID, ut_dulint_create(0, 1), mtr); fsp_fill_free_list(space, header, mtr); btr_create(DICT_CLUSTERED | DICT_UNIVERSAL | DICT_IBUF, space, @@ -1553,8 +1552,7 @@ fsp_alloc_seg_inode_page( inode = fsp_seg_inode_page_get_nth_inode(page, i, mtr); - mlog_write_dulint(inode + FSEG_ID, ut_dulint_zero, - MLOG_8BYTES, mtr); + mlog_write_dulint(inode + FSEG_ID, ut_dulint_zero, mtr); } flst_add_last(space_header + FSP_SEG_INODES_FREE, @@ -1649,7 +1647,7 @@ fsp_free_seg_inode( page + FSEG_INODE_PAGE_NODE, mtr); } - mlog_write_dulint(inode + FSEG_ID, ut_dulint_zero, MLOG_8BYTES, mtr); + mlog_write_dulint(inode + FSEG_ID, ut_dulint_zero, mtr); mlog_write_ulint(inode + FSEG_MAGIC_N, 0, MLOG_4BYTES, mtr); if (ULINT_UNDEFINED == fsp_seg_inode_page_find_used(page, mtr)) { @@ -1883,12 +1881,12 @@ fseg_create_general( /* Read the next segment id from space header and increment the value in space header */ - seg_id = mtr_read_dulint(space_header + FSP_SEG_ID, MLOG_8BYTES, mtr); + seg_id = mtr_read_dulint(space_header + FSP_SEG_ID, mtr); mlog_write_dulint(space_header + FSP_SEG_ID, ut_dulint_add(seg_id, 1), - MLOG_8BYTES, mtr); + mtr); - mlog_write_dulint(inode + FSEG_ID, seg_id, MLOG_8BYTES, mtr); + mlog_write_dulint(inode + FSEG_ID, seg_id, mtr); mlog_write_ulint(inode + FSEG_NOT_FULL_N_USED, 0, MLOG_4BYTES, mtr); flst_init(inode + FSEG_FREE, mtr); @@ -2070,8 +2068,8 @@ fseg_fill_free_list( xdes_set_state(descr, XDES_FSEG, mtr); - seg_id = mtr_read_dulint(inode + FSEG_ID, MLOG_8BYTES, mtr); - mlog_write_dulint(descr + XDES_ID, seg_id, MLOG_8BYTES, mtr); + seg_id = mtr_read_dulint(inode + FSEG_ID, mtr); + mlog_write_dulint(descr + XDES_ID, seg_id, mtr); flst_add_last(inode + FSEG_FREE, descr + XDES_FLST_NODE, mtr); hint += FSP_EXTENT_SIZE; @@ -2112,10 +2110,10 @@ fseg_alloc_free_extent( return(NULL); } - seg_id = mtr_read_dulint(inode + FSEG_ID, MLOG_8BYTES, mtr); + seg_id = mtr_read_dulint(inode + FSEG_ID, mtr); xdes_set_state(descr, XDES_FSEG, mtr); - mlog_write_dulint(descr + XDES_ID, seg_id, MLOG_8BYTES, mtr); + mlog_write_dulint(descr + XDES_ID, seg_id, mtr); flst_add_last(inode + FSEG_FREE, descr + XDES_FLST_NODE, mtr); /* Try to fill the segment free list */ @@ -2162,7 +2160,7 @@ fseg_alloc_free_page_low( ut_ad((direction >= FSP_UP) && (direction <= FSP_NO_DIR)); ut_ad(mach_read_from_4(seg_inode + FSEG_MAGIC_N) == FSEG_MAGIC_N_VALUE); - seg_id = mtr_read_dulint(seg_inode + FSEG_ID, MLOG_8BYTES, mtr); + seg_id = mtr_read_dulint(seg_inode + FSEG_ID, mtr); ut_ad(ut_dulint_cmp(seg_id, ut_dulint_zero) > 0); @@ -2181,8 +2179,7 @@ fseg_alloc_free_page_low( /*-------------------------------------------------------------*/ if ((xdes_get_state(descr, mtr) == XDES_FSEG) && (0 == ut_dulint_cmp(mtr_read_dulint(descr + XDES_ID, - MLOG_8BYTES, mtr), - seg_id)) + mtr), seg_id)) && (xdes_get_bit(descr, XDES_FREE_BIT, hint % FSP_EXTENT_SIZE, mtr) == TRUE)) { @@ -2204,8 +2201,7 @@ fseg_alloc_free_page_low( ut_a(ret_descr == descr); xdes_set_state(ret_descr, XDES_FSEG, mtr); - mlog_write_dulint(ret_descr + XDES_ID, seg_id, MLOG_8BYTES, - mtr); + mlog_write_dulint(ret_descr + XDES_ID, seg_id, mtr); flst_add_last(seg_inode + FSEG_FREE, ret_descr + XDES_FLST_NODE, mtr); @@ -2234,8 +2230,7 @@ fseg_alloc_free_page_low( /*-------------------------------------------------------------*/ } else if ((xdes_get_state(descr, mtr) == XDES_FSEG) && (0 == ut_dulint_cmp(mtr_read_dulint(descr + XDES_ID, - MLOG_8BYTES, mtr), - seg_id)) + mtr), seg_id)) && (!xdes_is_full(descr, mtr))) { /* 4. We can take the page from the same extent as the @@ -2743,18 +2738,18 @@ fseg_free_page_low( "InnoDB: segment %lu %lu.\n", space, page, ut_dulint_get_high( - mtr_read_dulint(descr + XDES_ID, MLOG_8BYTES, mtr)), + mtr_read_dulint(descr + XDES_ID, mtr)), ut_dulint_get_low( - mtr_read_dulint(descr + XDES_ID, MLOG_8BYTES, mtr)), + mtr_read_dulint(descr + XDES_ID, mtr)), ut_dulint_get_high( - mtr_read_dulint(seg_inode + FSEG_ID, MLOG_8BYTES, mtr)), + mtr_read_dulint(seg_inode + FSEG_ID, mtr)), ut_dulint_get_low( - mtr_read_dulint(seg_inode + FSEG_ID, MLOG_8BYTES, mtr))); + mtr_read_dulint(seg_inode + FSEG_ID, mtr))); */ /* If we get here, the page is in some extent of the segment */ if (0 != ut_dulint_cmp( - mtr_read_dulint(descr + XDES_ID, MLOG_8BYTES, mtr), - mtr_read_dulint(seg_inode + FSEG_ID, MLOG_8BYTES, mtr))) { + mtr_read_dulint(descr + XDES_ID, mtr), + mtr_read_dulint(seg_inode + FSEG_ID, mtr))) { ut_sprintf_buf(errbuf, descr, 40); fprintf(stderr, @@ -2772,21 +2767,21 @@ fseg_free_page_low( "InnoDB: to segment %lu %lu.\n", space, page, ut_dulint_get_high( - mtr_read_dulint(descr + XDES_ID, MLOG_8BYTES, mtr)), + mtr_read_dulint(descr + XDES_ID, mtr)), ut_dulint_get_low( - mtr_read_dulint(descr + XDES_ID, MLOG_8BYTES, mtr)), + mtr_read_dulint(descr + XDES_ID, mtr)), ut_dulint_get_high( - mtr_read_dulint(seg_inode + FSEG_ID, MLOG_8BYTES, mtr)), + mtr_read_dulint(seg_inode + FSEG_ID, mtr)), ut_dulint_get_low( - mtr_read_dulint(seg_inode + FSEG_ID, MLOG_8BYTES, mtr))); + mtr_read_dulint(seg_inode + FSEG_ID, mtr))); #else /* More pedantic usage to avoid VC++ 6.0 compiler errors due to inline function expansion issues */ - desm = mtr_read_dulint(descr + XDES_ID, MLOG_8BYTES, mtr); - segm = mtr_read_dulint(seg_inode + FSEG_ID, MLOG_8BYTES, mtr); + desm = mtr_read_dulint(descr + XDES_ID, mtr); + segm = mtr_read_dulint(seg_inode + FSEG_ID, mtr); fprintf(stderr, "InnoDB: Serious error: InnoDB is trying to free space %lu page %lu,\n" @@ -2886,8 +2881,8 @@ fseg_free_extent( ut_a(xdes_get_state(descr, mtr) == XDES_FSEG); ut_a(0 == ut_dulint_cmp( - mtr_read_dulint(descr + XDES_ID, MLOG_8BYTES, mtr), - mtr_read_dulint(seg_inode + FSEG_ID, MLOG_8BYTES, mtr))); + mtr_read_dulint(descr + XDES_ID, mtr), + mtr_read_dulint(seg_inode + FSEG_ID, mtr))); first_page_in_extent = page - (page % FSP_EXTENT_SIZE); @@ -3179,7 +3174,7 @@ fseg_validate_low( space = buf_frame_get_space_id(inode); - seg_id = mtr_read_dulint(inode + FSEG_ID, MLOG_8BYTES, mtr2); + seg_id = mtr_read_dulint(inode + FSEG_ID, mtr2); n_used = mtr_read_ulint(inode + FSEG_NOT_FULL_N_USED, MLOG_4BYTES, mtr2); flst_validate(inode + FSEG_FREE, mtr2); @@ -3198,8 +3193,7 @@ fseg_validate_low( ut_a(xdes_get_n_used(descr, &mtr) == 0); ut_a(xdes_get_state(descr, &mtr) == XDES_FSEG); ut_a(0 == ut_dulint_cmp( - mtr_read_dulint(descr + XDES_ID, MLOG_8BYTES, - &mtr), seg_id)); + mtr_read_dulint(descr + XDES_ID, &mtr), seg_id)); node_addr = flst_get_next_addr(descr + XDES_FLST_NODE, &mtr); mtr_commit(&mtr); @@ -3219,8 +3213,7 @@ fseg_validate_low( ut_a(xdes_get_n_used(descr, &mtr) < FSP_EXTENT_SIZE); ut_a(xdes_get_state(descr, &mtr) == XDES_FSEG); ut_a(0 == ut_dulint_cmp( - mtr_read_dulint(descr + XDES_ID, MLOG_8BYTES, - &mtr), seg_id)); + mtr_read_dulint(descr + XDES_ID, &mtr), seg_id)); n_used2 += xdes_get_n_used(descr, &mtr); @@ -3241,8 +3234,7 @@ fseg_validate_low( ut_a(xdes_get_n_used(descr, &mtr) == FSP_EXTENT_SIZE); ut_a(xdes_get_state(descr, &mtr) == XDES_FSEG); ut_a(0 == ut_dulint_cmp( - mtr_read_dulint(descr + XDES_ID, MLOG_8BYTES, - &mtr), seg_id)); + mtr_read_dulint(descr + XDES_ID, &mtr), seg_id)); node_addr = flst_get_next_addr(descr + XDES_FLST_NODE, &mtr); mtr_commit(&mtr); @@ -3307,7 +3299,7 @@ fseg_print_low( reserved = fseg_n_reserved_pages_low(inode, &used, mtr); - d_var = mtr_read_dulint(inode + FSEG_ID, MLOG_8BYTES, mtr); + d_var = mtr_read_dulint(inode + FSEG_ID, mtr); seg_id_low = ut_dulint_get_low(d_var); seg_id_high = ut_dulint_get_high(d_var); @@ -3623,7 +3615,7 @@ fsp_print( n_free_frag = flst_get_len(header + FSP_FREE_FRAG, &mtr); n_full_frag = flst_get_len(header + FSP_FULL_FRAG, &mtr); - d_var = mtr_read_dulint(header + FSP_SEG_ID, MLOG_8BYTES, &mtr); + d_var = mtr_read_dulint(header + FSP_SEG_ID, &mtr); seg_id_low = ut_dulint_get_low(d_var); seg_id_high = ut_dulint_get_high(d_var); diff --git a/innobase/include/btr0btr.ic b/innobase/include/btr0btr.ic index 09006828cc9..fd66c7bf2a3 100644 --- a/innobase/include/btr0btr.ic +++ b/innobase/include/btr0btr.ic @@ -45,8 +45,7 @@ btr_page_set_index_id( dulint id, /* in: index id */ mtr_t* mtr) /* in: mtr */ { - mlog_write_dulint(page + PAGE_HEADER + PAGE_INDEX_ID, id, - MLOG_8BYTES, mtr); + mlog_write_dulint(page + PAGE_HEADER + PAGE_INDEX_ID, id, mtr); } /****************************************************************** diff --git a/innobase/include/mtr0log.h b/innobase/include/mtr0log.h index d7de6feb94d..367c9a00651 100644 --- a/innobase/include/mtr0log.h +++ b/innobase/include/mtr0log.h @@ -32,7 +32,6 @@ mlog_write_dulint( /*==============*/ byte* ptr, /* in: pointer where to write */ dulint val, /* in: value to write */ - byte type, /* in: MLOG_8BYTES */ mtr_t* mtr); /* in: mini-transaction handle */ /************************************************************ Writes a string to a file page buffered in the buffer pool. Writes the diff --git a/innobase/include/mtr0mtr.h b/innobase/include/mtr0mtr.h index dd582adcb6f..d999b7cc5b7 100644 --- a/innobase/include/mtr0mtr.h +++ b/innobase/include/mtr0mtr.h @@ -189,7 +189,6 @@ mtr_read_dulint( /*===========*/ /* out: value read */ byte* ptr, /* in: pointer from where to read */ - ulint type, /* in: MLOG_8BYTES */ mtr_t* mtr); /* in: mini-transaction handle */ /************************************************************************* This macro locks an rw-lock in s-mode. */ diff --git a/innobase/mtr/mtr0log.c b/innobase/mtr/mtr0log.c index 2cfe81d3261..49e3ac7ae0f 100644 --- a/innobase/mtr/mtr0log.c +++ b/innobase/mtr/mtr0log.c @@ -261,7 +261,6 @@ mlog_write_dulint( /*==============*/ byte* ptr, /* in: pointer where to write */ dulint val, /* in: value to write */ - byte type, /* in: MLOG_8BYTES */ mtr_t* mtr) /* in: mini-transaction handle */ { byte* log_ptr; @@ -274,7 +273,6 @@ mlog_write_dulint( } ut_ad(ptr && mtr); - ut_ad(type == MLOG_8BYTES); mach_write_to_8(ptr, val); @@ -286,7 +284,8 @@ mlog_write_dulint( return; } - log_ptr = mlog_write_initial_log_record_fast(ptr, type, log_ptr, mtr); + log_ptr = mlog_write_initial_log_record_fast(ptr, MLOG_8BYTES, + log_ptr, mtr); mach_write_to_2(log_ptr, ptr - buf_frame_align(ptr)); log_ptr += 2; diff --git a/innobase/mtr/mtr0mtr.c b/innobase/mtr/mtr0mtr.c index aa0acf73d2c..b2d8d022f8c 100644 --- a/innobase/mtr/mtr0mtr.c +++ b/innobase/mtr/mtr0mtr.c @@ -495,13 +495,11 @@ mtr_read_dulint( /*===========*/ /* out: value read */ byte* ptr, /* in: pointer from where to read */ - ulint type __attribute__((unused)), /* in: MLOG_8BYTES */ mtr_t* mtr __attribute__((unused))) /* in: mini-transaction handle */ { ut_ad(mtr->state == MTR_ACTIVE); ut_ad(ptr && mtr); - ut_ad(type == MLOG_8BYTES); ut_ad(mtr_memo_contains(mtr, buf_block_align(ptr), MTR_MEMO_PAGE_S_FIX) || mtr_memo_contains(mtr, buf_block_align(ptr), diff --git a/innobase/trx/trx0purge.c b/innobase/trx/trx0purge.c index c5984c5dea4..80b037b5c90 100644 --- a/innobase/trx/trx0purge.c +++ b/innobase/trx/trx0purge.c @@ -297,8 +297,7 @@ trx_purge_add_update_undo_to_history( undo_header + TRX_UNDO_HISTORY_NODE, mtr); /* Write the trx number to the undo log header */ - mlog_write_dulint(undo_header + TRX_UNDO_TRX_NO, trx->no, MLOG_8BYTES, - mtr); + mlog_write_dulint(undo_header + TRX_UNDO_TRX_NO, trx->no, mtr); /* Write information about delete markings to the undo log header */ if (!undo->del_marks) { diff --git a/innobase/trx/trx0rseg.c b/innobase/trx/trx0rseg.c index d50bc9d8ba4..e3885c86def 100644 --- a/innobase/trx/trx0rseg.c +++ b/innobase/trx/trx0rseg.c @@ -179,8 +179,7 @@ trx_rseg_mem_create( + node_addr.boffset; rseg->last_trx_no = mtr_read_dulint( - undo_log_hdr + TRX_UNDO_TRX_NO, - MLOG_8BYTES, mtr); + undo_log_hdr + TRX_UNDO_TRX_NO, mtr); rseg->last_del_marks = mtr_read_ulint( undo_log_hdr + TRX_UNDO_DEL_MARKS, MLOG_2BYTES, mtr); diff --git a/innobase/trx/trx0sys.c b/innobase/trx/trx0sys.c index f7b1f9bb085..d4c14a5509c 100644 --- a/innobase/trx/trx0sys.c +++ b/innobase/trx/trx0sys.c @@ -536,7 +536,7 @@ trx_sys_flush_max_trx_id(void) sys_header = trx_sysf_get(&mtr); mlog_write_dulint(sys_header + TRX_SYS_TRX_ID_STORE, - trx_sys->max_trx_id, MLOG_8BYTES, &mtr); + trx_sys->max_trx_id, &mtr); mtr_commit(&mtr); } @@ -784,7 +784,7 @@ trx_sysf_create( /* Start counting transaction ids from number 1 up */ mlog_write_dulint(sys_header + TRX_SYS_TRX_ID_STORE, - ut_dulint_create(0, 1), MLOG_8BYTES, mtr); + ut_dulint_create(0, 1), mtr); /* Reset the rollback segment slots */ for (i = 0; i < TRX_SYS_N_RSEGS; i++) { @@ -839,8 +839,7 @@ trx_sys_init_at_db_start(void) trx_sys->max_trx_id = ut_dulint_add( ut_dulint_align_up( mtr_read_dulint(sys_header - + TRX_SYS_TRX_ID_STORE, - MLOG_8BYTES, &mtr), + + TRX_SYS_TRX_ID_STORE, &mtr), TRX_SYS_TRX_ID_WRITE_MARGIN), 2 * TRX_SYS_TRX_ID_WRITE_MARGIN); diff --git a/innobase/trx/trx0undo.c b/innobase/trx/trx0undo.c index 7f7967477eb..eca1e5c0d0a 100644 --- a/innobase/trx/trx0undo.c +++ b/innobase/trx/trx0undo.c @@ -1145,8 +1145,7 @@ trx_undo_mem_create_at_db_start( undo_header = undo_page + offset; - trx_id = mtr_read_dulint(undo_header + TRX_UNDO_TRX_ID, MLOG_8BYTES, - mtr); + trx_id = mtr_read_dulint(undo_header + TRX_UNDO_TRX_ID, mtr); mutex_enter(&(rseg->mutex)); undo = trx_undo_mem_create(rseg, id, type, trx_id, page_no, offset); @@ -1156,8 +1155,7 @@ trx_undo_mem_create_at_db_start( undo->dict_operation = mtr_read_ulint( undo_header + TRX_UNDO_DICT_OPERATION, MLOG_2BYTES, mtr); - undo->table_id = mtr_read_dulint(undo_header + TRX_UNDO_TABLE_ID, - MLOG_8BYTES, mtr); + undo->table_id = mtr_read_dulint(undo_header + TRX_UNDO_TABLE_ID, mtr); undo->state = state; undo->size = flst_get_len(seg_header + TRX_UNDO_PAGE_LIST, mtr); @@ -1511,7 +1509,7 @@ trx_undo_mark_as_dict_operation( trx->dict_operation, MLOG_2BYTES, mtr); mlog_write_dulint(hdr_page + undo->hdr_offset + TRX_UNDO_TABLE_ID, - trx->table_id, MLOG_8BYTES, mtr); + trx->table_id, mtr); undo->dict_operation = trx->dict_operation; undo->table_id = trx->table_id; From 6e57e23b9c900a015ba738b343d3d0a5fd53a68e Mon Sep 17 00:00:00 2001 From: "marko@hundin.mysql.fi" <> Date: Fri, 12 Mar 2004 22:55:46 +0200 Subject: [PATCH 60/65] InnoDB: remove redundant functions mach_write() and mach_read() --- innobase/include/mach0data.h | 19 ------------------ innobase/include/mach0data.ic | 38 ----------------------------------- innobase/mem/mem0dbg.c | 12 +++++------ 3 files changed, 6 insertions(+), 63 deletions(-) diff --git a/innobase/include/mach0data.h b/innobase/include/mach0data.h index 006f55d5f1f..f28c9422670 100644 --- a/innobase/include/mach0data.h +++ b/innobase/include/mach0data.h @@ -88,25 +88,6 @@ mach_read_from_4( /*=============*/ /* out: ulint integer */ byte* b); /* in: pointer to four bytes */ -/*********************************************************** -The following function is used to store data from a ulint to memory -in standard order: -we store the most significant byte to the lowest address. */ -UNIV_INLINE -void -mach_write( -/*=======*/ - byte* b, /* in: pointer to sizeof(ulint) bytes where to store */ - ulint n); /* in: ulint integer to be stored */ -/************************************************************ -The following function is used to fetch data from memory to a ulint. -The most significant byte is at the lowest address. */ -UNIV_INLINE -ulint -mach_read( -/*======*/ - /* out: ulint integer */ - byte* b); /* in: pointer to sizeof(ulint) bytes */ /************************************************************* Writes a ulint in a compressed form. */ UNIV_INLINE diff --git a/innobase/include/mach0data.ic b/innobase/include/mach0data.ic index 1d6badd035b..65e5df2178e 100644 --- a/innobase/include/mach0data.ic +++ b/innobase/include/mach0data.ic @@ -167,44 +167,6 @@ mach_read_from_4( #endif } -/*********************************************************** -The following function is used to store data from a ulint to memory -in standard order: we store the most significant byte to the lowest -address. */ -UNIV_INLINE -void -mach_write( -/*=======*/ - byte* b, /* in: pointer to 4 bytes where to store */ - ulint n) /* in: ulint integer to be stored */ -{ - ut_ad(b); - - b[0] = (byte)(n >> 24); - b[1] = (byte)(n >> 16); - b[2] = (byte)(n >> 8); - b[3] = (byte)n; -} - -/************************************************************ -The following function is used to fetch data from memory to a ulint. -The most significant byte is at the lowest address. */ -UNIV_INLINE -ulint -mach_read( -/*======*/ - /* out: ulint integer */ - byte* b) /* in: pointer to 4 bytes */ -{ - ut_ad(b); - - return( ((ulint)(b[0]) << 24) - + ((ulint)(b[1]) << 16) - + ((ulint)(b[2]) << 8) - + (ulint)(b[3]) - ); -} - /************************************************************* Writes a ulint in a compressed form where the first byte codes the length of the stored ulint. We look at the most significant bits of diff --git a/innobase/mem/mem0dbg.c b/innobase/mem/mem0dbg.c index f66f7890fe2..d6a3d03dd07 100644 --- a/innobase/mem/mem0dbg.c +++ b/innobase/mem/mem0dbg.c @@ -73,37 +73,37 @@ mem_field_header_set_len(byte* field, ulint len) { ut_ad(len >= 0); - mach_write(field - 2 * sizeof(ulint), len); + mach_write_to_4(field - 2 * sizeof(ulint), len); } ulint mem_field_header_get_len(byte* field) { - return(mach_read(field - 2 * sizeof(ulint))); + return(mach_read_from_4(field - 2 * sizeof(ulint))); } void mem_field_header_set_check(byte* field, ulint check) { - mach_write(field - sizeof(ulint), check); + mach_write_to_4(field - sizeof(ulint), check); } ulint mem_field_header_get_check(byte* field) { - return(mach_read(field - sizeof(ulint))); + return(mach_read_from_4(field - sizeof(ulint))); } void mem_field_trailer_set_check(byte* field, ulint check) { - mach_write(field + mem_field_header_get_len(field), check); + mach_write_to_4(field + mem_field_header_get_len(field), check); } ulint mem_field_trailer_get_check(byte* field) { - return(mach_read(field + + return(mach_read_from_4(field + mem_field_header_get_len(field))); } From c421527dee1d3dea747fe208bd7eb82878df2ab3 Mon Sep 17 00:00:00 2001 From: "guilhem@mysql.com" <> Date: Fri, 12 Mar 2004 22:01:29 +0100 Subject: [PATCH 61/65] Force mysqlbinlog to require an argument if --local-load is used (--local-load alone means "I want files to be prepared for LOAD DATA INFILE, in the default temp directory", and mysqlbinlog already does this without --local-load). --- client/mysqlbinlog.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc index 72f68f9fe86..58adbdf9042 100644 --- a/client/mysqlbinlog.cc +++ b/client/mysqlbinlog.cc @@ -438,9 +438,9 @@ static struct my_option my_long_options[] = {"user", 'u', "Connect to the remote server as username.", (gptr*) &user, (gptr*) &user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"local-load", 'l', "Prepare files for local load in directory.", + {"local-load", 'l', "Prepare local temporary files for LOAD DATA INFILE in the specified directory.", (gptr*) &dirname_for_local_load, (gptr*) &dirname_for_local_load, 0, - GET_STR_ALLOC, OPT_ARG, 0, 0, 0, 0, 0, 0}, + GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"version", 'V', "Print version and exit.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} @@ -947,7 +947,7 @@ int main(int argc, char** argv) exit(1); if (dirname_for_local_load) load_processor.init_by_dir_name(dirname_for_local_load); - else + else /* my_malloc() failed in my_strdup() */ load_processor.init_by_cur_dir(); exit_value= 0; From 27243b2b0897ec4b7e4e2d6eb1d238995bb51e55 Mon Sep 17 00:00:00 2001 From: "marko@hundin.mysql.fi" <> Date: Fri, 12 Mar 2004 23:26:13 +0200 Subject: [PATCH 62/65] InnoDB: disable unreachable debug functions unless #ifdef UNIV_MEM_DEBUG --- innobase/include/mem0dbg.ic | 2 ++ innobase/mem/mem0dbg.c | 32 +++++++++++++++++++------------- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/innobase/include/mem0dbg.ic b/innobase/include/mem0dbg.ic index 765e23e747e..6efac719760 100644 --- a/innobase/include/mem0dbg.ic +++ b/innobase/include/mem0dbg.ic @@ -7,6 +7,7 @@ compilation module but is included in mem0mem.*. Created 6/8/1994 Heikki Tuuri *************************************************************************/ +#ifdef UNIV_MEM_DEBUG extern mutex_t mem_hash_mutex; extern ulint mem_current_allocated_memory; @@ -89,3 +90,4 @@ mem_field_trailer_set_check(byte* field, ulint check); ulint mem_field_trailer_get_check(byte* field); +#endif /* UNIV_MEM_DEBUG */ diff --git a/innobase/mem/mem0dbg.c b/innobase/mem/mem0dbg.c index d6a3d03dd07..07f348ab82f 100644 --- a/innobase/mem/mem0dbg.c +++ b/innobase/mem/mem0dbg.c @@ -7,6 +7,7 @@ but is included in mem0mem.* ! Created 6/9/1994 Heikki Tuuri *************************************************************************/ +#ifdef UNIV_MEM_DEBUG mutex_t mem_hash_mutex; /* The mutex which protects in the debug version the hash table containing the list of live memory heaps, and @@ -16,12 +17,11 @@ mutex_t mem_hash_mutex; /* The mutex which protects in the extent of memory allocations. Only used in the debug version. Protected by mem_hash_mutex above. */ -ulint mem_n_created_heaps = 0; -ulint mem_n_allocations = 0; -ulint mem_total_allocated_memory = 0; -ulint mem_current_allocated_memory = 0; -ulint mem_max_allocated_memory = 0; -ulint mem_last_print_info = 0; +static ulint mem_n_created_heaps = 0; +static ulint mem_n_allocations = 0; +static ulint mem_total_allocated_memory = 0; +static ulint mem_current_allocated_memory = 0; +static ulint mem_max_allocated_memory = 0; /* Size of the hash table for memory management tracking */ #define MEM_HASH_SIZE 997 @@ -43,12 +43,12 @@ struct mem_hash_node_struct { typedef UT_LIST_BASE_NODE_T(mem_hash_node_t) mem_hash_cell_t; /* The hash table of allocated heaps */ -mem_hash_cell_t mem_hash_table[MEM_HASH_SIZE]; +static mem_hash_cell_t mem_hash_table[MEM_HASH_SIZE]; /* The base node of the list of all allocated heaps */ -mem_hash_cell_t mem_all_list_base; +static mem_hash_cell_t mem_all_list_base; -ibool mem_hash_initialized = FALSE; +static ibool mem_hash_initialized = FALSE; UNIV_INLINE @@ -65,14 +65,13 @@ mem_hash_get_nth_cell(ulint i) return(&(mem_hash_table[i])); } +#endif /* UNIV_MEM_DEBUG */ /* Accessor functions for a memory field in the debug version */ void mem_field_header_set_len(byte* field, ulint len) { - ut_ad(len >= 0); - mach_write_to_4(field - 2 * sizeof(ulint), len); } @@ -164,6 +163,7 @@ mem_field_init( mem_field_header_set_check(usr_buf, rnd); mem_field_trailer_set_check(usr_buf, rnd); +#ifdef UNIV_MEM_DEBUG /* Update the memory allocation information */ mutex_enter(&mem_hash_mutex); @@ -182,6 +182,7 @@ mem_field_init( combination of 0xBA and 0xBE */ mem_init_buf(usr_buf, n); +#endif /* UNIV_MEM_DEBUG */ } /********************************************************************** @@ -191,12 +192,14 @@ void mem_field_erase( /*============*/ byte* buf, /* in: memory field */ - ulint n) /* in: how many bytes the user requested */ + ulint n __attribute__((unused))) + /* in: how many bytes the user requested */ { byte* usr_buf; usr_buf = buf + MEM_FIELD_HEADER_SIZE; - + +#ifdef UNIV_MEM_DEBUG mutex_enter(&mem_hash_mutex); mem_current_allocated_memory -= n; mutex_exit(&mem_hash_mutex); @@ -208,8 +211,10 @@ mem_field_erase( combination of 0xDE and 0xAD */ mem_erase_buf(buf, MEM_SPACE_NEEDED(n)); +#endif /* UNIV_MEM_DEBUG */ } +#ifdef UNIV_MEM_DEBUG /******************************************************************* Initializes a buffer to a random combination of hex BA and BE. Used to initialize allocated memory. */ @@ -370,6 +375,7 @@ mem_hash_remove( mutex_exit(&mem_hash_mutex); } +#endif /* UNIV_MEM_DEBUG */ /******************************************************************* Checks a memory heap for consistency and prints the contents if requested. From 639f411a8243584abaca582c3a0ef196f347209a Mon Sep 17 00:00:00 2001 From: "Sinisa@sinisa.nasamreza.org" <> Date: Sat, 13 Mar 2004 21:06:36 +0200 Subject: [PATCH 63/65] multi_update.result: Fix for a bug in the result multi_update.test: Fix for a bug in the test --- mysql-test/r/multi_update.result | 12 ++++++------ mysql-test/t/multi_update.test | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/mysql-test/r/multi_update.result b/mysql-test/r/multi_update.result index df24a1cfd58..dd020aaf18c 100644 --- a/mysql-test/r/multi_update.result +++ b/mysql-test/r/multi_update.result @@ -388,15 +388,15 @@ a DROP TABLE t1,t2; create table `t1` ( `p_id` int(10) unsigned NOT NULL auto_increment, `p_code` varchar(20) NOT NULL default '', `p_created` datetime NOT NULL default '0000-00-00 00:00:00', `p_active` tinyint(1) unsigned NOT NULL default '1', PRIMARY KEY (`p_id`) ); create table `t2` ( `c2_id` int(10) unsigned NULL auto_increment, `c2_p_id` int(10) unsigned NOT NULL default '0', `c2_note` text NOT NULL, `c2_created` datetime NOT NULL default '0000-00-00 00:00:00', `c2_active` tinyint(1) unsigned NOT NULL default '1', PRIMARY KEY (`c2_id`), KEY `c2_p_id` (`c2_p_id`) ); -insert into t1 values (0,'A01-Comp',now(),1); -insert into t1 values (0,'B01-Comp',now(),1); -insert into t2 values (0,1,'A Note',now(),1); +insert into t1 values (0,'A01-Comp',"2004-01-05 12:12:12",1); +insert into t1 values (0,'B01-Comp',"2004-01-05 12:12:13",1); +insert into t2 values (0,1,'A Note',"2004-01-05 12:12:14",1); update t1 left join t2 on p_id = c2_p_id set c2_note = 'asdf-1' where p_id = 2; select * from t1; p_id p_code p_created p_active -1 A01-Comp 2004-03-11 23:21:29 1 -2 B01-Comp 2004-03-11 23:21:29 1 +1 A01-Comp 2004-01-05 12:12:12 1 +2 B01-Comp 2004-01-05 12:12:13 1 select * from t2; c2_id c2_p_id c2_note c2_created c2_active -1 1 A Note 2004-03-11 23:21:29 1 +1 1 A Note 2004-01-05 12:12:14 1 drop table t1, t2; diff --git a/mysql-test/t/multi_update.test b/mysql-test/t/multi_update.test index 6ed340ad92b..e4651df400f 100644 --- a/mysql-test/t/multi_update.test +++ b/mysql-test/t/multi_update.test @@ -332,9 +332,9 @@ DROP TABLE t1,t2; create table `t1` ( `p_id` int(10) unsigned NOT NULL auto_increment, `p_code` varchar(20) NOT NULL default '', `p_created` datetime NOT NULL default '0000-00-00 00:00:00', `p_active` tinyint(1) unsigned NOT NULL default '1', PRIMARY KEY (`p_id`) ); create table `t2` ( `c2_id` int(10) unsigned NULL auto_increment, `c2_p_id` int(10) unsigned NOT NULL default '0', `c2_note` text NOT NULL, `c2_created` datetime NOT NULL default '0000-00-00 00:00:00', `c2_active` tinyint(1) unsigned NOT NULL default '1', PRIMARY KEY (`c2_id`), KEY `c2_p_id` (`c2_p_id`) ); -insert into t1 values (0,'A01-Comp',now(),1); -insert into t1 values (0,'B01-Comp',now(),1); -insert into t2 values (0,1,'A Note',now(),1); +insert into t1 values (0,'A01-Comp',"2004-01-05 12:12:12",1); +insert into t1 values (0,'B01-Comp',"2004-01-05 12:12:13",1); +insert into t2 values (0,1,'A Note',"2004-01-05 12:12:14",1); update t1 left join t2 on p_id = c2_p_id set c2_note = 'asdf-1' where p_id = 2; select * from t1; select * from t2; From 9ed26f721dc5c0fcf10166dbae0463f0a5489d1c Mon Sep 17 00:00:00 2001 From: "marko@hundin.mysql.fi" <> Date: Sat, 13 Mar 2004 22:48:00 +0200 Subject: [PATCH 64/65] InnoDB: Replace ut_a(0) with ut_error --- innobase/btr/btr0btr.c | 2 +- innobase/buf/buf0flu.c | 2 +- innobase/buf/buf0lru.c | 2 +- innobase/data/data0data.c | 2 +- innobase/dict/dict0crea.c | 2 +- innobase/dict/dict0dict.c | 8 ++++---- innobase/dict/dict0load.c | 2 +- innobase/fil/fil0fil.c | 6 +++--- innobase/fsp/fsp0fsp.c | 10 +++++----- innobase/ibuf/ibuf0ibuf.c | 2 +- innobase/include/buf0buf.ic | 6 +++--- innobase/include/data0type.ic | 2 +- innobase/include/mtr0log.ic | 2 +- innobase/include/trx0rseg.ic | 4 ++-- innobase/lock/lock0lock.c | 4 ++-- innobase/log/log0log.c | 2 +- innobase/log/log0recv.c | 2 +- innobase/mem/mem0pool.c | 12 ++++++------ innobase/mtr/mtr0log.c | 8 ++++---- innobase/os/os0file.c | 16 ++++++++-------- innobase/page/page0cur.c | 2 +- innobase/page/page0page.c | 4 ++-- innobase/pars/lexyy.c | 2 +- innobase/que/que0que.c | 8 ++++---- innobase/rem/rem0cmp.c | 2 +- innobase/rem/rem0rec.c | 4 ++-- innobase/row/row0ins.c | 2 +- innobase/row/row0mysql.c | 16 ++++++++-------- innobase/row/row0purge.c | 4 ++-- innobase/row/row0row.c | 4 ++-- innobase/row/row0sel.c | 6 +++--- innobase/row/row0undo.c | 2 +- innobase/srv/srv0srv.c | 2 +- innobase/sync/sync0arr.c | 2 +- innobase/trx/trx0purge.c | 4 ++-- innobase/trx/trx0trx.c | 8 ++++---- innobase/trx/trx0undo.c | 12 ++++++------ 37 files changed, 90 insertions(+), 90 deletions(-) diff --git a/innobase/btr/btr0btr.c b/innobase/btr/btr0btr.c index 6c9bccb81e8..71be6d81d7c 100644 --- a/innobase/btr/btr0btr.c +++ b/innobase/btr/btr0btr.c @@ -402,7 +402,7 @@ btr_get_size( n += fseg_n_reserved_pages(seg_header, &dummy, &mtr); } else { - ut_a(0); + ut_error; } mtr_commit(&mtr); diff --git a/innobase/buf/buf0flu.c b/innobase/buf/buf0flu.c index 9ed99096451..66c9bb605dc 100644 --- a/innobase/buf/buf0flu.c +++ b/innobase/buf/buf0flu.c @@ -253,7 +253,7 @@ buf_flush_buffered_writes(void) "InnoDB: files.\n", block->offset, block->space); - ut_a(0); + ut_error; } } diff --git a/innobase/buf/buf0lru.c b/innobase/buf/buf0lru.c index c0b0cfbb6ea..0128ee87871 100644 --- a/innobase/buf/buf0lru.c +++ b/innobase/buf/buf0lru.c @@ -235,7 +235,7 @@ loop: "InnoDB: on Linux!\n", (ulong)(buf_pool->curr_size / (1024 * 1024 / UNIV_PAGE_SIZE))); - ut_a(0); + ut_error; } else if (!recv_recovery_on && UT_LIST_GET_LEN(buf_pool->free) + UT_LIST_GET_LEN(buf_pool->LRU) < buf_pool->max_size / 5) { diff --git a/innobase/data/data0data.c b/innobase/data/data0data.c index 629570ce751..c3c2b135717 100644 --- a/innobase/data/data0data.c +++ b/innobase/data/data0data.c @@ -261,7 +261,7 @@ dfield_check_typed( "InnoDB: Error: data field type %lu, len %lu\n", dfield_get_type(field)->mtype, dfield_get_len(field)); - ut_a(0); + ut_error; } return(TRUE); diff --git a/innobase/dict/dict0crea.c b/innobase/dict/dict0crea.c index 36fa0fc640e..48fcb9c1e79 100644 --- a/innobase/dict/dict0crea.c +++ b/innobase/dict/dict0crea.c @@ -158,7 +158,7 @@ dict_create_sys_tables_tuple( if (table->type == DICT_TABLE_CLUSTER_MEMBER) { dfield_set_data(dfield, table->cluster_name, ut_strlen(table->cluster_name)); - ut_a(0); /* Oracle-style clusters are not supported yet */ + ut_error; /* Oracle-style clusters are not supported yet */ } else { dfield_set_data(dfield, NULL, UNIV_SQL_NULL); } diff --git a/innobase/dict/dict0dict.c b/innobase/dict/dict0dict.c index a9e0a5c4600..dc19997de72 100644 --- a/innobase/dict/dict0dict.c +++ b/innobase/dict/dict0dict.c @@ -208,7 +208,7 @@ dict_tables_have_same_db( } } - ut_a(0); + ut_error; return(FALSE); } @@ -231,7 +231,7 @@ dict_remove_db_name( } } - ut_a(0); + ut_error; return(NULL); } @@ -254,7 +254,7 @@ dict_get_db_name_len( } } - ut_a(0); + ut_error; return(0); } @@ -1172,7 +1172,7 @@ dict_table_LRU_trim(void) dict_table_t* table; dict_table_t* prev_table; - ut_a(0); + ut_error; #ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(dict_sys->mutex))); diff --git a/innobase/dict/dict0load.c b/innobase/dict/dict0load.c index d4b6a5ff9cb..5a5830a2517 100644 --- a/innobase/dict/dict0load.c +++ b/innobase/dict/dict0load.c @@ -673,7 +673,7 @@ dict_load_table( table->type = mach_read_from_4(field); if (table->type == DICT_TABLE_CLUSTER_MEMBER) { - ut_a(0); + ut_error; field = rec_get_nth_field(rec, 6, &len); table->mix_id = mach_read_from_8(field); diff --git a/innobase/fil/fil0fil.c b/innobase/fil/fil0fil.c index 45b3d53d270..9f33013d2f9 100644 --- a/innobase/fil/fil0fil.c +++ b/innobase/fil/fil0fil.c @@ -902,7 +902,7 @@ fil_node_prepare_for_io( "InnoDB: Pending i/o's on %lu files exist\n", system->n_open_pending); - ut_a(0); + ut_error; } fil_node_close(last_node, system); @@ -1209,7 +1209,7 @@ loop: "InnoDB: Byte offset %lu, len %lu, i/o type %lu\n", block_offset, space_id, byte_offset, len, type); - ut_a(0); + ut_error; } if (node->size > block_offset) { @@ -1339,7 +1339,7 @@ fil_aio_wait( ret = os_aio_posix_handle(segment, &fil_node, &message); #else ret = 0; /* Eliminate compiler warning */ - ut_a(0); + ut_error; #endif } else { srv_io_thread_op_info[segment] =(char *)"simulated aio handle"; diff --git a/innobase/fsp/fsp0fsp.c b/innobase/fsp/fsp0fsp.c index de6e2a2a4c0..49885df07d7 100644 --- a/innobase/fsp/fsp0fsp.c +++ b/innobase/fsp/fsp0fsp.c @@ -1275,7 +1275,7 @@ fsp_alloc_free_page( ut_print_buf(((byte*)descr) - 500, 1000); - ut_a(0); + ut_error; } xdes_set_bit(descr, XDES_FREE_BIT, free, FALSE, mtr); @@ -1359,7 +1359,7 @@ fsp_free_page( return; } - ut_a(0); + ut_error; } if (xdes_get_bit(descr, XDES_FREE_BIT, page % FSP_EXTENT_SIZE, mtr) @@ -1429,7 +1429,7 @@ fsp_free_extent( ut_print_buf(((byte*)descr) - 500, 1000); - ut_a(0); + ut_error; } xdes_init(descr, mtr); @@ -2708,7 +2708,7 @@ fseg_free_page_low( fprintf(stderr, "InnoDB: If the InnoDB recovery crashes here, see section 6.1\n" "InnoDB: of http://www.innodb.com/ibman.html about forcing recovery.\n"); - ut_a(0); + ut_error; } state = xdes_get_state(descr, mtr); @@ -2798,7 +2798,7 @@ fseg_free_page_low( fprintf(stderr, "InnoDB: If the InnoDB recovery crashes here, see section 6.1\n" "InnoDB: of http://www.innodb.com/ibman.html about forcing recovery.\n"); - ut_a(0); + ut_error; } not_full_n_used = mtr_read_ulint(seg_inode + FSEG_NOT_FULL_N_USED, diff --git a/innobase/ibuf/ibuf0ibuf.c b/innobase/ibuf/ibuf0ibuf.c index d851e7c4d01..f2c631d88cd 100644 --- a/innobase/ibuf/ibuf0ibuf.c +++ b/innobase/ibuf/ibuf0ibuf.c @@ -2651,7 +2651,7 @@ loop: fprintf(stderr, "InnoDB: Fatal error: you are downgrading from >= 4.1.1 to 4.0, but\n" "InnoDB: the insert buffer was not empty.\n"); - ut_a(0); + ut_error; } if (corruption_noticed) { diff --git a/innobase/include/buf0buf.ic b/innobase/include/buf0buf.ic index 0957dcf4402..5a4c56b0c30 100644 --- a/innobase/include/buf0buf.ic +++ b/innobase/include/buf0buf.ic @@ -220,7 +220,7 @@ buf_block_align( "InnoDB: Error: trying to access a stray pointer %lx\n" "InnoDB: buf pool start is at %lx, number of pages %lu\n", (ulint)ptr, (ulint)frame_zero, buf_pool->max_size); - ut_a(0); + ut_error; } return(block); @@ -254,7 +254,7 @@ buf_block_align_low( "InnoDB: Error: trying to access a stray pointer %lx\n" "InnoDB: buf pool start is at %lx, number of pages %lu\n", (ulint)ptr, (ulint)frame_zero, buf_pool->max_size); - ut_a(0); + ut_error; } return(block); @@ -283,7 +283,7 @@ buf_frame_align( "InnoDB: Error: trying to access a stray pointer %lx\n" "InnoDB: buf pool start is at %lx, number of pages %lu\n", (ulint)ptr, (ulint)(buf_pool->frame_zero), buf_pool->max_size); - ut_a(0); + ut_error; } return(frame); diff --git a/innobase/include/data0type.ic b/innobase/include/data0type.ic index ddd0b0ae8cc..dbc5b6615f6 100644 --- a/innobase/include/data0type.ic +++ b/innobase/include/data0type.ic @@ -216,7 +216,7 @@ dtype_get_fixed_size( case DATA_VARMYSQL: case DATA_BLOB: return(0); - default: ut_a(0); + default: ut_error; } return(0); diff --git a/innobase/include/mtr0log.ic b/innobase/include/mtr0log.ic index 0598f1a9536..54f15779078 100644 --- a/innobase/include/mtr0log.ic +++ b/innobase/include/mtr0log.ic @@ -167,7 +167,7 @@ mlog_write_initial_log_record_fast( fprintf(stderr, "InnoDB: error: buffer page pointer %lx has nonsensical space id %lu\n" "InnoDB: or page no %lu\n", (ulint)ptr, space, offset); - ut_a(0); + ut_error; } mach_write_to_1(log_ptr, type); diff --git a/innobase/include/trx0rseg.ic b/innobase/include/trx0rseg.ic index 840d61a6840..9a6137eb2e5 100644 --- a/innobase/include/trx0rseg.ic +++ b/innobase/include/trx0rseg.ic @@ -68,7 +68,7 @@ trx_rsegf_get_nth_undo( if (n >= TRX_RSEG_N_SLOTS) { fprintf(stderr, "InnoDB: Error: trying to get slot %lu of rseg\n", n); - ut_a(0); + ut_error; } return(mtr_read_ulint(rsegf + TRX_RSEG_UNDO_SLOTS + @@ -89,7 +89,7 @@ trx_rsegf_set_nth_undo( if (n >= TRX_RSEG_N_SLOTS) { fprintf(stderr, "InnoDB: Error: trying to set slot %lu of rseg\n", n); - ut_a(0); + ut_error; } mlog_write_ulint(rsegf + TRX_RSEG_UNDO_SLOTS + n * TRX_RSEG_SLOT_SIZE, diff --git a/innobase/lock/lock0lock.c b/innobase/lock/lock0lock.c index fab6dda98cb..c706ebceaec 100644 --- a/innobase/lock/lock0lock.c +++ b/innobase/lock/lock0lock.c @@ -1611,7 +1611,7 @@ lock_rec_enqueue_waiting( if (que_thr_stop(thr)) { - ut_a(0); + ut_error; return(DB_QUE_THR_SUSPENDED); } @@ -3272,7 +3272,7 @@ lock_table_enqueue_waiting( stopped anyway */ if (que_thr_stop(thr)) { - ut_a(0); + ut_error; return(DB_QUE_THR_SUSPENDED); } diff --git a/innobase/log/log0log.c b/innobase/log/log0log.c index 256de701c0f..ec0db57564a 100644 --- a/innobase/log/log0log.c +++ b/innobase/log/log0log.c @@ -1026,7 +1026,7 @@ log_io_complete( return; } - ut_a(0); /* We currently use synchronous writing of the + ut_error; /* We currently use synchronous writing of the logs and cannot end up here! */ if (srv_unix_file_flush_method != SRV_UNIX_O_DSYNC diff --git a/innobase/log/log0recv.c b/innobase/log/log0recv.c index 1129146f768..323d6c63f71 100644 --- a/innobase/log/log0recv.c +++ b/innobase/log/log0recv.c @@ -160,7 +160,7 @@ recv_sys_empty_hash(void) "InnoDB: Error: %lu pages with log records were left unprocessed!\n" "InnoDB: Maximum page number with log records on it %lu\n", recv_sys->n_addrs, recv_max_parsed_page_no); - ut_a(0); + ut_error; } hash_table_free(recv_sys->addr_hash); diff --git a/innobase/mem/mem0pool.c b/innobase/mem/mem0pool.c index 6e02b2b20f1..9a5d16cd4a2 100644 --- a/innobase/mem/mem0pool.c +++ b/innobase/mem/mem0pool.c @@ -297,7 +297,7 @@ mem_pool_fill_free_list( if (UT_LIST_GET_LEN(pool->free_list[i + 1]) == 0) { mem_analyze_corruption((byte*)area); - ut_a(0); + ut_error; } UT_LIST_REMOVE(free_list, pool->free_list[i + 1], area); @@ -375,7 +375,7 @@ mem_area_alloc( "InnoDB: Probably a race condition because now the area is marked free!\n"); } - ut_a(0); + ut_error; } if (UT_LIST_GET_LEN(pool->free_list[n]) == 0) { @@ -385,7 +385,7 @@ mem_area_alloc( n); mem_analyze_corruption((byte*)area); - ut_a(0); + ut_error; } ut_ad(mem_area_get_size(area) == ut_2_exp(n)); @@ -481,7 +481,7 @@ mem_area_free( "InnoDB: element is marked free!\n"); mem_analyze_corruption((byte*)area); - ut_a(0); + ut_error; } size = mem_area_get_size(area); @@ -492,7 +492,7 @@ mem_area_free( "InnoDB: previous allocated area!\n"); mem_analyze_corruption((byte*)area); - ut_a(0); + ut_error; } #ifdef UNIV_LIGHT_MEM_DEBUG @@ -509,7 +509,7 @@ mem_area_free( size, next_size); mem_analyze_corruption((byte*)area); - ut_a(0); + ut_error; } } #endif diff --git a/innobase/mtr/mtr0log.c b/innobase/mtr/mtr0log.c index 49e3ac7ae0f..91ff588713d 100644 --- a/innobase/mtr/mtr0log.c +++ b/innobase/mtr/mtr0log.c @@ -59,7 +59,7 @@ mlog_write_initial_log_record( fprintf(stderr, "InnoDB: Error: trying to write to a stray memory location %lx\n", (ulint)ptr); - ut_a(0); + ut_error; } log_ptr = mlog_open(mtr, 20); @@ -222,7 +222,7 @@ mlog_write_ulint( fprintf(stderr, "InnoDB: Error: trying to write to a stray memory location %lx\n", (ulint)ptr); - ut_a(0); + ut_error; } if (type == MLOG_1BYTE) { @@ -269,7 +269,7 @@ mlog_write_dulint( fprintf(stderr, "InnoDB: Error: trying to write to a stray memory location %lx\n", (ulint)ptr); - ut_a(0); + ut_error; } ut_ad(ptr && mtr); @@ -313,7 +313,7 @@ mlog_write_string( fprintf(stderr, "InnoDB: Error: trying to write to a stray memory location %lx\n", (ulint)ptr); - ut_a(0); + ut_error; } ut_ad(ptr && mtr); ut_a(len < UNIV_PAGE_SIZE); diff --git a/innobase/os/os0file.c b/innobase/os/os0file.c index 55d0ade1bf7..abcb2259e84 100644 --- a/innobase/os/os0file.c +++ b/innobase/os/os0file.c @@ -722,7 +722,7 @@ try_again: } else if (type == OS_DATA_FILE) { type_str = "DATA"; } else { - ut_a(0); + ut_error; } if (purpose == OS_FILE_AIO) { @@ -730,7 +730,7 @@ try_again: } else if (purpose == OS_FILE_NORMAL) { purpose_str = "NORMAL"; } else { - ut_a(0); + ut_error; } /* printf("Opening file %s, mode %s, type %s, purpose %s\n", @@ -1016,7 +1016,7 @@ os_file_flush( /* It is a fatal error if a file flush does not succeed, because then the database can get corrupt on disk */ - ut_a(0); + ut_error; return(FALSE); #else @@ -1050,7 +1050,7 @@ os_file_flush( /* It is a fatal error if a file flush does not succeed, because then the database can get corrupt on disk */ - ut_a(0); + ut_error; return(FALSE); #endif @@ -1801,7 +1801,7 @@ os_aio_get_array_no( return(3); } else { - ut_a(0); + ut_error; return(0); } @@ -1828,7 +1828,7 @@ os_aio_get_array_from_no( return(os_aio_write_array); } else { - ut_a(0); + ut_error; return(NULL); } @@ -2418,7 +2418,7 @@ os_aio_posix_handle( if (sig != SIGRTMIN + 1 + array_no) { - ut_a(0); + ut_error; return(FALSE); } @@ -2682,7 +2682,7 @@ consecutive_loop: "InnoDB: Error: trying a displaced write to %s %lu %lu, len %lu\n", slot->name, slot->offset_high, slot->offset, total_len); - ut_a(0); + ut_error; } /* Do a 'last millisecond' check that the page end diff --git a/innobase/page/page0cur.c b/innobase/page/page0cur.c index 7e2fc19c00f..b08efacf43a 100644 --- a/innobase/page/page0cur.c +++ b/innobase/page/page0cur.c @@ -713,7 +713,7 @@ page_cur_parse_insert_rec( buf_page_print(page); - ut_a(0); + ut_error; } ut_memcpy(buf, rec_get_start(cursor_rec), mismatch_index); diff --git a/innobase/page/page0page.c b/innobase/page/page0page.c index 71031263fbf..21adcdea635 100644 --- a/innobase/page/page0page.c +++ b/innobase/page/page0page.c @@ -110,7 +110,7 @@ page_dir_find_owner_slot( buf_page_print(page); - ut_a(0); + ut_error; } i--; @@ -441,7 +441,7 @@ page_copy_rec_list_end_no_locks( (ulint)(rec - page), (ulint)(page_cur_get_rec(&cur1) - page), (ulint)(page_cur_get_rec(&cur2) - new_page)); - ut_a(0); + ut_error; } page_cur_move_to_next(&cur1); diff --git a/innobase/pars/lexyy.c b/innobase/pars/lexyy.c index 71507ccd868..ab723cb635c 100644 --- a/innobase/pars/lexyy.c +++ b/innobase/pars/lexyy.c @@ -627,7 +627,7 @@ Linux. #define malloc(A) mem_alloc(A) #define free(A) mem_free(A) #define realloc(P, A) mem_realloc(P, A, __FILE__, __LINE__) -#define exit(A) ut_a(0) +#define exit(A) ut_error #define YY_INPUT(buf, result, max_size) pars_get_lex_chars(buf, &result, max_size) #define comment 1 diff --git a/innobase/que/que0que.c b/innobase/que/que0que.c index 73af1dc70e2..279f9fc21aa 100644 --- a/innobase/que/que0que.c +++ b/innobase/que/que0que.c @@ -485,7 +485,7 @@ que_graph_free_recursive( "que_thr struct appears corrupt; magic n %lu\n", thr->magic_n); mem_analyze_corruption((byte*)thr); - ut_a(0); + ut_error; } thr->magic_n = QUE_THR_MAGIC_FREED; @@ -597,7 +597,7 @@ que_graph_free_recursive( "que_node struct appears corrupt; type %lu\n", que_node_get_type(node)); mem_analyze_corruption((byte*)node); - ut_a(0); + ut_error; } } @@ -987,7 +987,7 @@ que_thr_move_to_run_state_for_mysql( mem_analyze_corruption((byte*)thr); - ut_a(0); + ut_error; } if (!thr->is_active) { @@ -1023,7 +1023,7 @@ que_thr_stop_for_mysql_no_error( mem_analyze_corruption((byte*)thr); - ut_a(0); + ut_error; } thr->state = QUE_THR_COMPLETED; diff --git a/innobase/rem/rem0cmp.c b/innobase/rem/rem0cmp.c index 71a7b1368cb..dea2621faf3 100644 --- a/innobase/rem/rem0cmp.c +++ b/innobase/rem/rem0cmp.c @@ -273,7 +273,7 @@ cmp_whole_field( default: fprintf(stderr, "InnoDB: unknown type number %lu\n", data_type); - ut_a(0); + ut_error; } return(0); diff --git a/innobase/rem/rem0rec.c b/innobase/rem/rem0rec.c index a151389798d..fddc8eab761 100644 --- a/innobase/rem/rem0rec.c +++ b/innobase/rem/rem0rec.c @@ -108,12 +108,12 @@ rec_get_nth_field( if (n > 1024) { fprintf(stderr, "Error: trying to access field %lu in rec\n", n); - ut_a(0); + ut_error; } if (rec == NULL) { fprintf(stderr, "Error: rec is NULL pointer\n"); - ut_a(0); + ut_error; } if (rec_get_1byte_offs_flag(rec)) { diff --git a/innobase/row/row0ins.c b/innobase/row/row0ins.c index 3acddba8235..84968ea4e20 100644 --- a/innobase/row/row0ins.c +++ b/innobase/row/row0ins.c @@ -856,7 +856,7 @@ row_ins_foreign_check_on_constraint( "InnoDB: Make a detailed bug report and send it\n"); fprintf(stderr, "InnoDB: to mysql@lists.mysql.com\n"); - ut_a(0); + ut_error; */ err = DB_SUCCESS; diff --git a/innobase/row/row0mysql.c b/innobase/row/row0mysql.c index 6fd9f6f0769..ab73dc2ad6d 100644 --- a/innobase/row/row0mysql.c +++ b/innobase/row/row0mysql.c @@ -270,7 +270,7 @@ handle_new_error: } else { fprintf(stderr, "InnoDB: unknown error code %lu\n", err); - ut_a(0); + ut_error; } if (trx->error_state != DB_SUCCESS) { @@ -383,7 +383,7 @@ row_prebuilt_free( mem_analyze_corruption((byte*)prebuilt); - ut_a(0); + ut_error; } prebuilt->magic_n = ROW_PREBUILT_FREED; @@ -431,7 +431,7 @@ row_prebuilt_free( mem_analyze_corruption( prebuilt->fetch_cache[i]); - ut_a(0); + ut_error; } mem_free((prebuilt->fetch_cache[i]) - 4); @@ -463,7 +463,7 @@ row_update_prebuilt_trx( mem_analyze_corruption((byte*)trx); - ut_a(0); + ut_error; } if (prebuilt->magic_n != ROW_PREBUILT_ALLOCATED) { @@ -474,7 +474,7 @@ row_update_prebuilt_trx( mem_analyze_corruption((byte*)prebuilt); - ut_a(0); + ut_error; } prebuilt->trx = trx; @@ -701,7 +701,7 @@ row_insert_for_mysql( mem_analyze_corruption((byte*)prebuilt); - ut_a(0); + ut_error; } if (srv_created_new_raw || srv_force_recovery) { @@ -917,7 +917,7 @@ row_update_for_mysql( mem_analyze_corruption((byte*)prebuilt); - ut_a(0); + ut_error; } if (srv_created_new_raw || srv_force_recovery) { @@ -2091,7 +2091,7 @@ row_drop_table_for_mysql( row_mysql_handle_errors(&err, trx, thr, NULL); - ut_a(0); + ut_error; } else { dict_table_remove_from_cache(table); diff --git a/innobase/row/row0purge.c b/innobase/row/row0purge.c index 42c4ee60b8a..bd3742ad589 100644 --- a/innobase/row/row0purge.c +++ b/innobase/row/row0purge.c @@ -140,7 +140,7 @@ row_purge_remove_clust_if_poss_low( } else if (err == DB_OUT_OF_FILE_SPACE) { success = FALSE; } else { - ut_a(0); + ut_error; } } @@ -266,7 +266,7 @@ row_purge_remove_sec_if_poss_low( } else if (err == DB_OUT_OF_FILE_SPACE) { success = FALSE; } else { - ut_a(0); + ut_error; } } } diff --git a/innobase/row/row0row.c b/innobase/row/row0row.c index b5d676a936a..6820cb5bccd 100644 --- a/innobase/row/row0row.c +++ b/innobase/row/row0row.c @@ -406,7 +406,7 @@ row_build_row_ref_in_tuple( if (!table) { fprintf(stderr, "InnoDB: table %s for index %s not found\n", index->table_name, index->name); - ut_a(0); + ut_error; } clust_index = dict_table_get_first_index(table); @@ -415,7 +415,7 @@ row_build_row_ref_in_tuple( fprintf(stderr, "InnoDB: clust index for table %s for index %s not found\n", index->table_name, index->name); - ut_a(0); + ut_error; } ref_len = dict_index_get_n_unique(clust_index); diff --git a/innobase/row/row0sel.c b/innobase/row/row0sel.c index 9dd308e62a1..6ae4f791205 100644 --- a/innobase/row/row0sel.c +++ b/innobase/row/row0sel.c @@ -2072,7 +2072,7 @@ row_sel_store_row_id_to_prebuilt( len, index->table_name, index->name, dict_index_get_sys_col_pos(index, DATA_ROW_ID), err_buf); - ut_a(0); + ut_error; } ut_memcpy(prebuilt->row_id, data, len); @@ -2716,7 +2716,7 @@ row_search_for_mysql( mem_analyze_corruption((byte*)prebuilt); - ut_a(0); + ut_error; } /* printf("Match mode %lu\n search tuple ", match_mode); @@ -2765,7 +2765,7 @@ row_search_for_mysql( if (direction != prebuilt->fetch_direction) { if (prebuilt->n_fetch_cached > 0) { - ut_a(0); + ut_error; /* TODO: scrollable cursor: restore cursor to the place of the latest returned row, or better: prevent caching for a scroll diff --git a/innobase/row/row0undo.c b/innobase/row/row0undo.c index 01b0b1ab41e..78cfe70c260 100644 --- a/innobase/row/row0undo.c +++ b/innobase/row/row0undo.c @@ -333,7 +333,7 @@ row_undo_step( exit(1); } - ut_a(0); + ut_error; return(NULL); } diff --git a/innobase/srv/srv0srv.c b/innobase/srv/srv0srv.c index 0658da71837..0be0ab957af 100644 --- a/innobase/srv/srv0srv.c +++ b/innobase/srv/srv0srv.c @@ -1184,7 +1184,7 @@ srv_table_reserve_slot_for_mysql(void) (ulint)difftime(ut_time(), slot->suspend_time)); } - ut_a(0); + ut_error; } slot = srv_mysql_table + i; diff --git a/innobase/sync/sync0arr.c b/innobase/sync/sync0arr.c index dbfac6ac086..67671299e3d 100644 --- a/innobase/sync/sync0arr.c +++ b/innobase/sync/sync0arr.c @@ -940,7 +940,7 @@ sync_array_print_long_waits(void) "InnoDB: We intentionally crash the server, because it appears to be hung.\n" ); - ut_a(0); + ut_error; } } diff --git a/innobase/trx/trx0purge.c b/innobase/trx/trx0purge.c index 80b037b5c90..6a509b163b3 100644 --- a/innobase/trx/trx0purge.c +++ b/innobase/trx/trx0purge.c @@ -278,7 +278,7 @@ trx_purge_add_update_undo_to_history( if (undo->id >= TRX_RSEG_N_SLOTS) { fprintf(stderr, "InnoDB: Error: undo->id is %lu\n", undo->id); - ut_a(0); + ut_error; } trx_rsegf_set_nth_undo(rseg_header, undo->id, FIL_NULL, mtr); @@ -1016,7 +1016,7 @@ trx_purge(void) /* Should not happen */ - ut_a(0); + ut_error; return(0); } diff --git a/innobase/trx/trx0trx.c b/innobase/trx/trx0trx.c index 793a3421742..9b6e6904537 100644 --- a/innobase/trx/trx0trx.c +++ b/innobase/trx/trx0trx.c @@ -816,7 +816,7 @@ trx_commit_off_kernel( log_write_up_to(lsn, LOG_WAIT_ONE_GROUP, FALSE); } else { - ut_a(0); + ut_error; } trx->commit_lsn = lsn; @@ -1141,7 +1141,7 @@ trx_sig_send( /* The signal is not compatible with the other signals in the queue: do nothing */ - ut_a(0); + ut_error; return(FALSE); } @@ -1189,7 +1189,7 @@ trx_sig_send( signal to the end of the queue, if the session is not yet in the error state: */ - ut_a(0); + ut_error; } /* If there were no other signals ahead in the queue, try to start @@ -1534,7 +1534,7 @@ trx_commit_complete_for_mysql( log_write_up_to(lsn, LOG_WAIT_ONE_GROUP, FALSE); } else { - ut_a(0); + ut_error; } trx->op_info = (char*)""; diff --git a/innobase/trx/trx0undo.c b/innobase/trx/trx0undo.c index eca1e5c0d0a..de3da382e83 100644 --- a/innobase/trx/trx0undo.c +++ b/innobase/trx/trx0undo.c @@ -1128,7 +1128,7 @@ trx_undo_mem_create_at_db_start( if (id >= TRX_RSEG_N_SLOTS) { fprintf(stderr, "InnoDB: Error: undo->id is %lu\n", id); - ut_a(0); + ut_error; } undo_page = trx_undo_page_get(rseg->space, page_no, mtr); @@ -1286,7 +1286,7 @@ trx_undo_mem_create( if (id >= TRX_RSEG_N_SLOTS) { fprintf(stderr, "InnoDB: Error: undo->id is %lu\n", id); - ut_a(0); + ut_error; } undo = mem_alloc(sizeof(trx_undo_t)); @@ -1333,7 +1333,7 @@ trx_undo_mem_init_for_reuse( fprintf(stderr, "InnoDB: Error: undo->id is %lu\n", undo->id); mem_analyze_corruption((byte*)undo); - ut_a(0); + ut_error; } undo->state = TRX_UNDO_ACTIVE; @@ -1357,7 +1357,7 @@ trx_undo_mem_free( if (undo->id >= TRX_RSEG_N_SLOTS) { fprintf(stderr, "InnoDB: Error: undo->id is %lu\n", undo->id); - ut_a(0); + ut_error; } mem_free(undo); @@ -1468,7 +1468,7 @@ trx_undo_reuse_cached( if (undo->id >= TRX_RSEG_N_SLOTS) { fprintf(stderr, "InnoDB: Error: undo->id is %lu\n", undo->id); mem_analyze_corruption((byte*)undo); - ut_a(0); + ut_error; } undo_page = trx_undo_page_get(undo->space, undo->hdr_page_no, mtr); @@ -1604,7 +1604,7 @@ trx_undo_set_state_at_finish( if (undo->id >= TRX_RSEG_N_SLOTS) { fprintf(stderr, "InnoDB: Error: undo->id is %lu\n", undo->id); mem_analyze_corruption((byte*)undo); - ut_a(0); + ut_error; } undo_page = trx_undo_page_get(undo->space, undo->hdr_page_no, mtr); From 325f6615254c871d71d9d71bb5910a61d9a61ea2 Mon Sep 17 00:00:00 2001 From: "monty@mysql.com" <> Date: Tue, 16 Mar 2004 02:59:39 +0200 Subject: [PATCH 65/65] Remove not needed patch --- mysql-test/r/multi_update.result | 20 ++++++++++---------- mysql-test/t/multi_update.test | 10 +++++----- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/mysql-test/r/multi_update.result b/mysql-test/r/multi_update.result index dd020aaf18c..12cb965f045 100644 --- a/mysql-test/r/multi_update.result +++ b/mysql-test/r/multi_update.result @@ -386,17 +386,17 @@ SELECT * from t2; a 1 DROP TABLE t1,t2; -create table `t1` ( `p_id` int(10) unsigned NOT NULL auto_increment, `p_code` varchar(20) NOT NULL default '', `p_created` datetime NOT NULL default '0000-00-00 00:00:00', `p_active` tinyint(1) unsigned NOT NULL default '1', PRIMARY KEY (`p_id`) ); -create table `t2` ( `c2_id` int(10) unsigned NULL auto_increment, `c2_p_id` int(10) unsigned NOT NULL default '0', `c2_note` text NOT NULL, `c2_created` datetime NOT NULL default '0000-00-00 00:00:00', `c2_active` tinyint(1) unsigned NOT NULL default '1', PRIMARY KEY (`c2_id`), KEY `c2_p_id` (`c2_p_id`) ); -insert into t1 values (0,'A01-Comp',"2004-01-05 12:12:12",1); -insert into t1 values (0,'B01-Comp',"2004-01-05 12:12:13",1); -insert into t2 values (0,1,'A Note',"2004-01-05 12:12:14",1); +create table `t1` (`p_id` int(10) unsigned NOT NULL auto_increment, `p_code` varchar(20) NOT NULL default '', `p_active` tinyint(1) unsigned NOT NULL default '1', PRIMARY KEY (`p_id`) ); +create table `t2` (`c2_id` int(10) unsigned NULL auto_increment, `c2_p_id` int(10) unsigned NOT NULL default '0', `c2_note` text NOT NULL, `c2_active` tinyint(1) unsigned NOT NULL default '1', PRIMARY KEY (`c2_id`), KEY `c2_p_id` (`c2_p_id`) ); +insert into t1 values (0,'A01-Comp',1); +insert into t1 values (0,'B01-Comp',1); +insert into t2 values (0,1,'A Note',1); update t1 left join t2 on p_id = c2_p_id set c2_note = 'asdf-1' where p_id = 2; select * from t1; -p_id p_code p_created p_active -1 A01-Comp 2004-01-05 12:12:12 1 -2 B01-Comp 2004-01-05 12:12:13 1 +p_id p_code p_active +1 A01-Comp 1 +2 B01-Comp 1 select * from t2; -c2_id c2_p_id c2_note c2_created c2_active -1 1 A Note 2004-01-05 12:12:14 1 +c2_id c2_p_id c2_note c2_active +1 1 A Note 1 drop table t1, t2; diff --git a/mysql-test/t/multi_update.test b/mysql-test/t/multi_update.test index e4651df400f..39ea136bde1 100644 --- a/mysql-test/t/multi_update.test +++ b/mysql-test/t/multi_update.test @@ -330,11 +330,11 @@ DROP TABLE t1,t2; # Test update with const tables # -create table `t1` ( `p_id` int(10) unsigned NOT NULL auto_increment, `p_code` varchar(20) NOT NULL default '', `p_created` datetime NOT NULL default '0000-00-00 00:00:00', `p_active` tinyint(1) unsigned NOT NULL default '1', PRIMARY KEY (`p_id`) ); -create table `t2` ( `c2_id` int(10) unsigned NULL auto_increment, `c2_p_id` int(10) unsigned NOT NULL default '0', `c2_note` text NOT NULL, `c2_created` datetime NOT NULL default '0000-00-00 00:00:00', `c2_active` tinyint(1) unsigned NOT NULL default '1', PRIMARY KEY (`c2_id`), KEY `c2_p_id` (`c2_p_id`) ); -insert into t1 values (0,'A01-Comp',"2004-01-05 12:12:12",1); -insert into t1 values (0,'B01-Comp',"2004-01-05 12:12:13",1); -insert into t2 values (0,1,'A Note',"2004-01-05 12:12:14",1); +create table `t1` (`p_id` int(10) unsigned NOT NULL auto_increment, `p_code` varchar(20) NOT NULL default '', `p_active` tinyint(1) unsigned NOT NULL default '1', PRIMARY KEY (`p_id`) ); +create table `t2` (`c2_id` int(10) unsigned NULL auto_increment, `c2_p_id` int(10) unsigned NOT NULL default '0', `c2_note` text NOT NULL, `c2_active` tinyint(1) unsigned NOT NULL default '1', PRIMARY KEY (`c2_id`), KEY `c2_p_id` (`c2_p_id`) ); +insert into t1 values (0,'A01-Comp',1); +insert into t1 values (0,'B01-Comp',1); +insert into t2 values (0,1,'A Note',1); update t1 left join t2 on p_id = c2_p_id set c2_note = 'asdf-1' where p_id = 2; select * from t1; select * from t2;