summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/my_sys.h2
-rw-r--r--mysys/errors.c24
-rw-r--r--mysys/my_error.c22
-rw-r--r--mysys/my_write.c4
-rw-r--r--sql/mysqld.cc1
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) ||