List:Commits« Previous MessageNext Message »
From:tim Date:December 19 2006 11:58pm
Subject:bk commit into 5.0 tree (tsmith:1.2353) BUG#24200
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of tim. When tim does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2006-12-19 16:57:51-07:00, tsmith@stripped +13 -0
  Added innodb_rollback_on_timeout option to restore the 4.1 
  InnoDB timeout behavior (Bug #24200)

  innobase/include/row0mysql.h@stripped, 2006-12-19 16:57:47-07:00, tsmith@stripped +2 -0
    Added innodb_rollback_on_timeout option to restore the 4.1 
    InnoDB timeout behavior (Bug #24200)

  innobase/row/row0mysql.c@stripped, 2006-12-19 16:57:47-07:00, tsmith@stripped +10 -1
    Added innodb_rollback_on_timeout option to restore the 4.1 
    InnoDB timeout behavior (Bug #24200)

  mysql-test/include/innodb_rollback_on_timeout.inc@stripped, 2006-12-19 16:57:48-07:00, tsmith@stripped +37 -0
    Added innodb_rollback_on_timeout option to restore the 4.1 
    InnoDB timeout behavior (Bug #24200)

  mysql-test/include/innodb_rollback_on_timeout.inc@stripped, 2006-12-19 16:57:48-07:00, tsmith@stripped +0 -0

  mysql-test/r/innodb_mysql.result@stripped, 2006-12-19 16:57:47-07:00, tsmith@stripped +36 -0
    Added innodb_rollback_on_timeout option to restore the 4.1 
    InnoDB timeout behavior (Bug #24200)

  mysql-test/r/innodb_timeout_rollback.result@stripped, 2006-12-19 16:57:48-07:00, tsmith@stripped +35 -0
    Added innodb_rollback_on_timeout option to restore the 4.1 
    InnoDB timeout behavior (Bug #24200)

  mysql-test/r/innodb_timeout_rollback.result@stripped, 2006-12-19 16:57:48-07:00, tsmith@stripped +0 -0

  mysql-test/t/innodb_mysql-master.opt@stripped, 2006-12-19 16:57:48-07:00, tsmith@stripped +1 -0
    Set --innodb-lock-wait-timeout=2, since test for bug #24200 times out.
    
    This *could* cause random test failures if some long-running transaction concurrency is being tested.  However, such a test really should go in innodb-big or some other test file.
    

  mysql-test/t/innodb_mysql-master.opt@stripped, 2006-12-19 16:57:48-07:00, tsmith@stripped +0 -0

  mysql-test/t/innodb_mysql.test@stripped, 2006-12-19 16:57:47-07:00, tsmith@stripped +2 -0
    Added innodb_rollback_on_timeout option to restore the 4.1 
    InnoDB timeout behavior (Bug #24200)

  mysql-test/t/innodb_timeout_rollback-master.opt@stripped, 2006-12-19 16:57:48-07:00, tsmith@stripped +1 -0
    Added innodb_rollback_on_timeout option to restore the 4.1 
    InnoDB timeout behavior (Bug #24200)

  mysql-test/t/innodb_timeout_rollback-master.opt@stripped, 2006-12-19 16:57:48-07:00, tsmith@stripped +0 -0

  mysql-test/t/innodb_timeout_rollback.test@stripped, 2006-12-19 16:57:48-07:00, tsmith@stripped +5 -0
    Added innodb_rollback_on_timeout option to restore the 4.1 
    InnoDB timeout behavior (Bug #24200)

  mysql-test/t/innodb_timeout_rollback.test@stripped, 2006-12-19 16:57:48-07:00, tsmith@stripped +0 -0

  sql/ha_innodb.cc@stripped, 2006-12-19 16:57:47-07:00, tsmith@stripped +7 -0
    Added innodb_rollback_on_timeout option to restore the 4.1 
    InnoDB timeout behavior (Bug #24200)

  sql/ha_innodb.h@stripped, 2006-12-19 16:57:48-07:00, tsmith@stripped +1 -0
    Added innodb_rollback_on_timeout option to restore the 4.1 
    InnoDB timeout behavior (Bug #24200)

  sql/mysqld.cc@stripped, 2006-12-19 16:57:48-07:00, tsmith@stripped +6 -1
    Added innodb_rollback_on_timeout option to restore the 4.1 
    InnoDB timeout behavior (Bug #24200)

  sql/set_var.cc@stripped, 2006-12-19 16:57:48-07:00, tsmith@stripped +1 -0
    Added innodb_rollback_on_timeout option to restore the 4.1 
    InnoDB timeout behavior (Bug #24200)

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	tsmith
# Host:	siva.hindu.god
# Root:	/usr/home/tim/m/bk/50-24200

--- 1.582/sql/mysqld.cc	2006-12-19 16:58:00 -07:00
+++ 1.583/sql/mysqld.cc	2006-12-19 16:58:00 -07:00
@@ -4692,7 +4692,8 @@ enum options_mysqld
   OPT_LOG_SLOW_ADMIN_STATEMENTS,
   OPT_TABLE_LOCK_WAIT_TIMEOUT,
   OPT_PORT_OPEN_TIMEOUT,
-  OPT_MERGE
+  OPT_MERGE,
+  OPT_INNODB_ROLLBACK_ON_TIMEOUT
 };
 
 
@@ -4968,6 +4969,10 @@ Disable with --skip-innodb-doublewrite."
    (gptr*) &srv_max_purge_lag,
    (gptr*) &srv_max_purge_lag, 0, GET_LONG, REQUIRED_ARG, 0, 0, ~0L,
    0, 1L, 0},
+  {"innodb_rollback_on_timeout", OPT_INNODB_ROLLBACK_ON_TIMEOUT,
+   "Roll back the complete transaction on lock wait timeout, for 4.x compatibility (disabled by default)",
+   (gptr*) &innobase_rollback_on_timeout, (gptr*) &innobase_rollback_on_timeout,
+   0, GET_BOOL, OPT_ARG, 0, 0, 0, 0, 0, 0},
   {"innodb_status_file", OPT_INNODB_STATUS_FILE,
    "Enable SHOW INNODB STATUS output in the innodb_status.<pid> file",
    (gptr*) &innobase_create_status_file, (gptr*) &innobase_create_status_file,

--- 1.14/mysql-test/r/innodb_mysql.result	2006-12-19 16:58:00 -07:00
+++ 1.15/mysql-test/r/innodb_mysql.result	2006-12-19 16:58:00 -07:00
@@ -383,4 +383,40 @@ EXPLAIN SELECT SQL_BIG_RESULT b, SUM(c) 
 id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	128	Using filesort
 DROP TABLE t1;
+show variables like 'innodb_rollback_on_timeout';
+Variable_name	Value
+innodb_rollback_on_timeout	OFF
+create table t1 (a int unsigned not null primary key) engine = innodb;
+insert into t1 values (1);
+commit;
+begin work;
+insert into t1 values (2);
+select * from t1;
+a
+1
+2
+begin work;
+insert into t1 values (5);
+select * from t1;
+a
+1
+5
+insert into t1 values (2);
+ERROR HY000: Lock wait timeout exceeded; try restarting transaction
+select * from t1;
+a
+1
+5
+commit;
+select * from t1;
+a
+1
+2
+commit;
+select * from t1;
+a
+1
+2
+5
+drop table t1;
 End of 5.0 tests

--- 1.14/mysql-test/t/innodb_mysql.test	2006-12-19 16:58:00 -07:00
+++ 1.15/mysql-test/t/innodb_mysql.test	2006-12-19 16:58:00 -07:00
@@ -384,4 +384,6 @@ EXPLAIN SELECT SQL_BIG_RESULT b, SUM(c) 
 DROP TABLE t1;
 
 
+--source include/innodb_rollback_on_timeout.inc
+
 --echo End of 5.0 tests

--- 1.46/innobase/include/row0mysql.h	2006-12-19 16:58:00 -07:00
+++ 1.47/innobase/include/row0mysql.h	2006-12-19 16:58:00 -07:00
@@ -19,6 +19,8 @@ Created 9/17/2000 Heikki Tuuri
 #include "btr0pcur.h"
 #include "trx0types.h"
 
+extern ibool row_rollback_on_timeout;
+
 typedef struct row_prebuilt_struct row_prebuilt_t;
 
 /***********************************************************************

--- 1.123/innobase/row/row0mysql.c	2006-12-19 16:58:00 -07:00
+++ 1.124/innobase/row/row0mysql.c	2006-12-19 16:58:00 -07:00
@@ -35,6 +35,9 @@ Created 9/17/2000 Heikki Tuuri
 /* A dummy variable used to fool the compiler */
 ibool	row_mysql_identically_false	= FALSE;
 
+/* Provide optional 4.x backwards compatibility for 5.0 and above */
+ibool	row_rollback_on_timeout	= FALSE;
+
 /* List of tables we should drop in background. ALTER TABLE in MySQL requires
 that the table handler can drop the table in background when there are no
 queries to it any more. Protected by the kernel mutex. */
@@ -514,7 +517,9 @@ handle_new_error:
 		return(TRUE);
 
 	} else if (err == DB_DEADLOCK
-		   || err == DB_LOCK_TABLE_FULL) {
+		   || err == DB_LOCK_TABLE_FULL
+		   || (err == DB_LOCK_WAIT_TIMEOUT
+		       && row_rollback_on_timeout)) {
 		/* Roll back the whole transaction; this resolution was added
 		to version 3.23.43 */
 
@@ -522,6 +527,10 @@ handle_new_error:
 				
 	} else if (err == DB_OUT_OF_FILE_SPACE
 		   || err == DB_LOCK_WAIT_TIMEOUT) {
+
+		ut_ad(!(err == DB_LOCK_WAIT_TIMEOUT
+		        && row_rollback_on_timeout));
+
            	if (savept) {
 			/* Roll back the latest, possibly incomplete
 			insertion or update */

--- 1.305/sql/ha_innodb.cc	2006-12-19 16:58:00 -07:00
+++ 1.306/sql/ha_innodb.cc	2006-12-19 16:58:00 -07:00
@@ -173,6 +173,7 @@ my_bool innobase_use_large_pages    = FA
 my_bool	innobase_use_native_aio			= FALSE;
 my_bool	innobase_file_per_table			= FALSE;
 my_bool innobase_locks_unsafe_for_binlog        = FALSE;
+my_bool innobase_rollback_on_timeout		= FALSE;
 my_bool innobase_create_status_file		= FALSE;
 
 static char *internal_innobase_data_file_path	= NULL;
@@ -467,6 +468,10 @@ convert_error_code_to_mysql(
 		latest SQL statement in a lock wait timeout. Previously, we
 		rolled back the whole transaction. */
 
+		if (thd && row_rollback_on_timeout) {
+			ha_rollback(thd);
+		}
+
    		return(HA_ERR_LOCK_WAIT_TIMEOUT);
 
  	} else if (error == (int) DB_NO_REFERENCED_ROW) {
@@ -1379,6 +1384,8 @@ innobase_init(void)
 
 	os_use_large_pages = (ibool) innobase_use_large_pages;
 	os_large_page_size = (ulint) innobase_large_page_size;
+
+	row_rollback_on_timeout = (ibool) innobase_rollback_on_timeout;
 
 	srv_file_per_table = (ibool) innobase_file_per_table;
         srv_locks_unsafe_for_binlog = (ibool) innobase_locks_unsafe_for_binlog;

--- 1.113/sql/ha_innodb.h	2006-12-19 16:58:00 -07:00
+++ 1.114/sql/ha_innodb.h	2006-12-19 16:58:00 -07:00
@@ -216,6 +216,7 @@ extern my_bool innobase_log_archive,
                innobase_use_large_pages,
                innobase_use_native_aio,
 	       innobase_file_per_table, innobase_locks_unsafe_for_binlog,
+               innobase_rollback_on_timeout,
                innobase_create_status_file;
 extern my_bool innobase_very_fast_shutdown; /* set this to 1 just before
 					    calling innobase_end() if you want

--- 1.173/sql/set_var.cc	2006-12-19 16:58:00 -07:00
+++ 1.174/sql/set_var.cc	2006-12-19 16:58:00 -07:00
@@ -904,6 +904,7 @@ struct show_var_st init_vars[]= {
   {sys_innodb_max_purge_lag.name, (char*) &sys_innodb_max_purge_lag, SHOW_SYS},
   {"innodb_mirrored_log_groups", (char*) &innobase_mirrored_log_groups, SHOW_LONG},
   {"innodb_open_files", (char*) &innobase_open_files, SHOW_LONG },
+  {"innodb_rollback_on_timeout", (char*) &innobase_rollback_on_timeout, SHOW_MY_BOOL},
   {sys_innodb_support_xa.name, (char*) &sys_innodb_support_xa, SHOW_SYS},
   {sys_innodb_sync_spin_loops.name, (char*) &sys_innodb_sync_spin_loops, SHOW_SYS},
   {sys_innodb_table_locks.name, (char*) &sys_innodb_table_locks, SHOW_SYS},
--- New file ---
+++ mysql-test/include/innodb_rollback_on_timeout.inc	06/12/19 16:57:48
#
# Bug #24200: Provide backwards compatibility mode for 4.x "rollback on
# transaction timeout"
#
show variables like 'innodb_rollback_on_timeout';
create table t1 (a int unsigned not null primary key) engine = innodb;
insert into t1 values (1);
commit;
connect (con1,localhost,root,,);
connect (con2,localhost,root,,);

connection con2;
begin work;
insert into t1 values (2);
select * from t1;

connection con1;
begin work;
insert into t1 values (5);
select * from t1;
# Lock wait timeout set to 2 seconds in <THIS TEST>-master.opt; this
# statement will time out; in 5.0.13+, it will not roll back transaction.
--error ER_LOCK_WAIT_TIMEOUT
insert into t1 values (2);
# On 5.0.13+, this should give ==> 1, 5
select * from t1;
commit;

connection con2;
select * from t1;
commit;

connection default;
select * from t1;
drop table t1;
disconnect con1;
disconnect con2;

--- New file ---
+++ mysql-test/r/innodb_timeout_rollback.result	06/12/19 16:57:48
show variables like 'innodb_rollback_on_timeout';
Variable_name	Value
innodb_rollback_on_timeout	ON
create table t1 (a int unsigned not null primary key) engine = innodb;
insert into t1 values (1);
commit;
begin work;
insert into t1 values (2);
select * from t1;
a
1
2
begin work;
insert into t1 values (5);
select * from t1;
a
1
5
insert into t1 values (2);
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
select * from t1;
a
1
commit;
select * from t1;
a
1
2
commit;
select * from t1;
a
1
2
drop table t1;
End of 5.0 tests

--- New file ---
+++ mysql-test/t/innodb_mysql-master.opt	06/12/19 16:57:48
--innodb-lock-wait-timeout=2

--- New file ---
+++ mysql-test/t/innodb_timeout_rollback-master.opt	06/12/19 16:57:48
--innodb_lock_wait_timeout=2 --innodb_rollback_on_timeout

--- New file ---
+++ mysql-test/t/innodb_timeout_rollback.test	06/12/19 16:57:48
-- source include/have_innodb.inc

--source include/innodb_rollback_on_timeout.inc

--echo End of 5.0 tests

Thread
bk commit into 5.0 tree (tsmith:1.2353) BUG#24200tim20 Dec