diff options
author | unknown <marko@hundin.mysql.fi> | 2005-05-06 10:15:58 +0300 |
---|---|---|
committer | unknown <marko@hundin.mysql.fi> | 2005-05-06 10:15:58 +0300 |
commit | 98eb8d7c1691a8cc1a853428bf14048dbf6ab434 (patch) | |
tree | 05159d62a59936327730afbb6211fe07d5a5881c | |
parent | 972c1573d1fade4a9ad4e0a853c8551e61a1d637 (diff) | |
parent | eb72815b6f01791c2430929c9cf38e4b900f6f47 (diff) | |
download | mariadb-git-98eb8d7c1691a8cc1a853428bf14048dbf6ab434.tar.gz |
Merge marko@bk-internal.mysql.com:/home/bk/mysql-4.1
into hundin.mysql.fi:/home/marko/mysql-4.1
sql/ha_innodb.cc:
Auto merged
-rw-r--r-- | innobase/include/lock0lock.h | 11 | ||||
-rw-r--r-- | innobase/include/srv0srv.h | 6 | ||||
-rw-r--r-- | innobase/lock/lock0lock.c | 35 | ||||
-rw-r--r-- | innobase/srv/srv0srv.c | 29 | ||||
-rw-r--r-- | sql/ha_innodb.cc | 46 |
5 files changed, 98 insertions, 29 deletions
diff --git a/innobase/include/lock0lock.h b/innobase/include/lock0lock.h index 1fd7492d517..74288d57285 100644 --- a/innobase/include/lock0lock.h +++ b/innobase/include/lock0lock.h @@ -530,8 +530,15 @@ lock_rec_print( Prints info of locks for all transactions. */ void -lock_print_info( -/*============*/ +lock_print_info_summary( +/*====================*/ + FILE* file); /* in: file where to print */ +/************************************************************************* +Prints info of locks for each transaction. */ + +void +lock_print_info_all_transactions( +/*=============================*/ FILE* file); /* in: file where to print */ /************************************************************************* Validates the lock queue on a table. */ diff --git a/innobase/include/srv0srv.h b/innobase/include/srv0srv.h index 4e9e25844aa..4352083b21f 100644 --- a/innobase/include/srv0srv.h +++ b/innobase/include/srv0srv.h @@ -398,7 +398,11 @@ Outputs to a file the output of the InnoDB Monitor. */ void srv_printf_innodb_monitor( /*======================*/ - FILE* file); /* in: output stream */ + FILE* file, /* in: output stream */ + ulint* trx_start, /* out: file position of the start of + the list of active transactions */ + ulint* trx_end); /* out: file position of the end of + the list of active transactions */ /* Types for the threads existing in the system. Threads of types 4 - 9 diff --git a/innobase/lock/lock0lock.c b/innobase/lock/lock0lock.c index 29a274261f8..1c08d3defaa 100644 --- a/innobase/lock/lock0lock.c +++ b/innobase/lock/lock0lock.c @@ -4126,21 +4126,10 @@ lock_get_n_rec_locks(void) Prints info of locks for all transactions. */ void -lock_print_info( -/*============*/ +lock_print_info_summary( +/*====================*/ FILE* file) /* in: file where to print */ { - lock_t* lock; - trx_t* trx; - ulint space; - ulint page_no; - page_t* page; - ibool load_page_first = TRUE; - ulint nth_trx = 0; - ulint nth_lock = 0; - ulint i; - mtr_t mtr; - /* We must protect the MySQL thd->query field with a MySQL mutex, and because the MySQL mutex must be reserved before the kernel_mutex of InnoDB, we call innobase_mysql_prepare_print_arbitrary_thd() here. */ @@ -4179,6 +4168,26 @@ lock_print_info( fprintf(file, "Total number of lock structs in row lock hash table %lu\n", (ulong) lock_get_n_rec_locks()); +} + +/************************************************************************* +Prints info of locks for each transaction. */ + +void +lock_print_info_all_transactions( +/*=============================*/ + FILE* file) /* in: file where to print */ +{ + lock_t* lock; + ulint space; + ulint page_no; + page_t* page; + ibool load_page_first = TRUE; + ulint nth_trx = 0; + ulint nth_lock = 0; + ulint i; + mtr_t mtr; + trx_t* trx; fprintf(file, "LIST OF TRANSACTIONS FOR EACH SESSION:\n"); diff --git a/innobase/srv/srv0srv.c b/innobase/srv/srv0srv.c index a60e9e5a5f7..e56389a8541 100644 --- a/innobase/srv/srv0srv.c +++ b/innobase/srv/srv0srv.c @@ -1470,7 +1470,11 @@ Outputs to a file the output of the InnoDB Monitor. */ void srv_printf_innodb_monitor( /*======================*/ - FILE* file) /* in: output stream */ + FILE* file, /* in: output stream */ + ulint* trx_start, /* out: file position of the start of + the list of active transactions */ + ulint* trx_end) /* out: file position of the end of + the list of active transactions */ { double time_elapsed; time_t current_time; @@ -1519,7 +1523,24 @@ srv_printf_innodb_monitor( mutex_exit(&dict_foreign_err_mutex); - lock_print_info(file); + lock_print_info_summary(file); + if (trx_start) { + long t = ftell(file); + if (t < 0) { + *trx_start = ULINT_UNDEFINED; + } else { + *trx_start = (ulint) t; + } + } + lock_print_info_all_transactions(file); + if (trx_end) { + long t = ftell(file); + if (t < 0) { + *trx_end = ULINT_UNDEFINED; + } else { + *trx_end = (ulint) t; + } + } fputs("--------\n" "FILE I/O\n" "--------\n", file); @@ -1672,13 +1693,13 @@ loop: last_monitor_time = time(NULL); if (srv_print_innodb_monitor) { - srv_printf_innodb_monitor(stderr); + srv_printf_innodb_monitor(stderr, NULL, NULL); } if (srv_innodb_status) { mutex_enter(&srv_monitor_file_mutex); rewind(srv_monitor_file); - srv_printf_innodb_monitor(srv_monitor_file); + srv_printf_innodb_monitor(srv_monitor_file, NULL, NULL); os_file_set_eof(srv_monitor_file); mutex_exit(&srv_monitor_file_mutex); } diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index 0cb0f5564bf..2d2a8f2c3b4 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -5183,8 +5183,12 @@ innodb_show_status( /*===============*/ THD* thd) /* in: the MySQL query thread of the caller */ { - Protocol *protocol= thd->protocol; - trx_t* trx; + Protocol* protocol = thd->protocol; + trx_t* trx; + static const char truncated_msg[] = "... truncated...\n"; + const long MAX_STATUS_SIZE = 64000; + ulint trx_list_start = ULINT_UNDEFINED; + ulint trx_list_end = ULINT_UNDEFINED; DBUG_ENTER("innodb_show_status"); @@ -5199,33 +5203,57 @@ innodb_show_status( innobase_release_stat_resources(trx); - /* We let the InnoDB Monitor to output at most 64000 bytes of text. */ + /* We let the InnoDB Monitor to output at most MAX_STATUS_SIZE + bytes of text. */ - long flen; + long flen, usable_len; char* str; mutex_enter_noninline(&srv_monitor_file_mutex); rewind(srv_monitor_file); - srv_printf_innodb_monitor(srv_monitor_file); + srv_printf_innodb_monitor(srv_monitor_file, + &trx_list_start, &trx_list_end); flen = ftell(srv_monitor_file); os_file_set_eof(srv_monitor_file); if (flen < 0) { flen = 0; - } else if (flen > 64000 - 1) { - flen = 64000 - 1; + } + + if (flen > MAX_STATUS_SIZE) { + usable_len = MAX_STATUS_SIZE; + } else { + usable_len = flen; } /* allocate buffer for the string, and read the contents of the temporary file */ - if (!(str = my_malloc(flen + 1, MYF(0)))) + if (!(str = my_malloc(usable_len + 1, MYF(0)))) { mutex_exit_noninline(&srv_monitor_file_mutex); DBUG_RETURN(-1); } rewind(srv_monitor_file); - flen = fread(str, 1, flen, srv_monitor_file); + if (flen < MAX_STATUS_SIZE) { + /* Display the entire output. */ + flen = fread(str, 1, flen, srv_monitor_file); + } else if (trx_list_end < (ulint) flen + && trx_list_start < trx_list_end + && trx_list_start + (flen - trx_list_end) + < MAX_STATUS_SIZE - sizeof truncated_msg - 1) { + /* Omit the beginning of the list of active transactions. */ + long len = fread(str, 1, trx_list_start, srv_monitor_file); + memcpy(str + len, truncated_msg, sizeof truncated_msg - 1); + len += sizeof truncated_msg - 1; + usable_len = (MAX_STATUS_SIZE - 1) - len; + fseek(srv_monitor_file, flen - usable_len, SEEK_SET); + len += fread(str + len, 1, usable_len, srv_monitor_file); + flen = len; + } else { + /* Omit the end of the output. */ + flen = fread(str, 1, MAX_STATUS_SIZE - 1, srv_monitor_file); + } mutex_exit_noninline(&srv_monitor_file_mutex); |