|
|
|
@ -4726,12 +4726,66 @@ static Log_event* next_event(Relay_log_info* rli) |
|
|
|
DBUG_ASSERT(rli->cur_log_fd == -1); |
|
|
|
|
|
|
|
/*
|
|
|
|
Read pointer has to be at the start since we are the only |
|
|
|
reader. |
|
|
|
We must keep the LOCK_log to read the 4 first bytes, as this is a hot |
|
|
|
log (same as when we call read_log_event() above: for a hot log we |
|
|
|
take the mutex). |
|
|
|
When the SQL thread is [stopped and] (re)started the |
|
|
|
following may happen: |
|
|
|
|
|
|
|
1. Log was hot at stop time and remains hot at restart |
|
|
|
|
|
|
|
SQL thread reads again from hot_log (SQL thread was |
|
|
|
reading from the active log when it was stopped and the |
|
|
|
very same log is still active on SQL thread restart). |
|
|
|
|
|
|
|
In this case, my_b_seek is performed on cur_log, while |
|
|
|
cur_log points to relay_log.get_log_file(); |
|
|
|
|
|
|
|
2. Log was hot at stop time but got cold before restart |
|
|
|
|
|
|
|
The log was hot when SQL thread stopped, but it is not |
|
|
|
anymore when the SQL thread restarts. |
|
|
|
|
|
|
|
In this case, the SQL thread reopens the log, using |
|
|
|
cache_buf, ie, cur_log points to &cache_buf, and thence |
|
|
|
its coordinates are reset. |
|
|
|
|
|
|
|
3. Log was already cold at stop time |
|
|
|
|
|
|
|
The log was not hot when the SQL thread stopped, and, of |
|
|
|
course, it will not be hot when it restarts. |
|
|
|
|
|
|
|
In this case, the SQL thread opens the cold log again, |
|
|
|
using cache_buf, ie, cur_log points to &cache_buf, and |
|
|
|
thence its coordinates are reset. |
|
|
|
|
|
|
|
4. Log was hot at stop time, DBA changes to previous cold |
|
|
|
log and restarts SQL thread |
|
|
|
|
|
|
|
The log was hot when the SQL thread was stopped, but the |
|
|
|
user changed the coordinates of the SQL thread to |
|
|
|
restart from a previous cold log. |
|
|
|
|
|
|
|
In this case, at start time, cur_log points to a cold |
|
|
|
log, opened using &cache_buf as cache, and coordinates |
|
|
|
are reset. However, as it moves on to the next logs, it |
|
|
|
will eventually reach the hot log. If the hot log is the |
|
|
|
same at the time the SQL thread was stopped, then |
|
|
|
coordinates were not reset - the cur_log will point to |
|
|
|
relay_log.get_log_file(), and not a freshly opened |
|
|
|
IO_CACHE through cache_buf. For this reason we need to |
|
|
|
deploy a my_b_seek before calling check_binlog_magic at |
|
|
|
this point of the code (see: BUG#55263 for more |
|
|
|
details). |
|
|
|
|
|
|
|
NOTES: |
|
|
|
- We must keep the LOCK_log to read the 4 first bytes, as |
|
|
|
this is a hot log (same as when we call read_log_event() |
|
|
|
above: for a hot log we take the mutex). |
|
|
|
|
|
|
|
- Because of scenario #4 above, we need to have a |
|
|
|
my_b_seek here. Otherwise, we might hit the assertion |
|
|
|
inside check_binlog_magic. |
|
|
|
*/ |
|
|
|
|
|
|
|
my_b_seek(cur_log, (my_off_t) 0); |
|
|
|
if (check_binlog_magic(cur_log,&errmsg)) |
|
|
|
{ |
|
|
|
if (!hot_log) |
|
|
|
|