summaryrefslogtreecommitdiff
path: root/sql/log_event.cc
diff options
context:
space:
mode:
authorunknown <guilhem@mysql.com>2003-04-09 15:16:12 +0200
committerunknown <guilhem@mysql.com>2003-04-09 15:16:12 +0200
commit8cad4f7090f50c19a1e0a247c57d9d965b7b7a6e (patch)
treed9cf8d2700e9e986a2ceb4aada19cf7048807fe7 /sql/log_event.cc
parentda0844b15fec2629c207dc13f33495f9c40eeb96 (diff)
downloadmariadb-git-8cad4f7090f50c19a1e0a247c57d9d965b7b7a6e.tar.gz
fix for #254
(3.23 master, 4.0 slave. Slave loss temp tables everytime FLUSH LOGS on master). This fix is less bad than the bug, it will cause a problem only maybe if the master dies the hard way (I say maybe because I could not cause a problem, and I don't see how it could happen). sql/log_event.cc: fix for #254 (3.23 master, 4.0 slave. Slave loss temp tables everytime FLUSH LOGS on master). This fix is less bad than the bug, it will cause a problem only maybe if the master dies the hard way. (I say maybe because I could not cause a problem, and I don't see how it could happen).
Diffstat (limited to 'sql/log_event.cc')
-rw-r--r--sql/log_event.cc28
1 files changed, 22 insertions, 6 deletions
diff --git a/sql/log_event.cc b/sql/log_event.cc
index 2040cebf17e..3b499b8d502 100644
--- a/sql/log_event.cc
+++ b/sql/log_event.cc
@@ -1949,6 +1949,10 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
IMPLEMENTATION
- To handle the case where the master died without a stop event,
we clean up all temporary tables + locks that we got.
+ However, we don't clean temporary tables if the master was 3.23
+ (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
- Remove all active user locks
@@ -1959,13 +1963,18 @@ 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)
{
- /* All temporary tables was deleted on the master */
- close_temporary_tables(thd);
- /*
- If we have old format, load_tmpdir is cleaned up by the I/O thread
- */
if (!rli->mi->old_format)
+ {
+ /*
+ If 4.0 master, all temporary tables have been deleted on the master;
+ if 3.23 master, this is far from sure.
+ */
+ close_temporary_tables(thd);
+ /*
+ If we have old format, load_tmpdir is cleaned up by the I/O thread
+ */
cleanup_load_tmpdir();
+ }
return Log_event::exec_event(rli);
}
@@ -1980,7 +1989,14 @@ int Start_log_event::exec_event(struct st_relay_log_info* rli)
int Stop_log_event::exec_event(struct st_relay_log_info* rli)
{
- // do not clean up immediately after rotate event
+ /*
+ do not clean up immediately after rotate event;
+ QQ: this should be a useless test: the only case when it is false is when
+ shutdown occured just after FLUSH LOGS. It has nothing to do with Rotate?
+ By the way, immediately after a Rotate
+ the I/O thread does not write the Stop to the relay log,
+ so we won't come here in that case.
+ */
if (rli->master_log_pos > BIN_LOG_HEADER_SIZE)
{
close_temporary_tables(thd);