diff options
author | unknown <guilhem@gbichot4.local> | 2007-11-16 17:09:51 +0100 |
---|---|---|
committer | unknown <guilhem@gbichot4.local> | 2007-11-16 17:09:51 +0100 |
commit | fc0a25ec49f32fd292cb87c8a855e1569ccf8878 (patch) | |
tree | 123becbb97b9230e9b90a9b32b9b885ab9a7fd93 /storage/maria/ma_checkpoint.c | |
parent | ce2fbd9e9abdf37c0db07564c1f9d62d17f1315a (diff) | |
download | mariadb-git-fc0a25ec49f32fd292cb87c8a855e1569ccf8878.tar.gz |
WL#3071 Maria checkpoint, WL#3072 Maria recovery
instead of fprintf(stderr) when a task (with no user connected) gets
an error, use my_printf_error(). Flags ME_JUST_WARNING and ME_JUST_INFO
added to my_error()/my_printf_error(), which pass it to
my_message_sql() which is modified to call the appropriate
sql_print_*(). This way recovery can signal its start and end with
[Note] and not [ERROR] (but failure with [ERROR]).
Recovery's detailed progress (percents etc) still uses stderr as they
have to stay on one single line.
sql_print_error() changed to use my_progname_short (nicer display).
mysql-test-run.pl --gdb/--ddd does not run mysqld, because
a breakpoint in mysql_parse is too late to debug startup problems;
instead, dev should set the breakpoints it wants and then "run" ("r").
include/my_sys.h:
new flags to tell error_handler_hook that this is not an error
but an information or warning
mysql-test/mysql-test-run.pl:
when running with --gdb/--ddd to debug mysqld, breaking at mysql_parse
is too late to debug startup problems; now, it does not run mysqld,
does not set breakpoints, developer can set as early breakpoints
as it wants and is responsible for typing "run" (or "r")
mysys/my_init.c:
set my_progname_short
mysys/my_static.c:
my_progname_short added
sql/mysqld.cc:
* my_message_sql() can now receive info or warning, not only error;
this allows mysys to tell the user (or the error log if no user)
about an info or warning. Used from Maria.
* plugins (or engines like Maria) may want to call my_error(), so
set up the error handler hook (my_message_sql) before initializing
plugins; otherwise they get my_message_no_curses which is less
integrated into mysqld (is just fputs())
* using my_progname_short instead of my_progname, in my_message_sql()
(less space on screen)
storage/maria/ma_checkpoint.c:
fprintf(stderr) -> ma_message_no_user()
storage/maria/ma_checkpoint.h:
function for any Maria task, not connected to a user (example:
checkpoint, recovery; soon could be deleted records purger)
to report a message (calls my_printf_error() which, when inside ha_maria,
leads to sql_print_*(), and when outside, leads to
my_message_no_curses i.e. stderr).
storage/maria/ma_recovery.c:
To tell that recovery starts and ends we use ma_message_no_user()
(sql_print_*() in practice). Detailed progress info still uses
stderr as sql_print() cannot put several messages on one line.
071116 18:42:16 [Note] mysqld: Maria engine: starting recovery
recovered pages: 0% 67% 100% (0.0 seconds); transactions to roll back: 1 0 (0.0
seconds); tables to flush: 1 0 (0.0 seconds);
071116 18:42:16 [Note] mysqld: Maria engine: recovery done
storage/maria/maria_chk.c:
my_progname_short moved to mysys
storage/maria/maria_read_log.c:
my_progname_short moved to mysys
storage/myisam/myisamchk.c:
my_progname_short moved to mysys
Diffstat (limited to 'storage/maria/ma_checkpoint.c')
-rw-r--r-- | storage/maria/ma_checkpoint.c | 34 |
1 files changed, 16 insertions, 18 deletions
diff --git a/storage/maria/ma_checkpoint.c b/storage/maria/ma_checkpoint.c index c881e69b806..0aa545836ad 100644 --- a/storage/maria/ma_checkpoint.c +++ b/storage/maria/ma_checkpoint.c @@ -281,14 +281,14 @@ static int really_execute_checkpoint(void) */ #if 0 /* purging/keeping will be an option */ if (translog_purge(log_low_water_mark)) - fprintf(stderr, "Maria engine: log purge failed\n"); /* not deadly */ + ma_message_no_user(0, "log purging failed"); #endif goto end; err: error= 1; - fprintf(stderr, "Maria engine: checkpoint failed\n"); /* TODO: improve ;) */ + ma_message_no_user(0, "checkpoint failed"); /* we were possibly not able to determine what pages to flush */ pages_to_flush_before_next_checkpoint= 0; @@ -674,8 +674,7 @@ pthread_handler_t ma_checkpoint_background(void *arg) filter_flush_file_evenly, &filter_param); if (unlikely(res & PCFLUSH_ERROR)) - fprintf(stderr, "Maria engine: warning - background data page" - " flush failed\n"); + ma_message_no_user(0, "background data page flush failed"); if (filter_param.max_pages == 0) /* bunch all flushed, sleep */ break; /* and we will continue with the same file */ dfile++; /* otherwise all this file is flushed, move to next file */ @@ -696,8 +695,7 @@ pthread_handler_t ma_checkpoint_background(void *arg) filter_flush_file_evenly, &filter_param); if (unlikely(res & PCFLUSH_ERROR)) - fprintf(stderr, "Maria engine: warning - background index page" - " flush failed\n"); + ma_message_no_user(0, "background index page flush failed"); if (filter_param.max_pages == 0) /* bunch all flushed, sleep */ break; /* and we will continue with the same file */ kfile++; /* otherwise all this file is flushed, move to next file */ @@ -1148,18 +1146,18 @@ static int collect_tables(LEX_STRING *str, LSN checkpoint_start_log_horizon) flushed, as the REDOs about it will be skipped, it will wrongly not be recovered. If bitmap pages had a rec_lsn it would be different. */ - if (((filter_param.is_data_file= TRUE), - (flush_pagecache_blocks_with_filter(maria_pagecache, - &dfile, FLUSH_KEEP, - filter, &filter_param) & - PCFLUSH_ERROR)) || - ((filter_param.is_data_file= FALSE), - (flush_pagecache_blocks_with_filter(maria_pagecache, - &kfile, FLUSH_KEEP, - filter, &filter_param) & - PCFLUSH_ERROR))) - fprintf(stderr, "Maria engine: warning - checkpoint page flush" - " failed\n"); /** @todo improve */ + if ((filter_param.is_data_file= TRUE), + (flush_pagecache_blocks_with_filter(maria_pagecache, + &dfile, FLUSH_KEEP, + filter, &filter_param) & + PCFLUSH_ERROR)) + ma_message_no_user(0, "checkpoint data page flush failed"); + if ((filter_param.is_data_file= FALSE), + (flush_pagecache_blocks_with_filter(maria_pagecache, + &kfile, FLUSH_KEEP, + filter, &filter_param) & + PCFLUSH_ERROR)) + ma_message_no_user(0, "checkpoint index page flush failed"); /* fsyncs the fd, that's the loooong operation (e.g. max 150 fsync per second, so if you have touched 1000 files it's 7 seconds). |