Commit c7e85ef9 authored by monty@mysql.com's avatar monty@mysql.com

More debugging

Print position in normal log for Binlog dump
parent e9d9ca83
...@@ -227,14 +227,15 @@ static my_bool init_done = FALSE; /* Set to TRUE when initialization done */ ...@@ -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 { ...@@ -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) ...@@ -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))) ...@@ -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))) ...@@ -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))) ...@@ -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_) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 () ...@@ -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) ...@@ -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); ...@@ -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(); ...@@ -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(); ...@@ -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
......
...@@ -5941,8 +5941,14 @@ Field *make_field(char *ptr, uint32 field_length, ...@@ -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))
{
if (field_type == FIELD_TYPE_STRING ||
field_type == FIELD_TYPE_VAR_STRING)
return new Field_string(ptr,field_length,null_pos,null_bit, return new Field_string(ptr,field_length,null_pos,null_bit,
unireg_check, field_name, table, field_charset); 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),
......
...@@ -1703,6 +1703,8 @@ bool MYSQL_LOG::write(THD *thd,const char *query, uint query_length, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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;
DBUG_ENTER("wait_for_update");
old_msg= thd->enter_cond(&update_cond, &LOCK_log,
master_or_slave ? master_or_slave ?
"Has read all relay log; waiting for \ "Has read all relay log; waiting for the slave I/O "
the slave I/O thread to update it" : "thread to update it" :
"Has sent all binlog to slave; \ "Has sent all binlog to slave; waiting for binlog "
waiting for binlog to be updated"); "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() ...@@ -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) ...@@ -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, ...@@ -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: ...@@ -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, ...@@ -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, ...@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment