diff options
-rw-r--r-- | include/my_sys.h | 2 | ||||
-rw-r--r-- | mysys/errors.c | 24 | ||||
-rw-r--r-- | mysys/my_error.c | 22 | ||||
-rw-r--r-- | mysys/my_write.c | 4 | ||||
-rw-r--r-- | sql/mysqld.cc | 1 |
5 files changed, 47 insertions, 6 deletions
diff --git a/include/my_sys.h b/include/my_sys.h index 6bdb95e9707..1973f07ac13 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -234,6 +234,7 @@ extern char *home_dir; /* Home directory for user */ extern const char *my_progname; /* program-name (printed in errors) */ extern char NEAR curr_dir[]; /* Current directory for user */ extern int (*error_handler_hook)(uint my_err, const char *str,myf MyFlags); +extern void(*sql_print_warning_hook)(const char *format,...); extern int (*fatal_error_handler_hook)(uint my_err, const char *str, myf MyFlags); extern uint my_file_limit; @@ -675,6 +676,7 @@ extern int my_error _VARARGS((int nr,myf MyFlags, ...)); extern int my_printf_error _VARARGS((uint my_err, const char *format, myf MyFlags, ...)) ATTRIBUTE_FORMAT(printf, 2, 4); +extern void my_printf_warning _VARARGS((const char * format, ...)); extern int my_error_register(const char **errmsgs, int first, int last); extern const char **my_error_unregister(int first, int last); extern int my_message(uint my_err, const char *str,myf MyFlags); diff --git a/mysys/errors.c b/mysys/errors.c index 4e93f872a55..1199df2f2be 100644 --- a/mysys/errors.c +++ b/mysys/errors.c @@ -101,16 +101,28 @@ void init_glob_errs() } #endif +/* + We cannot call my_error/my_printf_error here in this function. + Those functions will set status variable in diagnostic area + and there is no provision to reset them back. + Here we are waiting for free space and will wait forever till + space is created. So just giving warning in the error file + should be enough. +*/ void wait_for_free_space(const char *filename, int errors) { - if (errors == 0) - my_error(EE_DISK_FULL,MYF(ME_BELL | ME_NOREFRESH), - filename,my_errno,MY_WAIT_FOR_USER_TO_FIX_PANIC); if (!(errors % MY_WAIT_GIVE_USER_A_MESSAGE)) - my_printf_error(EE_DISK_FULL, - "Retry in %d secs. Message reprinted in %d secs", - MYF(ME_BELL | ME_NOREFRESH), + { + my_printf_warning(EE(EE_DISK_FULL), + filename,my_errno,MY_WAIT_FOR_USER_TO_FIX_PANIC); + my_printf_warning("Retry in %d secs. Message reprinted in %d secs", MY_WAIT_FOR_USER_TO_FIX_PANIC, MY_WAIT_GIVE_USER_A_MESSAGE * MY_WAIT_FOR_USER_TO_FIX_PANIC ); + } + DBUG_EXECUTE_IF("simulate_file_write_error_once", + { + VOID(sleep(1)); + return; + }); VOID(sleep(MY_WAIT_FOR_USER_TO_FIX_PANIC)); } diff --git a/mysys/my_error.c b/mysys/my_error.c index 20d8438a712..5167598bfae 100644 --- a/mysys/my_error.c +++ b/mysys/my_error.c @@ -129,6 +129,28 @@ int my_printf_error(uint error, const char *format, myf MyFlags, ...) } /* + Warning as printf + + SYNOPSIS + my_printf_warning() + format> Format string + ...> variable list +*/ +void(*sql_print_warning_hook)(const char *format,...); +void my_printf_warning(const char *format, ...) +{ + va_list args; + char wbuff[ERRMSGSIZE]; + DBUG_ENTER("my_printf_warning"); + DBUG_PRINT("my", ("Format: %s", format)); + va_start(args,format); + (void) my_vsnprintf (wbuff, sizeof(wbuff), format, args); + va_end(args); + (*sql_print_warning_hook)(wbuff); + DBUG_VOID_RETURN; +} + +/* Give message using error_handler_hook SYNOPSIS diff --git a/mysys/my_write.c b/mysys/my_write.c index b545ab776b0..d0a59a605b6 100644 --- a/mysys/my_write.c +++ b/mysys/my_write.c @@ -36,6 +36,8 @@ size_t my_write(int Filedes, const uchar *Buffer, size_t Count, myf MyFlags) if (unlikely(!Count)) DBUG_RETURN(0); + DBUG_EXECUTE_IF ("simulate_file_write_error_once", + { DBUG_SET("+d,simulate_file_write_error");}); for (;;) { writenbytes= write(Filedes, Buffer, Count); @@ -69,6 +71,8 @@ size_t my_write(int Filedes, const uchar *Buffer, size_t Count, myf MyFlags) { wait_for_free_space(my_filename(Filedes), errors); errors++; + DBUG_EXECUTE_IF("simulate_file_write_error_once", + { DBUG_SET("-d,simulate_file_write_error");}); continue; } diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 12b52a87adc..3b43217dd2f 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -4375,6 +4375,7 @@ we force server id to 2, but this MySQL server will not act as a slave."); After this we can't quit by a simple unireg_abort */ error_handler_hook= my_message_sql; + sql_print_warning_hook = sql_print_warning; start_signal_handler(); // Creates pidfile if (mysql_rm_tmp_tables() || acl_init(opt_noacl) || |