summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <marko@hundin.mysql.fi>2005-05-06 10:15:58 +0300
committerunknown <marko@hundin.mysql.fi>2005-05-06 10:15:58 +0300
commit98eb8d7c1691a8cc1a853428bf14048dbf6ab434 (patch)
tree05159d62a59936327730afbb6211fe07d5a5881c
parent972c1573d1fade4a9ad4e0a853c8551e61a1d637 (diff)
parenteb72815b6f01791c2430929c9cf38e4b900f6f47 (diff)
downloadmariadb-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.h11
-rw-r--r--innobase/include/srv0srv.h6
-rw-r--r--innobase/lock/lock0lock.c35
-rw-r--r--innobase/srv/srv0srv.c29
-rw-r--r--sql/ha_innodb.cc46
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);