Commit 98eb8d7c authored by unknown's avatar unknown
Browse files

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
parents 972c1573 eb72815b
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -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. */
+5 −1
Original line number Diff line number Diff line
@@ -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
+22 −13
Original line number Diff line number Diff line
@@ -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");

+25 −4
Original line number Diff line number Diff line
@@ -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 @@ srv_lock_timeout_and_monitor_thread(
	    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);
	    }
+37 −9
Original line number Diff line number Diff line
@@ -5185,6 +5185,10 @@ innodb_show_status(
{
	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);
	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);