Merge gbichot@213.136.52.20:/home/bk/mysql-4.0
into mysql.com:/home/mysql_src/mysql-4.0
This commit is contained in:
commit
c126f4fa44
@ -2000,11 +2000,8 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
|
|||||||
|
|
||||||
IMPLEMENTATION
|
IMPLEMENTATION
|
||||||
- To handle the case where the master died without a stop event,
|
- To handle the case where the master died without a stop event,
|
||||||
we clean up all temporary tables + locks that we got.
|
we clean up all temporary tables that we got, if we are sure we
|
||||||
However, we don't clean temporary tables if the master was 3.23
|
can (see below).
|
||||||
(this is because a 3.23 master writes a Start_log_event at every
|
|
||||||
binlog rotation; if we were not careful we would remove temp tables
|
|
||||||
on the slave when FLUSH LOGS is issued on the master).
|
|
||||||
|
|
||||||
TODO
|
TODO
|
||||||
- Remove all active user locks
|
- Remove all active user locks
|
||||||
@ -2015,18 +2012,37 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
|
|||||||
|
|
||||||
int Start_log_event::exec_event(struct st_relay_log_info* rli)
|
int Start_log_event::exec_event(struct st_relay_log_info* rli)
|
||||||
{
|
{
|
||||||
if (!rli->mi->old_format)
|
|
||||||
{
|
switch (rli->mi->old_format) {
|
||||||
|
case BINLOG_FORMAT_CURRENT :
|
||||||
/*
|
/*
|
||||||
If 4.0 master, all temporary tables have been deleted on the master;
|
This is 4.x, so a Start_log_event is only at master startup,
|
||||||
if 3.23 master, this is far from sure.
|
so we are sure the master has restarted and cleared his temp tables.
|
||||||
*/
|
*/
|
||||||
close_temporary_tables(thd);
|
close_temporary_tables(thd);
|
||||||
/*
|
|
||||||
If we have old format, load_tmpdir is cleaned up by the I/O thread
|
|
||||||
*/
|
|
||||||
cleanup_load_tmpdir();
|
cleanup_load_tmpdir();
|
||||||
|
break;
|
||||||
|
/*
|
||||||
|
Now the older formats; in that case load_tmpdir is cleaned up by the I/O
|
||||||
|
thread.
|
||||||
|
*/
|
||||||
|
case BINLOG_FORMAT_323_LESS_57 :
|
||||||
|
/*
|
||||||
|
Cannot distinguish a Start_log_event generated at master startup and
|
||||||
|
one generated by master FLUSH LOGS, so cannot be sure temp tables
|
||||||
|
have to be dropped. So do nothing.
|
||||||
|
*/
|
||||||
|
break;
|
||||||
|
case BINLOG_FORMAT_323_GEQ_57 :
|
||||||
|
/* Can distinguish, based on the value of 'created' */
|
||||||
|
if (created) /* this was generated at master startup*/
|
||||||
|
close_temporary_tables(thd);
|
||||||
|
break;
|
||||||
|
default :
|
||||||
|
/* this case is impossible */
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Log_event::exec_event(rli);
|
return Log_event::exec_event(rli);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
20
sql/slave.cc
20
sql/slave.cc
@ -962,13 +962,19 @@ static int check_master_version(MYSQL* mysql, MASTER_INFO* mi)
|
|||||||
{
|
{
|
||||||
const char* errmsg= 0;
|
const char* errmsg= 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Note the following switch will bug when we have MySQL branch 30 ;)
|
||||||
|
*/
|
||||||
switch (*mysql->server_version) {
|
switch (*mysql->server_version) {
|
||||||
case '3':
|
case '3':
|
||||||
mi->old_format = 1;
|
mi->old_format =
|
||||||
|
(strncmp(mysql->server_version, "3.23.57", 7) < 0) /* < .57 */ ?
|
||||||
|
BINLOG_FORMAT_323_LESS_57 :
|
||||||
|
BINLOG_FORMAT_323_GEQ_57 ;
|
||||||
break;
|
break;
|
||||||
case '4':
|
case '4':
|
||||||
case '5':
|
case '5':
|
||||||
mi->old_format = 0;
|
mi->old_format = BINLOG_FORMAT_CURRENT;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
errmsg = "Master reported unrecognized MySQL version";
|
errmsg = "Master reported unrecognized MySQL version";
|
||||||
@ -1204,6 +1210,16 @@ int init_relay_log_info(RELAY_LOG_INFO* rli, const char* info_fname)
|
|||||||
Read_Master_Log_Pos: 9744 -rw-rw---- 1 guilhem qq 8192 Jun 5 16:27 gbichot2-relay-bin.002
|
Read_Master_Log_Pos: 9744 -rw-rw---- 1 guilhem qq 8192 Jun 5 16:27 gbichot2-relay-bin.002
|
||||||
|
|
||||||
See how 4 is less than 7811 and 8192 is less than 9744.
|
See how 4 is less than 7811 and 8192 is less than 9744.
|
||||||
|
|
||||||
|
WARNING: this is risky because the slave can stay like this for a long time;
|
||||||
|
then if it has a power failure, master.info says the I/O thread has read
|
||||||
|
until 9744 while the relay-log contains only until 8192 (the in-memory part
|
||||||
|
from 8192 to 9744 has been lost), so the SQL slave thread will miss some
|
||||||
|
events, silently breaking replication.
|
||||||
|
Ideally we would like to flush master.info only when we know that the relay
|
||||||
|
log has no in-memory tail.
|
||||||
|
Note that the above problem may arise only when only the IO thread is
|
||||||
|
started, which is unlikely.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (open_log(&rli->relay_log, glob_hostname, opt_relay_logname,
|
if (open_log(&rli->relay_log, glob_hostname, opt_relay_logname,
|
||||||
|
11
sql/slave.h
11
sql/slave.h
@ -35,6 +35,11 @@ extern my_bool opt_log_slave_updates;
|
|||||||
extern ulonglong relay_log_space_limit;
|
extern ulonglong relay_log_space_limit;
|
||||||
struct st_master_info;
|
struct st_master_info;
|
||||||
|
|
||||||
|
enum enum_binlog_formats {
|
||||||
|
BINLOG_FORMAT_CURRENT=0, /* 0 is important for easy 'if (mi->old_format)' */
|
||||||
|
BINLOG_FORMAT_323_LESS_57,
|
||||||
|
BINLOG_FORMAT_323_GEQ_57 };
|
||||||
|
|
||||||
/*
|
/*
|
||||||
TODO: this needs to be redone, but for now it does not matter since
|
TODO: this needs to be redone, but for now it does not matter since
|
||||||
we do not have multi-master yet.
|
we do not have multi-master yet.
|
||||||
@ -266,15 +271,15 @@ typedef struct st_master_info
|
|||||||
int events_till_abort;
|
int events_till_abort;
|
||||||
#endif
|
#endif
|
||||||
bool inited;
|
bool inited;
|
||||||
bool old_format; /* master binlog is in 3.23 format */
|
enum enum_binlog_formats old_format; /* master binlog is in 3.23 format */
|
||||||
volatile bool abort_slave, slave_running;
|
volatile bool abort_slave, slave_running;
|
||||||
volatile ulong slave_run_id;
|
volatile ulong slave_run_id;
|
||||||
bool ignore_stop_event;
|
bool ignore_stop_event;
|
||||||
|
|
||||||
|
|
||||||
st_master_info()
|
st_master_info()
|
||||||
:fd(-1), io_thd(0), inited(0), old_format(0),abort_slave(0),
|
:fd(-1), io_thd(0), inited(0), old_format(BINLOG_FORMAT_CURRENT),
|
||||||
slave_running(0), slave_run_id(0)
|
abort_slave(0),slave_running(0), slave_run_id(0)
|
||||||
{
|
{
|
||||||
host[0] = 0; user[0] = 0; password[0] = 0;
|
host[0] = 0; user[0] = 0; password[0] = 0;
|
||||||
bzero(&file, sizeof(file));
|
bzero(&file, sizeof(file));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user