mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Fix for BUG#2477 "Slave stop with error after master reboot if use HEAP tables":
when we open the HEAP table for the first time since server restart, in hp_open(), we set a flag to propagate this info to the handler level which then writes a DELETE FROM this_heap_table to the binlog. It is not a perfect solution for the bug, because between the server start and the first open of the table, the slave still had old data in his table so a SELECT on the slave may show wrong content. But if there is a --init-file to populate the HEAP table on master as startup, then this is a safe fix (I'll put a note about init-file in the HEAP section of the manual). heap/hp_info.c: new info variable implicit_emptied heap/hp_open.c: If this is the first open of the HEAP table, it means it is empty, so we mark it. include/heap.h: new variables implicit_emptied (we need one in HEAPINFO for the hp_info() call). sql/ha_heap.cc: report info to upper level sql/handler.h: new info 'implicit_emptied' in the handler level; only HEAP uses it. sql/sql_base.cc: When a HEAP table is opened for the first time, write a DELETE FROM to the binlog, for replication and mysqlbinlog|mysql. Monty: I added the entry->file->implicit_emptied= 0;
This commit is contained in:
47
mysql-test/t/rpl_heap.test
Normal file
47
mysql-test/t/rpl_heap.test
Normal file
@ -0,0 +1,47 @@
|
||||
# You must run this test with --manager.
|
||||
|
||||
require_manager;
|
||||
|
||||
# Don't know why, but using TCP/IP connections makes this test fail
|
||||
# with "Lost connection to MySQL server during query" when we
|
||||
# issue a query after the server restart.
|
||||
# Maybe this is something awkward in mysqltest or in the manager?
|
||||
# So we use sockets.
|
||||
connect (master,localhost,root,,test,0,master.sock);
|
||||
connect (slave,localhost,root,,test,0,slave.sock);
|
||||
|
||||
connection master;
|
||||
reset master;
|
||||
drop table if exists t1;
|
||||
create table t1 (a int) type=HEAP;
|
||||
insert into t1 values(10);
|
||||
save_master_pos;
|
||||
show binlog events from 79;
|
||||
connection slave;
|
||||
reset slave;
|
||||
start slave;
|
||||
sync_with_master;
|
||||
show create table t1;
|
||||
select * from t1; # should be one row
|
||||
|
||||
server_stop master;
|
||||
server_start master;
|
||||
|
||||
connection master;
|
||||
select * from t1;
|
||||
# to check that DELETE is not written twice
|
||||
# (the LIMIT is to not use the query cache)
|
||||
select * from t1 limit 10;
|
||||
save_master_pos;
|
||||
show binlog events in 'master-bin.002' from 79;
|
||||
|
||||
connection slave;
|
||||
sync_with_master;
|
||||
select * from t1; # should be empty
|
||||
|
||||
# clean up
|
||||
connection master;
|
||||
drop table t1;
|
||||
save_master_pos;
|
||||
connection slave;
|
||||
sync_with_master;
|
Reference in New Issue
Block a user