mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 20:12:31 +01:00
fc0a25ec49
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
92 lines
3.3 KiB
C
92 lines
3.3 KiB
C
/* Copyright (C) 2006,2007 MySQL AB
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; version 2 of the License.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
|
|
|
/*
|
|
WL#3071 Maria checkpoint
|
|
First version written by Guilhem Bichot on 2006-04-27.
|
|
Does not compile yet.
|
|
*/
|
|
|
|
/* This is the interface of this module. */
|
|
|
|
typedef enum enum_ma_checkpoint_level {
|
|
CHECKPOINT_NONE= 0,
|
|
/* just write dirty_pages, transactions table and sync files */
|
|
CHECKPOINT_INDIRECT,
|
|
/* also flush all dirty pages which were already dirty at prev checkpoint */
|
|
CHECKPOINT_MEDIUM,
|
|
/* also flush all dirty pages */
|
|
CHECKPOINT_FULL
|
|
} CHECKPOINT_LEVEL;
|
|
|
|
C_MODE_START
|
|
int ma_checkpoint_init(ulong interval);
|
|
void ma_checkpoint_end(void);
|
|
int ma_checkpoint_execute(CHECKPOINT_LEVEL level, my_bool no_wait);
|
|
C_MODE_END
|
|
|
|
/**
|
|
@brief reads some LSNs with special trickery
|
|
|
|
If a 64-bit variable transitions between both halves being zero to both
|
|
halves being non-zero, and back, this function can be used to do a read of
|
|
it (without mutex, without atomic load) which always produces a correct
|
|
(though maybe slightly old) value (even on 32-bit CPUs). The value is at
|
|
least as new as the latest mutex unlock done by the calling thread.
|
|
The assumption is that the system sets both 4-byte halves either at the
|
|
same time, or one after the other (in any order), but NOT some bytes of the
|
|
first half then some bytes of the second half then the rest of bytes of the
|
|
first half. With this assumption, the function can detect when it is
|
|
seeing an inconsistent value.
|
|
|
|
@param LSN pointer to the LSN variable to read
|
|
|
|
@return LSN part (most significant byte always 0)
|
|
*/
|
|
#if ( SIZEOF_CHARP >= 8 )
|
|
/* 64-bit CPU, 64-bit reads are atomic */
|
|
#define lsn_read_non_atomic LSN_WITH_FLAGS_TO_LSN
|
|
#else
|
|
static inline LSN lsn_read_non_atomic_32(const volatile LSN *x)
|
|
{
|
|
/*
|
|
32-bit CPU, 64-bit reads may give a mixed of old half and new half (old
|
|
low bits and new high bits, or the contrary).
|
|
*/
|
|
for (;;) /* loop until no atomicity problems */
|
|
{
|
|
/*
|
|
Remove most significant byte in case this is a LSN_WITH_FLAGS object.
|
|
Those flags in TRN::first_undo_lsn break the condition on transitions so
|
|
they must be removed below.
|
|
*/
|
|
LSN y= LSN_WITH_FLAGS_TO_LSN(*x);
|
|
if (likely((y == LSN_IMPOSSIBLE) || LSN_VALID(y)))
|
|
return y;
|
|
}
|
|
}
|
|
#define lsn_read_non_atomic(x) lsn_read_non_atomic_32(&x)
|
|
#endif
|
|
|
|
/**
|
|
prints a message from a task not connected to any user (checkpoint
|
|
and recovery for example).
|
|
|
|
@param level 0 if error, ME_JUST_WARNING if warning,
|
|
ME_JUST_INFO if info
|
|
@param sentence text to write
|
|
*/
|
|
#define ma_message_no_user(level, sentence) \
|
|
my_printf_error(HA_ERR_GENERIC, "Maria engine: %s", MYF(level), sentence)
|