mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
More debugging
Print position in normal log for Binlog dump
This commit is contained in:
56
dbug/dbug.c
56
dbug/dbug.c
@ -227,14 +227,15 @@ static my_bool init_done = FALSE; /* Set to TRUE when initialization done */
|
|||||||
static struct state *stack=0;
|
static struct state *stack=0;
|
||||||
|
|
||||||
typedef struct st_code_state {
|
typedef struct st_code_state {
|
||||||
int lineno; /* Current debugger output line number */
|
|
||||||
int level; /* Current function nesting level */
|
|
||||||
const char *func; /* Name of current user function */
|
const char *func; /* Name of current user function */
|
||||||
const char *file; /* Name of current user file */
|
const char *file; /* Name of current user file */
|
||||||
char **framep; /* Pointer to current frame */
|
char **framep; /* Pointer to current frame */
|
||||||
int jmplevel; /* Remember nesting level at setjmp () */
|
|
||||||
const char *jmpfunc; /* Remember current function for setjmp */
|
const char *jmpfunc; /* Remember current function for setjmp */
|
||||||
const char *jmpfile; /* Remember current file for setjmp */
|
const char *jmpfile; /* Remember current file for setjmp */
|
||||||
|
int lineno; /* Current debugger output line number */
|
||||||
|
int level; /* Current function nesting level */
|
||||||
|
int disable_output; /* Set to it if output is disabled */
|
||||||
|
int jmplevel; /* Remember nesting level at setjmp () */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The following variables are used to hold the state information
|
* The following variables are used to hold the state information
|
||||||
@ -247,8 +248,8 @@ typedef struct st_code_state {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
uint u_line; /* User source code line number */
|
uint u_line; /* User source code line number */
|
||||||
const char *u_keyword; /* Keyword for current macro */
|
|
||||||
int locked; /* If locked with _db_lock_file */
|
int locked; /* If locked with _db_lock_file */
|
||||||
|
const char *u_keyword; /* Keyword for current macro */
|
||||||
} CODE_STATE;
|
} CODE_STATE;
|
||||||
|
|
||||||
/* Parse a debug command string */
|
/* Parse a debug command string */
|
||||||
@ -370,8 +371,10 @@ static CODE_STATE *code_state(void)
|
|||||||
#define code_state() (&static_code_state)
|
#define code_state() (&static_code_state)
|
||||||
#define pthread_mutex_lock(A) {}
|
#define pthread_mutex_lock(A) {}
|
||||||
#define pthread_mutex_unlock(A) {}
|
#define pthread_mutex_unlock(A) {}
|
||||||
static CODE_STATE static_code_state = { 0,0,"?func","?file",NULL,0,NULL,
|
static CODE_STATE static_code_state=
|
||||||
NULL,0,"?",0};
|
{
|
||||||
|
"?func", "?file", NULL, NullS, NullS, 0,0,0,0,0,0, NullS
|
||||||
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@ -728,9 +731,12 @@ char ***_sframep_ __attribute__((unused)))
|
|||||||
if (DoProfile ())
|
if (DoProfile ())
|
||||||
{
|
{
|
||||||
long stackused;
|
long stackused;
|
||||||
if (*state->framep == NULL) {
|
if (*state->framep == NULL)
|
||||||
|
{
|
||||||
stackused = 0;
|
stackused = 0;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
stackused = ((long)(*state->framep)) - ((long)(state->framep));
|
stackused = ((long)(*state->framep)) - ((long)(state->framep));
|
||||||
stackused = stackused > 0 ? stackused : -stackused;
|
stackused = stackused > 0 ? stackused : -stackused;
|
||||||
}
|
}
|
||||||
@ -744,7 +750,7 @@ char ***_sframep_ __attribute__((unused)))
|
|||||||
(void) fflush (_db_pfp_);
|
(void) fflush (_db_pfp_);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (DoTrace (state))
|
if (DoTrace(state))
|
||||||
{
|
{
|
||||||
if (!state->locked)
|
if (!state->locked)
|
||||||
pthread_mutex_lock(&THR_LOCK_dbug);
|
pthread_mutex_lock(&THR_LOCK_dbug);
|
||||||
@ -754,7 +760,7 @@ char ***_sframep_ __attribute__((unused)))
|
|||||||
dbug_flush (state); /* This does a unlock */
|
dbug_flush (state); /* This does a unlock */
|
||||||
}
|
}
|
||||||
#ifdef SAFEMALLOC
|
#ifdef SAFEMALLOC
|
||||||
if (stack -> flags & SANITY_CHECK_ON)
|
if (stack->flags & SANITY_CHECK_ON && !state->disable_output)
|
||||||
if (_sanity(_file_,_line_)) /* Check of safemalloc */
|
if (_sanity(_file_,_line_)) /* Check of safemalloc */
|
||||||
stack -> flags &= ~SANITY_CHECK_ON;
|
stack -> flags &= ~SANITY_CHECK_ON;
|
||||||
#endif
|
#endif
|
||||||
@ -809,9 +815,11 @@ uint *_slevel_)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
#ifdef SAFEMALLOC
|
#ifdef SAFEMALLOC
|
||||||
if (stack -> flags & SANITY_CHECK_ON)
|
if (stack->flags & SANITY_CHECK_ON && !state->disable_output)
|
||||||
|
{
|
||||||
if (_sanity(*_sfile_,_line_))
|
if (_sanity(*_sfile_,_line_))
|
||||||
stack->flags &= ~SANITY_CHECK_ON;
|
stack->flags &= ~SANITY_CHECK_ON;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifndef THREAD
|
#ifndef THREAD
|
||||||
if (DoProfile ())
|
if (DoProfile ())
|
||||||
@ -954,7 +962,6 @@ uint length)
|
|||||||
int pos;
|
int pos;
|
||||||
char dbuff[90];
|
char dbuff[90];
|
||||||
CODE_STATE *state;
|
CODE_STATE *state;
|
||||||
/* Sasha: pre-my_thread_init() safety */
|
|
||||||
if (!(state=code_state()))
|
if (!(state=code_state()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -994,6 +1001,25 @@ uint length)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Enable/Disable output for this thread
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
_db_output_()
|
||||||
|
flag 1 = enable output, 0 = disable_output
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
void _db_output_(uint flag)
|
||||||
|
{
|
||||||
|
CODE_STATE *state;
|
||||||
|
if (!(state=code_state()))
|
||||||
|
return;
|
||||||
|
state->disable_output= !flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FUNCTION
|
* FUNCTION
|
||||||
*
|
*
|
||||||
@ -1159,7 +1185,7 @@ static BOOLEAN DoTrace (CODE_STATE *state)
|
|||||||
{
|
{
|
||||||
reg2 BOOLEAN trace=FALSE;
|
reg2 BOOLEAN trace=FALSE;
|
||||||
|
|
||||||
if (TRACING &&
|
if (TRACING && !state->disable_output &&
|
||||||
state->level <= stack -> maxdepth &&
|
state->level <= stack -> maxdepth &&
|
||||||
InList (stack -> functions, state->func) &&
|
InList (stack -> functions, state->func) &&
|
||||||
InList (stack -> processes, _db_process_))
|
InList (stack -> processes, _db_process_))
|
||||||
@ -1195,7 +1221,7 @@ static BOOLEAN DoProfile ()
|
|||||||
state=code_state();
|
state=code_state();
|
||||||
|
|
||||||
profile = FALSE;
|
profile = FALSE;
|
||||||
if (PROFILING &&
|
if (PROFILING && !state->disable_output &&
|
||||||
state->level <= stack -> maxdepth &&
|
state->level <= stack -> maxdepth &&
|
||||||
InList (stack -> p_functions, state->func) &&
|
InList (stack -> p_functions, state->func) &&
|
||||||
InList (stack -> processes, _db_process_))
|
InList (stack -> processes, _db_process_))
|
||||||
@ -1242,7 +1268,7 @@ const char *keyword)
|
|||||||
if (!(state=code_state()))
|
if (!(state=code_state()))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
result = FALSE;
|
result = FALSE;
|
||||||
if (DEBUGGING &&
|
if (DEBUGGING && !state->disable_output &&
|
||||||
state->level <= stack -> maxdepth &&
|
state->level <= stack -> maxdepth &&
|
||||||
InList (stack -> functions, state->func) &&
|
InList (stack -> functions, state->func) &&
|
||||||
InList (stack -> keywords, keyword) &&
|
InList (stack -> keywords, keyword) &&
|
||||||
|
@ -38,6 +38,7 @@ extern void _db_pargs_(uint _line_,const char *keyword);
|
|||||||
extern void _db_doprnt_ _VARARGS((const char *format,...));
|
extern void _db_doprnt_ _VARARGS((const char *format,...));
|
||||||
extern void _db_dump_(uint _line_,const char *keyword,const char *memory,
|
extern void _db_dump_(uint _line_,const char *keyword,const char *memory,
|
||||||
uint length);
|
uint length);
|
||||||
|
extern void _db_output_();
|
||||||
extern void _db_lock_file();
|
extern void _db_lock_file();
|
||||||
extern void _db_unlock_file();
|
extern void _db_unlock_file();
|
||||||
|
|
||||||
@ -66,6 +67,7 @@ extern void _db_unlock_file();
|
|||||||
#define DEBUGGER_ON _no_db_=0
|
#define DEBUGGER_ON _no_db_=0
|
||||||
#define DBUG_LOCK_FILE { _db_lock_file(); }
|
#define DBUG_LOCK_FILE { _db_lock_file(); }
|
||||||
#define DBUG_UNLOCK_FILE { _db_unlock_file(); }
|
#define DBUG_UNLOCK_FILE { _db_unlock_file(); }
|
||||||
|
#define DBUG_OUTPUT(A) { _db_output_(A); }
|
||||||
#define DBUG_ASSERT(A) assert(A)
|
#define DBUG_ASSERT(A) assert(A)
|
||||||
#else /* No debugger */
|
#else /* No debugger */
|
||||||
|
|
||||||
@ -86,6 +88,7 @@ extern void _db_unlock_file();
|
|||||||
#define DEBUGGER_ON
|
#define DEBUGGER_ON
|
||||||
#define DBUG_LOCK_FILE
|
#define DBUG_LOCK_FILE
|
||||||
#define DBUG_UNLOCK_FILE
|
#define DBUG_UNLOCK_FILE
|
||||||
|
#define DBUG_OUTPUT(A)
|
||||||
#define DBUG_ASSERT(A) {}
|
#define DBUG_ASSERT(A) {}
|
||||||
#endif
|
#endif
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
10
sql/field.cc
10
sql/field.cc
@ -5941,8 +5941,14 @@ Field *make_field(char *ptr, uint32 field_length,
|
|||||||
if (f_is_alpha(pack_flag))
|
if (f_is_alpha(pack_flag))
|
||||||
{
|
{
|
||||||
if (!f_is_packed(pack_flag))
|
if (!f_is_packed(pack_flag))
|
||||||
return new Field_string(ptr,field_length,null_pos,null_bit,
|
{
|
||||||
unireg_check, field_name, table, field_charset);
|
if (field_type == FIELD_TYPE_STRING ||
|
||||||
|
field_type == FIELD_TYPE_VAR_STRING)
|
||||||
|
return new Field_string(ptr,field_length,null_pos,null_bit,
|
||||||
|
unireg_check, field_name, table,
|
||||||
|
field_charset);
|
||||||
|
return 0; // Error
|
||||||
|
}
|
||||||
|
|
||||||
uint pack_length=calc_pack_length((enum_field_types)
|
uint pack_length=calc_pack_length((enum_field_types)
|
||||||
f_packtype(pack_flag),
|
f_packtype(pack_flag),
|
||||||
|
32
sql/log.cc
32
sql/log.cc
@ -1703,6 +1703,8 @@ bool MYSQL_LOG::write(THD *thd,const char *query, uint query_length,
|
|||||||
time_t current_time;
|
time_t current_time;
|
||||||
if (!is_open())
|
if (!is_open())
|
||||||
return 0;
|
return 0;
|
||||||
|
DBUG_ENTER("MYSQL_LOG::write");
|
||||||
|
|
||||||
VOID(pthread_mutex_lock(&LOCK_log));
|
VOID(pthread_mutex_lock(&LOCK_log));
|
||||||
if (is_open())
|
if (is_open())
|
||||||
{ // Safety agains reopen
|
{ // Safety agains reopen
|
||||||
@ -1712,7 +1714,7 @@ bool MYSQL_LOG::write(THD *thd,const char *query, uint query_length,
|
|||||||
if (!(thd->options & OPTION_UPDATE_LOG))
|
if (!(thd->options & OPTION_UPDATE_LOG))
|
||||||
{
|
{
|
||||||
VOID(pthread_mutex_unlock(&LOCK_log));
|
VOID(pthread_mutex_unlock(&LOCK_log));
|
||||||
return 0;
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
if (!(specialflag & SPECIAL_SHORT_LOG_FORMAT) || query_start_arg)
|
if (!(specialflag & SPECIAL_SHORT_LOG_FORMAT) || query_start_arg)
|
||||||
{
|
{
|
||||||
@ -1812,7 +1814,7 @@ bool MYSQL_LOG::write(THD *thd,const char *query, uint query_length,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
VOID(pthread_mutex_unlock(&LOCK_log));
|
VOID(pthread_mutex_unlock(&LOCK_log));
|
||||||
return error;
|
DBUG_RETURN(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1832,16 +1834,19 @@ bool MYSQL_LOG::write(THD *thd,const char *query, uint query_length,
|
|||||||
THD::enter_cond() (see NOTES in sql_class.h).
|
THD::enter_cond() (see NOTES in sql_class.h).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void MYSQL_LOG:: wait_for_update(THD* thd, bool master_or_slave)
|
void MYSQL_LOG::wait_for_update(THD* thd, bool master_or_slave)
|
||||||
{
|
{
|
||||||
const char* old_msg = thd->enter_cond(&update_cond, &LOCK_log,
|
const char *old_msg;
|
||||||
master_or_slave ?
|
DBUG_ENTER("wait_for_update");
|
||||||
"Has read all relay log; waiting for \
|
old_msg= thd->enter_cond(&update_cond, &LOCK_log,
|
||||||
the slave I/O thread to update it" :
|
master_or_slave ?
|
||||||
"Has sent all binlog to slave; \
|
"Has read all relay log; waiting for the slave I/O "
|
||||||
waiting for binlog to be updated");
|
"thread to update it" :
|
||||||
|
"Has sent all binlog to slave; waiting for binlog "
|
||||||
|
"to be updated");
|
||||||
pthread_cond_wait(&update_cond, &LOCK_log);
|
pthread_cond_wait(&update_cond, &LOCK_log);
|
||||||
thd->exit_cond(old_msg);
|
thd->exit_cond(old_msg);
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2198,6 +2203,15 @@ void MYSQL_LOG::report_pos_in_innodb()
|
|||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MYSQL_LOG::signal_update()
|
||||||
|
{
|
||||||
|
DBUG_ENTER("MYSQL_LOG::signal_update");
|
||||||
|
pthread_cond_broadcast(&update_cond);
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef __NT__
|
#ifdef __NT__
|
||||||
void print_buffer_to_nt_eventlog(enum loglevel level, char *buff,
|
void print_buffer_to_nt_eventlog(enum loglevel level, char *buff,
|
||||||
uint length, int buffLen)
|
uint length, int buffLen)
|
||||||
|
@ -540,7 +540,7 @@ static void close_connections(void)
|
|||||||
struct timespec abstime;
|
struct timespec abstime;
|
||||||
int error;
|
int error;
|
||||||
LINT_INIT(error);
|
LINT_INIT(error);
|
||||||
DBUG_PRINT("info",("Waiting for select_thread"));
|
DBUG_PRINT("info",("Waiting for select thread"));
|
||||||
|
|
||||||
#ifndef DONT_USE_THR_ALARM
|
#ifndef DONT_USE_THR_ALARM
|
||||||
if (pthread_kill(select_thread,THR_CLIENT_ALARM))
|
if (pthread_kill(select_thread,THR_CLIENT_ALARM))
|
||||||
|
@ -2632,7 +2632,7 @@ static int request_dump(MYSQL* mysql, MASTER_INFO* mi,
|
|||||||
DBUG_ENTER("request_dump");
|
DBUG_ENTER("request_dump");
|
||||||
|
|
||||||
// TODO if big log files: Change next to int8store()
|
// TODO if big log files: Change next to int8store()
|
||||||
int4store(buf, (longlong) mi->master_log_pos);
|
int4store(buf, (ulong) mi->master_log_pos);
|
||||||
int2store(buf + 4, binlog_flags);
|
int2store(buf + 4, binlog_flags);
|
||||||
int4store(buf + 6, server_id);
|
int4store(buf + 6, server_id);
|
||||||
len = (uint) strlen(logname);
|
len = (uint) strlen(logname);
|
||||||
|
@ -131,7 +131,7 @@ public:
|
|||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
void set_max_size(ulong max_size_arg);
|
void set_max_size(ulong max_size_arg);
|
||||||
void signal_update() { pthread_cond_broadcast(&update_cond);}
|
void signal_update();
|
||||||
void wait_for_update(THD* thd, bool master_or_slave);
|
void wait_for_update(THD* thd, bool master_or_slave);
|
||||||
void set_need_start_event() { need_start_event = 1; }
|
void set_need_start_event() { need_start_event = 1; }
|
||||||
void init(enum_log_type log_type_arg,
|
void init(enum_log_type log_type_arg,
|
||||||
|
@ -1610,15 +1610,15 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||||||
#ifndef EMBEDDED_LIBRARY
|
#ifndef EMBEDDED_LIBRARY
|
||||||
case COM_BINLOG_DUMP:
|
case COM_BINLOG_DUMP:
|
||||||
{
|
{
|
||||||
|
ulong pos;
|
||||||
|
ushort flags;
|
||||||
|
uint32 slave_server_id;
|
||||||
|
|
||||||
statistic_increment(com_other,&LOCK_status);
|
statistic_increment(com_other,&LOCK_status);
|
||||||
thd->slow_command = TRUE;
|
thd->slow_command = TRUE;
|
||||||
if (check_global_access(thd, REPL_SLAVE_ACL))
|
if (check_global_access(thd, REPL_SLAVE_ACL))
|
||||||
break;
|
break;
|
||||||
mysql_log.write(thd,command, 0);
|
|
||||||
|
|
||||||
ulong pos;
|
|
||||||
ushort flags;
|
|
||||||
uint32 slave_server_id;
|
|
||||||
/* TODO: The following has to be changed to an 8 byte integer */
|
/* TODO: The following has to be changed to an 8 byte integer */
|
||||||
pos = uint4korr(packet);
|
pos = uint4korr(packet);
|
||||||
flags = uint2korr(packet + 4);
|
flags = uint2korr(packet + 4);
|
||||||
@ -1626,6 +1626,9 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||||||
if ((slave_server_id= uint4korr(packet+6))) // mysqlbinlog.server_id==0
|
if ((slave_server_id= uint4korr(packet+6))) // mysqlbinlog.server_id==0
|
||||||
kill_zombie_dump_threads(slave_server_id);
|
kill_zombie_dump_threads(slave_server_id);
|
||||||
thd->server_id = slave_server_id;
|
thd->server_id = slave_server_id;
|
||||||
|
|
||||||
|
mysql_log.write(thd, command, "Log: '%s' Pos: %ld", packet+10,
|
||||||
|
(long) pos);
|
||||||
mysql_binlog_send(thd, thd->strdup(packet + 10), (my_off_t) pos, flags);
|
mysql_binlog_send(thd, thd->strdup(packet + 10), (my_off_t) pos, flags);
|
||||||
unregister_slave(thd,1,1);
|
unregister_slave(thd,1,1);
|
||||||
// fake COM_QUIT -- if we get here, the thread needs to terminate
|
// fake COM_QUIT -- if we get here, the thread needs to terminate
|
||||||
|
Reference in New Issue
Block a user