diff options
Diffstat (limited to 'sql/log.cc')
-rw-r--r-- | sql/log.cc | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/sql/log.cc b/sql/log.cc index 4cd93261973..40e5d5673be 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -81,7 +81,7 @@ static int find_uniq_filename(char *name) MYSQL_LOG::MYSQL_LOG(): last_time(0), query_start(0),index_file(-1), name(0), log_type(LOG_CLOSED),write_error(0), - inited(0), no_rotate(0) + inited(0), log_seq(1), no_rotate(0) { /* We don't want to intialize LOCK_Log here as the thread system may @@ -230,8 +230,11 @@ void MYSQL_LOG::open(const char *log_name, enum_log_type log_type_arg, if ((do_magic && my_b_write(&log_file, (byte*) BINLOG_MAGIC, 4)) || open_index(O_APPEND | O_RDWR | O_CREAT)) goto err; + + log_seq = 1; Start_log_event s; bool error; + s.set_log_seq(0, this); s.write(&log_file); flush_io_cache(&log_file); pthread_mutex_lock(&LOCK_index); @@ -531,6 +534,14 @@ void MYSQL_LOG::new_file() to change base names at some point. */ Rotate_log_event r(new_name+dirname_length(new_name)); + THD* thd = current_thd; + r.set_log_seq(0, this); + // this log rotation could have been initiated by a master of + // the slave running with log-bin + // we set the flag on rotate event to prevent inifinite log rotation + // loop + if(thd && slave_thd && thd == slave_thd) + r.flags |= LOG_EVENT_FORCED_ROTATE_F; r.write(&log_file); VOID(pthread_cond_broadcast(&COND_binlog_update)); } @@ -626,6 +637,21 @@ bool MYSQL_LOG::write(THD *thd,enum enum_server_command command, /* 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) { /* In most cases this is only called if 'is_open()' is true */ @@ -638,8 +664,12 @@ bool MYSQL_LOG::write(Query_log_event* event_info) if (is_open()) { THD *thd=event_info->thd; +#ifdef USING_TRANSACTIONS IO_CACHE *file = (event_info->cache_stmt ? &thd->transaction.trans_log : &log_file); +#else + IO_CACHE *file = &log_file; +#endif if ((!(thd->options & OPTION_BIN_LOG) && (thd->master_access & PROCESS_ACL)) || !db_ok(event_info->db, binlog_do_db, binlog_ignore_db)) @@ -652,12 +682,18 @@ bool MYSQL_LOG::write(Query_log_event* event_info) if (thd->last_insert_id_used) { Intvar_log_event e((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) { Intvar_log_event e((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; } @@ -670,10 +706,12 @@ bool MYSQL_LOG::write(Query_log_event* event_info) // just in case somebody wants it later thd->query_length = (uint)(p - buf); Query_log_event e(thd, buf); + e.set_log_seq(thd, this); if (e.write(file)) goto err; thd->query_length = save_query_length; // clean up } + event_info->set_log_seq(thd, this); if (event_info->write(file) || file == &log_file && flush_io_cache(file)) goto err; @@ -768,6 +806,7 @@ bool MYSQL_LOG::write(Load_log_event* event_info) 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) @@ -919,6 +958,7 @@ void MYSQL_LOG::close(bool exiting) if (log_type == LOG_BIN) { Stop_log_event s; + s.set_log_seq(0, this); s.write(&log_file); VOID(pthread_cond_broadcast(&COND_binlog_update)); } |