1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

InnoDB: send diagnostic output to stderr or files

instead of stdout or fixed-size memory buffers
This commit is contained in:
marko@hundin.mysql.fi
2004-04-06 16:14:43 +03:00
parent 4f9b59f71d
commit 6af38c65be
73 changed files with 2235 additions and 2570 deletions

View File

@ -52,9 +52,6 @@ Created 10/8/1995 Heikki Tuuri
affects only FOREIGN KEY definition parsing */
ibool srv_lower_case_table_names = FALSE;
/* Buffer which can be used in printing fatal error messages */
char srv_fatal_errbuf[5000];
/* The following counter is incremented whenever there is some user activity
in the server */
ulint srv_activity_count = 0;
@ -290,7 +287,12 @@ const char* srv_io_thread_function[SRV_MAX_N_IO_THREADS];
time_t srv_last_monitor_time;
mutex_t srv_innodb_monitor_mutex;
mutex_t srv_innodb_monitor_mutex;
/* Mutex for locking srv_monitor_file */
mutex_t srv_monitor_file_mutex;
/* Temporary file for innodb monitor output */
FILE* srv_monitor_file;
ulint srv_main_thread_process_no = 0;
ulint srv_main_thread_id = 0;
@ -627,9 +629,10 @@ srv_suspend_thread(void)
slot_no = thr_local_get_slot_no(os_thread_get_curr_id());
if (srv_print_thread_releases) {
printf("Suspending thread %lu to slot %lu meter %lu\n",
os_thread_get_curr_id(), slot_no, srv_meter[SRV_RECOVERY]);
fprintf(stderr,
"Suspending thread %lu to slot %lu meter %lu\n",
os_thread_get_curr_id(), slot_no,
srv_meter[SRV_RECOVERY]);
}
slot = srv_table_get_nth_slot(slot_no);
@ -689,7 +692,7 @@ srv_release_threads(
os_event_set(slot->event);
if (srv_print_thread_releases) {
printf(
fprintf(stderr,
"Releasing thread %lu type %lu from slot %lu meter %lu\n",
slot->id, type, i, srv_meter[SRV_RECOVERY]);
}
@ -847,7 +850,6 @@ srv_conc_enter_innodb(
ibool has_slept = FALSE;
srv_conc_slot_t* slot = NULL;
ulint i;
char err_buf[1000];
if (srv_thread_concurrency >= 500) {
/* Disable the concurrency check */
@ -868,12 +870,11 @@ srv_conc_enter_innodb(
retry:
if (trx->declared_to_be_inside_innodb) {
ut_print_timestamp(stderr);
trx_print(err_buf, trx);
fprintf(stderr,
fputs(
" InnoDB: Error: trying to declare trx to enter InnoDB, but\n"
"InnoDB: it already is declared.\n%s\n", err_buf);
"InnoDB: it already is declared.\n", stderr);
trx_print(stderr, trx);
putc('\n', stderr);
os_fast_mutex_unlock(&srv_conc_mutex);
return;
@ -1403,15 +1404,13 @@ srv_refresh_innodb_monitor_stats(void)
}
/**********************************************************************
Sprintfs to a buffer the output of the InnoDB Monitor. */
Outputs to a file the output of the InnoDB Monitor. */
void
srv_sprintf_innodb_monitor(
/*=======================*/
char* buf, /* in/out: buffer which must be at least 4 kB */
ulint len) /* in: length of the buffer */
srv_printf_innodb_monitor(
/*======================*/
FILE* file) /* in: output stream */
{
char* buf_end = buf + len - 2000;
double time_elapsed;
time_t current_time;
ulint n_reserved;
@ -1429,28 +1428,20 @@ srv_sprintf_innodb_monitor(
srv_last_monitor_time = time(NULL);
ut_a(len >= 4096);
rewind(file);
fputs("\n=====================================\n", file);
buf += sprintf(buf, "\n=====================================\n");
ut_print_timestamp(file);
fprintf(file,
" INNODB MONITOR OUTPUT\n"
"=====================================\n"
"Per second averages calculated from the last %lu seconds\n",
(ulong)time_elapsed);
ut_sprintf_timestamp(buf);
buf = buf + strlen(buf);
ut_a(buf < buf_end + 1500);
buf += sprintf(buf, " INNODB MONITOR OUTPUT\n"
"=====================================\n");
buf += sprintf(buf,
"Per second averages calculated from the last %lu seconds\n",
(ulint)time_elapsed);
buf += sprintf(buf, "----------\n"
"SEMAPHORES\n"
"----------\n");
sync_print(buf, buf_end);
buf = buf + strlen(buf);
ut_a(buf < buf_end + 1500);
fputs("----------\n"
"SEMAPHORES\n"
"----------\n", file);
sync_print(file);
/* Conceptually, srv_innodb_monitor_mutex has a very high latching
order level in sync0sync.h, while dict_foreign_err_mutex has a very
@ -1459,43 +1450,29 @@ srv_sprintf_innodb_monitor(
mutex_enter(&dict_foreign_err_mutex);
if (*dict_foreign_err_buf != '\0') {
buf += sprintf(buf,
"------------------------\n"
"LATEST FOREIGN KEY ERROR\n"
"------------------------\n");
if (buf_end - buf > 6000) {
buf+= sprintf(buf, "%.4000s", dict_foreign_err_buf);
}
}
if (ftell(dict_foreign_err_file) != 0L) {
fputs("------------------------\n"
"LATEST FOREIGN KEY ERROR\n"
"------------------------\n", file);
ut_copy_file(file, dict_foreign_err_file);
}
mutex_exit(&dict_foreign_err_mutex);
ut_a(buf < buf_end + 1500);
lock_print_info(file);
fputs("--------\n"
"FILE I/O\n"
"--------\n", file);
os_aio_print(file);
lock_print_info(buf, buf_end);
buf = buf + strlen(buf);
buf += sprintf(buf, "--------\n"
"FILE I/O\n"
"--------\n");
os_aio_print(buf, buf_end);
buf = buf + strlen(buf);
ut_a(buf < buf_end + 1500);
fputs("-------------------------------------\n"
"INSERT BUFFER AND ADAPTIVE HASH INDEX\n"
"-------------------------------------\n", file);
ibuf_print(file);
buf += sprintf(buf, "-------------------------------------\n"
"INSERT BUFFER AND ADAPTIVE HASH INDEX\n"
"-------------------------------------\n");
ibuf_print(buf, buf_end);
buf = buf + strlen(buf);
ut_a(buf < buf_end + 1500);
ha_print_info(file, btr_search_sys->hash_index);
ha_print_info(buf, buf_end, btr_search_sys->hash_index);
buf = buf + strlen(buf);
ut_a(buf < buf_end + 1500);
buf += sprintf(buf,
fprintf(file,
"%.2f hash searches/s, %.2f non-hash searches/s\n",
(btr_cur_n_sea - btr_cur_n_sea_old)
/ time_elapsed,
@ -1504,57 +1481,50 @@ srv_sprintf_innodb_monitor(
btr_cur_n_sea_old = btr_cur_n_sea;
btr_cur_n_non_sea_old = btr_cur_n_non_sea;
buf += sprintf(buf,"---\n"
fputs("---\n"
"LOG\n"
"---\n");
log_print(buf, buf_end);
buf = buf + strlen(buf);
ut_a(buf < buf_end + 1500);
buf += sprintf(buf, "----------------------\n"
"---\n", file);
log_print(file);
fputs("----------------------\n"
"BUFFER POOL AND MEMORY\n"
"----------------------\n");
buf += sprintf(buf,
"----------------------\n", file);
fprintf(file,
"Total memory allocated %lu; in additional pool allocated %lu\n",
ut_total_allocated_memory,
mem_pool_get_reserved(mem_comm_pool));
buf_print_io(buf, buf_end);
buf = buf + strlen(buf);
ut_a(buf < buf_end + 1500);
buf_print_io(file);
buf += sprintf(buf, "--------------\n"
"ROW OPERATIONS\n"
"--------------\n");
buf += sprintf(buf,
"%ld queries inside InnoDB, %lu queries in queue\n",
fputs("--------------\n"
"ROW OPERATIONS\n"
"--------------\n", file);
fprintf(file, "%ld queries inside InnoDB, %lu queries in queue\n",
srv_conc_n_threads, srv_conc_n_waiting_threads);
n_reserved = fil_space_get_n_reserved_extents(0);
if (n_reserved > 0) {
buf += sprintf(buf,
fprintf(file,
"%lu tablespace extents now reserved for B-tree split operations\n",
n_reserved);
}
#ifdef UNIV_LINUX
buf += sprintf(buf,
"Main thread process no. %lu, id %lu, state: %.29s\n",
fprintf(file, "Main thread process no. %lu, id %lu, state: %s\n",
srv_main_thread_process_no,
srv_main_thread_id,
srv_main_thread_op_info);
#else
buf += sprintf(buf,
"Main thread id %lu, state: %.29s\n",
fprintf(file, "Main thread id %lu, state: %s\n",
srv_main_thread_id,
srv_main_thread_op_info);
#endif
buf += sprintf(buf,
fprintf(file,
"Number of rows inserted %lu, updated %lu, deleted %lu, read %lu\n",
srv_n_rows_inserted,
srv_n_rows_updated,
srv_n_rows_deleted,
srv_n_rows_read);
buf += sprintf(buf,
fprintf(file,
"%.2f inserts/s, %.2f updates/s, %.2f deletes/s, %.2f reads/s\n",
(srv_n_rows_inserted - srv_n_rows_inserted_old)
/ time_elapsed,
@ -1570,12 +1540,12 @@ srv_sprintf_innodb_monitor(
srv_n_rows_deleted_old = srv_n_rows_deleted;
srv_n_rows_read_old = srv_n_rows_read;
buf += sprintf(buf, "----------------------------\n"
fputs("----------------------------\n"
"END OF INNODB MONITOR OUTPUT\n"
"============================\n");
ut_a(buf < buf_end + 1900);
"============================\n", file);
mutex_exit(&srv_innodb_monitor_mutex);
fflush(file);
}
/*************************************************************************
@ -1601,13 +1571,13 @@ srv_lock_timeout_and_monitor_thread(
time_t last_monitor_time;
ibool some_waits;
double wait_time;
char* buf;
ulint i;
#ifdef UNIV_DEBUG_THREAD_CREATION
printf("Lock timeout thread starts, id %lu\n",
fprintf(stderr, "Lock timeout thread starts, id %lu\n",
os_thread_pf(os_thread_get_curr_id()));
#endif
UT_NOT_USED(arg);
srv_last_monitor_time = time(NULL);
last_table_monitor_time = time(NULL);
last_monitor_time = time(NULL);
@ -1633,55 +1603,56 @@ loop:
last_monitor_time = time(NULL);
if (srv_print_innodb_monitor) {
srv_printf_innodb_monitor(stderr);
}
buf = mem_alloc(100000);
mutex_enter(&srv_monitor_file_mutex);
rewind(srv_monitor_file);
srv_printf_innodb_monitor(srv_monitor_file);
mutex_exit(&srv_monitor_file_mutex);
srv_sprintf_innodb_monitor(buf, 90000);
ut_a(strlen(buf) < 99000);
printf("%s", buf);
mem_free(buf);
}
if (srv_print_innodb_tablespace_monitor
&& difftime(current_time, last_table_monitor_time) > 60) {
if (srv_print_innodb_tablespace_monitor
&& difftime(current_time, last_table_monitor_time) > 60) {
last_table_monitor_time = time(NULL);
printf("================================================\n");
fputs("================================================\n",
stderr);
ut_print_timestamp(stdout);
ut_print_timestamp(stderr);
printf(" INNODB TABLESPACE MONITOR OUTPUT\n"
"================================================\n");
fputs(" INNODB TABLESPACE MONITOR OUTPUT\n"
"================================================\n",
stderr);
fsp_print(0);
fprintf(stderr, "Validating tablespace\n");
fputs("Validating tablespace\n", stderr);
fsp_validate(0);
fprintf(stderr, "Validation ok\n");
printf("---------------------------------------\n"
fputs("Validation ok\n"
"---------------------------------------\n"
"END OF INNODB TABLESPACE MONITOR OUTPUT\n"
"=======================================\n");
"=======================================\n",
stderr);
}
if (srv_print_innodb_table_monitor
&& difftime(current_time, last_table_monitor_time) > 60) {
&& difftime(current_time, last_table_monitor_time) > 60) {
last_table_monitor_time = time(NULL);
printf("===========================================\n");
fputs("===========================================\n", stderr);
ut_print_timestamp(stdout);
ut_print_timestamp(stderr);
printf(" INNODB TABLE MONITOR OUTPUT\n"
"===========================================\n");
fputs(" INNODB TABLE MONITOR OUTPUT\n"
"===========================================\n",
stderr);
dict_print();
printf("-----------------------------------\n"
fputs("-----------------------------------\n"
"END OF INNODB TABLE MONITOR OUTPUT\n"
"==================================\n");
"==================================\n",
stderr);
}
}
@ -1740,8 +1711,11 @@ loop:
srv_lock_timeout_and_monitor_active = FALSE;
#if 0
/* The following synchronisation is disabled, since
the InnoDB monitor output is to be updated every 15 seconds. */
os_event_wait(srv_lock_timeout_thread_event);
#endif
goto loop;
exit_func:
@ -1777,7 +1751,7 @@ srv_error_monitor_thread(
ulint cnt = 0;
#ifdef UNIV_DEBUG_THREAD_CREATION
printf("Error monitor thread starts, id %lu\n",
fprintf(stderr, "Error monitor thread starts, id %lu\n",
os_thread_pf(os_thread_get_curr_id()));
#endif
loop:
@ -1796,11 +1770,10 @@ loop:
sync_array_print_long_waits();
/* Flush stdout and stderr so that a database user gets their output
/* Flush stderr so that a database user gets the output
to possible MySQL error file */
fflush(stderr);
fflush(stdout);
if (srv_shutdown_state < SRV_SHUTDOWN_LAST_PHASE) {
@ -1892,7 +1865,7 @@ srv_master_thread(
ulint i;
#ifdef UNIV_DEBUG_THREAD_CREATION
printf("Master thread starts, id %lu\n",
fprintf(stderr, "Master thread starts, id %lu\n",
os_thread_pf(os_thread_get_curr_id()));
#endif
srv_main_thread_process_no = os_proc_get_number();