mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
LOAD DATA INFILE is now replicated properly, except for cleanup on
Stop event and bugs the test suite could not catch Did some big restructuring of binlog event classes - most important change is that now each event class has exec_event method and one does not need to modify slave core code to add a new event. Slave code is now much smaller and easier to read include/my_sys.h: pre_code and arg in IO_CACHE mysql-test/r/rpl_log.result: updated result for LOAD DATA INFILE fix mysys/mf_iocache.c: pre_close routine and arg pointer for callback magic sql/log.cc: changed MYSQL_LOG so that write() method is for generic Log_event - removed redundant code sql/log_event.cc: added classes for file events added exec_event() method to all classes restructured/cleaned up event classes sql/log_event.h: added classes for file events added exec_event() method to all classes restructured/cleaned up event classes sql/mf_iocache.cc: pre_close/arg sql/mysqld.cc: added slave-load-tmpdir and old-rpl-compat options sql/slave.cc: changed exec_event() to use Log_event::exec_event() some routines are now needed in log_event.cc and cannot be static/inline general cleanup sql/slave.h: some routines are now extern because they are called from log_event.cc sql/sql_class.cc: added slave_net sql/sql_class.h: added slave_net to THD MYSQL_LOG::write now handles generic Log_event sql/sql_load.cc: changes for new handling of LOAD DATA INFILE replication sql/sql_repl.cc: added log_loaded_block() callback for IO_CACHE sql/sql_repl.h: added structure to pass args to IO_CACHE callback from mysql_load
This commit is contained in:
74
sql/log.cc
74
sql/log.cc
@ -535,8 +535,8 @@ void MYSQL_LOG::new_file(bool inside_mutex)
|
||||
We log the whole file name for log file as the user may decide
|
||||
to change base names at some point.
|
||||
*/
|
||||
Rotate_log_event r(new_name+dirname_length(new_name));
|
||||
THD* thd = current_thd;
|
||||
Rotate_log_event r(thd,new_name+dirname_length(new_name));
|
||||
r.set_log_seq(0, this);
|
||||
// this log rotation could have been initiated by a master of
|
||||
// the slave running with log-bin
|
||||
@ -638,24 +638,8 @@ bool MYSQL_LOG::write(THD *thd,enum enum_server_command command,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Write to binary log in a format to be used for replication */
|
||||
|
||||
bool MYSQL_LOG::write(Slave_log_event* event_info)
|
||||
{
|
||||
bool error;
|
||||
if (!inited) // Can't use mutex if not init
|
||||
return 0;
|
||||
VOID(pthread_mutex_lock(&LOCK_log));
|
||||
if(!event_info->log_seq)
|
||||
event_info->set_log_seq(current_thd, this);
|
||||
error = event_info->write(&log_file);
|
||||
flush_io_cache(&log_file);
|
||||
VOID(pthread_mutex_unlock(&LOCK_log));
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
bool MYSQL_LOG::write(Query_log_event* event_info)
|
||||
bool MYSQL_LOG::write(Log_event* event_info)
|
||||
{
|
||||
/* In most cases this is only called if 'is_open()' is true */
|
||||
bool error=0;
|
||||
@ -667,40 +651,42 @@ bool MYSQL_LOG::write(Query_log_event* event_info)
|
||||
if (is_open())
|
||||
{
|
||||
THD *thd=event_info->thd;
|
||||
const char* db = event_info->get_db();
|
||||
#ifdef USING_TRANSACTIONS
|
||||
IO_CACHE *file = (event_info->cache_stmt ? &thd->transaction.trans_log :
|
||||
IO_CACHE *file = ((event_info->cache_stmt && thd) ?
|
||||
&thd->transaction.trans_log :
|
||||
&log_file);
|
||||
#else
|
||||
IO_CACHE *file = &log_file;
|
||||
#endif
|
||||
if ((!(thd->options & OPTION_BIN_LOG) &&
|
||||
if ((thd && !(thd->options & OPTION_BIN_LOG) &&
|
||||
(thd->master_access & PROCESS_ACL)) ||
|
||||
!db_ok(event_info->db, binlog_do_db, binlog_ignore_db))
|
||||
(db && !db_ok(db, binlog_do_db, binlog_ignore_db)))
|
||||
{
|
||||
VOID(pthread_mutex_unlock(&LOCK_log));
|
||||
return 0;
|
||||
}
|
||||
error=1;
|
||||
|
||||
if (thd->last_insert_id_used)
|
||||
if (thd && thd->last_insert_id_used)
|
||||
{
|
||||
Intvar_log_event e((uchar)LAST_INSERT_ID_EVENT, thd->last_insert_id);
|
||||
Intvar_log_event e(thd,(uchar)LAST_INSERT_ID_EVENT,thd->last_insert_id);
|
||||
e.set_log_seq(thd, this);
|
||||
if (thd->server_id)
|
||||
e.server_id = thd->server_id;
|
||||
if (e.write(file))
|
||||
goto err;
|
||||
}
|
||||
if (thd->insert_id_used)
|
||||
if (thd && thd->insert_id_used)
|
||||
{
|
||||
Intvar_log_event e((uchar)INSERT_ID_EVENT, thd->last_insert_id);
|
||||
Intvar_log_event e(thd,(uchar)INSERT_ID_EVENT,thd->last_insert_id);
|
||||
e.set_log_seq(thd, this);
|
||||
if (thd->server_id)
|
||||
e.server_id = thd->server_id;
|
||||
if (e.write(file))
|
||||
goto err;
|
||||
}
|
||||
if (thd->convert_set)
|
||||
if (thd && thd->convert_set)
|
||||
{
|
||||
char buf[1024] = "SET CHARACTER SET ";
|
||||
char* p = strend(buf);
|
||||
@ -795,42 +781,6 @@ err:
|
||||
}
|
||||
|
||||
|
||||
bool MYSQL_LOG::write(Load_log_event* event_info)
|
||||
{
|
||||
bool error=0;
|
||||
bool should_rotate = 0;
|
||||
|
||||
if (inited)
|
||||
{
|
||||
VOID(pthread_mutex_lock(&LOCK_log));
|
||||
if (is_open())
|
||||
{
|
||||
THD *thd=event_info->thd;
|
||||
if ((thd->options & OPTION_BIN_LOG) ||
|
||||
!(thd->master_access & PROCESS_ACL))
|
||||
{
|
||||
event_info->set_log_seq(thd, this);
|
||||
if (event_info->write(&log_file) || flush_io_cache(&log_file))
|
||||
{
|
||||
if (!write_error)
|
||||
sql_print_error(ER(ER_ERROR_ON_WRITE), name, errno);
|
||||
error=write_error=1;
|
||||
}
|
||||
should_rotate = (my_b_tell(&log_file) >= max_binlog_size);
|
||||
VOID(pthread_cond_broadcast(&COND_binlog_update));
|
||||
}
|
||||
}
|
||||
|
||||
if(should_rotate)
|
||||
new_file(1); // inside mutex
|
||||
|
||||
VOID(pthread_mutex_unlock(&LOCK_log));
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
/* Write update log in a format suitable for incremental backup */
|
||||
|
||||
bool MYSQL_LOG::write(THD *thd,const char *query, uint query_length,
|
||||
|
Reference in New Issue
Block a user