From: Baron Schwartz Date: November 15 2007 6:38pm Subject: Patch for bug #29126 List-Archive: http://lists.mysql.com/internals/35174 Message-Id: <473C9208.5030906@xaprb.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------040008090205070206060306" --------------040008090205070206060306 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit The attached patch is against 5.0.38, but seems to apply OK on 5.0.45 sources as well (though I've only built 5.0.38 with it). I understand this patch has very little chance of being applied to the server, but I'm still interested in whether my code is any good. Even coding style critiques are welcomed. I'm grateful for any time anyone spends looking at this. Regards Baron --------------040008090205070206060306 Content-Type: text/x-patch; name="mysql_5.0.38_bug_29126.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="mysql_5.0.38_bug_29126.patch" diff -ur orig/innobase/include/srv0srv.h new/innobase/include/srv0srv.h --- orig/innobase/include/srv0srv.h 2007-11-08 11:16:57.000000000 -0500 +++ new/innobase/include/srv0srv.h 2007-11-15 11:42:31.000000000 -0500 @@ -78,6 +78,8 @@ extern ulint srv_log_file_size; extern ulint srv_log_buffer_size; extern ulong srv_flush_log_at_trx_commit; +extern ulong srv_show_locks_held; +extern ulong srv_show_verbose_locks; extern byte srv_latin1_ordering[256];/* The sort order table of the latin1 character set */ diff -ur orig/innobase/lock/lock0lock.c new/innobase/lock/lock0lock.c --- orig/innobase/lock/lock0lock.c 2007-11-08 11:16:56.000000000 -0500 +++ new/innobase/lock/lock0lock.c 2007-11-15 11:42:31.000000000 -0500 @@ -4157,6 +4157,7 @@ #endif /* UNIV_SYNC_DEBUG */ } + if ( srv_show_verbose_locks ) { for (i = 0; i < lock_rec_get_n_bits(lock); i++) { if (lock_rec_get_nth_bit(lock, i)) { @@ -4174,6 +4175,7 @@ putc('\n', file); } } + } /* srv_show_verbose_locks */ mtr_commit(&mtr); if (UNIV_LIKELY_NULL(heap)) { @@ -4345,7 +4347,7 @@ } } - if (!srv_print_innodb_lock_monitor) { + if (!srv_print_innodb_lock_monitor && !srv_show_locks_held) { nth_trx++; goto loop; } @@ -4402,9 +4404,9 @@ nth_lock++; - if (nth_lock >= 10) { + if (nth_lock >= srv_show_locks_held) { fputs( - "10 LOCKS PRINTED FOR THIS TRX: SUPPRESSING FURTHER PRINTS\n", + "TOO MANY LOCKS PRINTED FOR THIS TRX: SUPPRESSING FURTHER PRINTS\n", file); nth_trx++; diff -ur orig/innobase/srv/srv0srv.c new/innobase/srv/srv0srv.c --- orig/innobase/srv/srv0srv.c 2007-11-08 11:16:56.000000000 -0500 +++ new/innobase/srv/srv0srv.c 2007-11-15 11:42:31.000000000 -0500 @@ -114,6 +114,8 @@ ulint srv_log_file_size = ULINT_MAX; /* size in database pages */ ulint srv_log_buffer_size = ULINT_MAX; /* size in database pages */ ulong srv_flush_log_at_trx_commit = 1; +ulint srv_show_locks_held = 10; +ulint srv_show_verbose_locks = 0; byte srv_latin1_ordering[256] /* The sort order table of the latin1 character set. The following table is diff -ur orig/libmysqld/set_var.cc new/libmysqld/set_var.cc --- orig/libmysqld/set_var.cc 2007-11-08 11:16:55.000000000 -0500 +++ new/libmysqld/set_var.cc 2007-11-15 11:42:31.000000000 -0500 @@ -455,6 +455,12 @@ sys_var_long_ptr sys_innodb_flush_log_at_trx_commit( "innodb_flush_log_at_trx_commit", &srv_flush_log_at_trx_commit); +sys_var_long_ptr sys_innodb_show_locks_held( + "innodb_show_locks_held", + &srv_show_locks_held); +sys_var_long_ptr sys_innodb_show_verbose_locks( + "innodb_show_verbose_locks", + &srv_show_verbose_locks); #endif /* Condition pushdown to storage engine */ @@ -785,6 +791,8 @@ &sys_innodb_thread_concurrency, &sys_innodb_commit_concurrency, &sys_innodb_flush_log_at_trx_commit, + &sys_innodb_show_locks_held, + &sys_innodb_show_verbose_locks, #endif &sys_trust_routine_creators, &sys_trust_function_creators, @@ -897,6 +905,8 @@ {"innodb_file_io_threads", (char*) &innobase_file_io_threads, SHOW_LONG }, {"innodb_file_per_table", (char*) &innobase_file_per_table, SHOW_MY_BOOL}, {sys_innodb_flush_log_at_trx_commit.name, (char*) &sys_innodb_flush_log_at_trx_commit, SHOW_SYS}, + {sys_innodb_show_locks_held.name, (char*) &sys_innodb_show_locks_held, SHOW_SYS }, + {sys_innodb_show_verbose_locks.name, (char*) &sys_innodb_show_verbose_locks, SHOW_SYS }, {"innodb_flush_method", (char*) &innobase_unix_file_flush_method, SHOW_CHAR_PTR}, {"innodb_force_recovery", (char*) &innobase_force_recovery, SHOW_LONG }, {"innodb_lock_wait_timeout", (char*) &innobase_lock_wait_timeout, SHOW_LONG }, diff -ur orig/sql/ha_innodb.h new/sql/ha_innodb.h --- orig/sql/ha_innodb.h 2007-11-08 11:16:54.000000000 -0500 +++ new/sql/ha_innodb.h 2007-11-15 11:42:31.000000000 -0500 @@ -232,6 +232,8 @@ extern ulong srv_thread_concurrency; extern ulong srv_commit_concurrency; extern ulong srv_flush_log_at_trx_commit; +extern ulong srv_show_locks_held; +extern ulong srv_show_verbose_locks; } bool innobase_init(void); diff -ur orig/sql/mysqld.cc new/sql/mysqld.cc --- orig/sql/mysqld.cc 2007-11-08 11:16:54.000000000 -0500 +++ new/sql/mysqld.cc 2007-11-15 11:50:54.000000000 -0500 @@ -4717,6 +4717,8 @@ OPT_INNODB_MAX_PURGE_LAG, OPT_INNODB_FILE_IO_THREADS, OPT_INNODB_LOCK_WAIT_TIMEOUT, + OPT_INNODB_SHOW_LOCKS_HELD, + OPT_INNODB_SHOW_VERBOSE_LOCKS, OPT_INNODB_THREAD_CONCURRENCY, OPT_INNODB_COMMIT_CONCURRENCY, OPT_INNODB_FORCE_RECOVERY, @@ -5027,6 +5029,14 @@ (gptr*) &srv_flush_log_at_trx_commit, (gptr*) &srv_flush_log_at_trx_commit, 0, GET_ULONG, OPT_ARG, 1, 0, 2, 0, 0, 0}, + {"innodb_show_locks_held", OPT_INNODB_SHOW_LOCKS_HELD, + "Number of locks held to print for each InnoDB transaction in SHOW INNODB STATUS.", + (gptr*) &srv_show_locks_held, (gptr*) &srv_show_locks_held, + 0, GET_LONG, OPT_ARG, 10, 0, 1000, 0, 1, 0}, + {"innodb_show_verbose_locks", OPT_INNODB_SHOW_VERBOSE_LOCKS, + "Whether to show records locked in SHOW INNODB STATUS.", + (gptr*) &srv_show_verbose_locks, (gptr*) &srv_show_verbose_locks, + 0, GET_LONG, OPT_ARG, 0, 0, 1, 0, 1, 0}, {"innodb_flush_method", OPT_INNODB_FLUSH_METHOD, "With which method to flush data.", (gptr*) &innobase_unix_file_flush_method, (gptr*) &innobase_unix_file_flush_method, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, diff -ur orig/sql/set_var.cc new/sql/set_var.cc --- orig/sql/set_var.cc 2007-11-08 11:16:54.000000000 -0500 +++ new/sql/set_var.cc 2007-11-15 11:49:27.000000000 -0500 @@ -455,6 +455,12 @@ sys_var_long_ptr sys_innodb_flush_log_at_trx_commit( "innodb_flush_log_at_trx_commit", &srv_flush_log_at_trx_commit); +sys_var_long_ptr sys_innodb_show_locks_held( + "innodb_show_locks_held", + &srv_show_locks_held); +sys_var_long_ptr sys_innodb_show_verbose_locks( + "innodb_show_verbose_locks", + &srv_show_verbose_locks); #endif /* Condition pushdown to storage engine */ @@ -785,6 +791,8 @@ &sys_innodb_thread_concurrency, &sys_innodb_commit_concurrency, &sys_innodb_flush_log_at_trx_commit, + &sys_innodb_show_locks_held, + &sys_innodb_show_verbose_locks, #endif &sys_trust_routine_creators, &sys_trust_function_creators, @@ -897,6 +905,8 @@ {"innodb_file_io_threads", (char*) &innobase_file_io_threads, SHOW_LONG }, {"innodb_file_per_table", (char*) &innobase_file_per_table, SHOW_MY_BOOL}, {sys_innodb_flush_log_at_trx_commit.name, (char*) &sys_innodb_flush_log_at_trx_commit, SHOW_SYS}, + {sys_innodb_show_locks_held.name, (char*) &sys_innodb_show_locks_held, SHOW_SYS }, + {sys_innodb_show_verbose_locks.name, (char*) &sys_innodb_show_verbose_locks, SHOW_SYS }, {"innodb_flush_method", (char*) &innobase_unix_file_flush_method, SHOW_CHAR_PTR}, {"innodb_force_recovery", (char*) &innobase_force_recovery, SHOW_LONG }, {"innodb_lock_wait_timeout", (char*) &innobase_lock_wait_timeout, SHOW_LONG }, --------------040008090205070206060306--