Commit 3f3ffdcc authored by unknown's avatar unknown

Merge romeo.(none):/home/bkroot/mysql-5.1-new-rpl

into  romeo.(none):/home/bk/b21474-mysql-5.1-new-rpl


sql/log_event.cc:
  Auto merged
parents 010edb7e 55ce4471
...@@ -2517,19 +2517,19 @@ int Format_description_log_event::exec_event(struct st_relay_log_info* rli) ...@@ -2517,19 +2517,19 @@ int Format_description_log_event::exec_event(struct st_relay_log_info* rli)
if (server_id == (uint32) ::server_id) if (server_id == (uint32) ::server_id)
{ {
/* /*
Do not modify rli->group_master_log_pos, as this event did not exist on We only increase the relay log position if we are skipping
the master. That is, just update the *relay log* coordinates; this is events and do not touch any group_* variables, nor flush the
done by passing log_pos=0 to inc_group_relay_log_pos, like we do in relay log info. If there is a crash, we will have to re-skip
Stop_log_event::exec_event(). the events again, but that is a minor issue.
If in a transaction, don't touch group_* coordinates.
*/ If we do not skip stepping the group log position (and the
if (thd->options & OPTION_BEGIN) server id was changed when restarting the server), it might well
rli->inc_event_relay_log_pos(); be that we start executing at a position that is invalid, e.g.,
else at a Rows_log_event or a Query_log_event preceeded by a
{ Intvar_log_event instead of starting at a Table_map_log_event or
rli->inc_group_relay_log_pos(0); the Intvar_log_event respectively.
flush_relay_log_info(rli); */
} rli->inc_event_relay_log_pos();
DBUG_RETURN(0); DBUG_RETURN(0);
} }
......
...@@ -3101,17 +3101,22 @@ static int exec_relay_log_event(THD* thd, RELAY_LOG_INFO* rli) ...@@ -3101,17 +3101,22 @@ static int exec_relay_log_event(THD* thd, RELAY_LOG_INFO* rli)
type_code != START_EVENT_V3 && type_code!= FORMAT_DESCRIPTION_EVENT)) type_code != START_EVENT_V3 && type_code!= FORMAT_DESCRIPTION_EVENT))
{ {
DBUG_PRINT("info", ("event skipped")); DBUG_PRINT("info", ("event skipped"));
if (thd->options & OPTION_BEGIN) /*
rli->inc_event_relay_log_pos(); We only skip the event here and do not increase the group log
else position. In the event that we have to restart, this means
{ that we might have to skip the event again, but that is a
rli->inc_group_relay_log_pos((type_code == ROTATE_EVENT || minor issue.
type_code == STOP_EVENT ||
type_code == FORMAT_DESCRIPTION_EVENT) ? If we were to increase the group log position when skipping an
LL(0) : ev->log_pos, event, it might be that we are restarting at the wrong
1/* skip lock*/); position and have events before that we should have executed,
flush_relay_log_info(rli); so not increasing the group log position is a sure bet in this
} case.
In this way, we just step the group log position when we
*know* that we are at the end of a group.
*/
rli->inc_event_relay_log_pos();
/* /*
Protect against common user error of setting the counter to 1 Protect against common user error of setting the counter to 1
......
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