The Blackhole engine did not support row-based replication
since the delete_row(), update_row(), and the index and range
searching functions were not implemented.
This patch adds row-based replication support for the
Blackhole engine by implementing the two functions mentioned
above, and making the engine pretend that it has found the
correct row to delete or update when executed from the slave
SQL thread by implementing index and range searching functions.
It is necessary to only pretend this for the SQL thread, since
a SELECT executed on the Blackhole engine will otherwise never
return EOF, causing a livelock.
mysql-test/extra/binlog_tests/blackhole.test:
Blackhole now handles row-based replication.
mysql-test/extra/rpl_tests/rpl_blackhole.test:
Test helper file for testing that blackhole actually
writes something to the binary log on the slave.
mysql-test/suite/binlog/t/binlog_multi_engine.test:
Replication now handles row-based replcation.
mysql-test/suite/rpl/t/rpl_blackhole.test:
Test that Blackhole works with primary key, index, or none.
sql/log_event.cc:
Correcting code to only touch filler bits and leave
all other bits alone. It is necessary since there is
no guarantee that the engine will be able to fill in
the bits correctly (e.g., the blackhole engine).
storage/blackhole/ha_blackhole.cc:
Adding definitions for update_row() and delete_row() to return OK
when executed from the slave SQL thread with thd->query == NULL
(indicating that row-based replication events are being processed).
Changing rnd_next(), index_read(), index_read_idx(), and
index_read_last() to return OK when executed from the slave SQL
thread (faking that the row has been found so that processing
proceeds to update/delete the row).
storage/blackhole/ha_blackhole.h:
Enabling row capabilities for engine.
Defining write_row(), update_row(), and delete_row().
Making write_row() private (as it should be).
The replication filtering rules were inappropiately applied when
executing BINLOG pseudo-query. The rules are supposed to be active
only at times when the slave's sql thread executes an event.
Fixed with correcting a condition to call replication rules only if
the slave sql thread executes the event.
mysql-test/suite/rpl/r/rpl_binlog_query_filter_rules.result:
new result file
mysql-test/suite/rpl/t/rpl_binlog_query_filter_rules-master.opt:
a filtering option that would refuse to replicate a row event of the main test on
slave
mysql-test/suite/rpl/t/rpl_binlog_query_filter_rules.test:
a regression test for the bug
sql/log_event.cc:
avoiding to call the filtering rules if the execution thread is not a slave.
INSTALL PLUGIN and UNINSTALL PLUGIN worked with statement-based and
mixed-mode replication only, but not with row-based replication.
There is no statement-based replication of these statements.
But there was row-based replication of the inserts and deletes
to and from the mysql.plugin table.
The fix is to suppress binlogging during insert and delete to
and from the mysql.plugin table.
mysql-test/suite/rpl/r/rpl_plugin_load.result:
new result file
mysql-test/suite/rpl/t/rpl_plugin_load-master.opt:
new opt file
mysql-test/suite/rpl/t/rpl_plugin_load-slave.opt:
new opt file
mysql-test/suite/rpl/t/rpl_plugin_load.test:
new test
sql/sql_plugin.cc:
Suppress binlogging during insert and delete to/from the
mysql.plugin table.
BUG#37884: rpl_row_basic_2myisam and rpl_row_basic_3innodb fail sporadically in pushbuild
These have been fixed in 5.1-rpl. Re-applying fix for BUG#37884
in 5.1-bugteam, and disabling rpl_flushlog_loop for BUG#37733 in
5.1-bugteam.
mysql-test/extra/rpl_tests/rpl_row_basic.test:
Missing sync_slave_with_master added.
mysql-test/suite/rpl/t/disabled.def:
Disabling rpl_flushlog_loop until the fixed version gets
merged from 5.1-rpl
Problem: the test waits for a 'DROP TEMPORARY TABLE' event to
appear in the master's binlog, then checks on the slave whether
the number of temporary tables has decreased. The slave does
not sync, causing a race.
Fix: check for the 'DROP TEMPORARY TABLE' event on slave
instead of on master.
mysql-test/suite/rpl/t/rpl_trunc_temp.test:
- Fixed BUG#37493 by waiting for the event on the slave
instead of on the master.
- Added comments.
This is not a fix to the bug. It only adds debug info, so
that we can analyze the bug better next time it happens.
Please revert the patch after the bug is fixed.
mysql-test/suite/rpl/t/rpl_incident.test:
Added debug info. This will only be printed if the
test fails.
the reason for the failure is that io thread passes through a sequence of state
changes before it eventually got stuck at the expect running state as NO.
It's unreasonble to wait for the running status while the whole idea of the test is
to get to the IO thread error.
Fixed with changing the waiting condition.
mysql-test/suite/rpl/r/rpl_server_id1.result:
results changed
mysql-test/suite/rpl/t/disabled.def:
re-enabling rpl_server_id1
mysql-test/suite/rpl/t/rpl_server_id1.test:
deploying the exact waiting condition i.e to wait for the slave io error.
Problem: master binlog has 'create table t1'. Master binlog
was removed before slave could replicate it. In test's cleanup
code, master did 'drop table t1', which caused slave sql
thread to stop with an error since slave sql thread did not
know about t1.
Fix: t1 is just an auxiliary construction, only needed on
master. Hence, we turn off binlogging before t1 is created,
drop t1 as soon as we don't need it anymore, and then turn
on binlogging again.
mysql-test/include/show_binlog_events.inc:
Filter out directories and block_len from
LOAD DATA INFILE events.
mysql-test/suite/rpl/r/rpl_loaddata_map.result:
updated result file
mysql-test/suite/rpl/t/rpl_loaddata_map.test:
Turn off binlogging while t1 is used, drop t1 as soon
as we don't need it anymore, and turn on binlogging again.
Also added some comments and replaced 'show binlog events'
by 'source include/show_binlog_events.inc'.
Many dump threads can exist due to a way the new version of mtr governs suites.
For this immediate problem the test is refined not to use I_S but rather to reconnect
explicitly with preserving logics of a an old target bug fixes verification.
mysql-test/suite/rpl/r/rpl_temporary.result:
results changed
mysql-test/suite/rpl/t/rpl_temporary.test:
refining the bug#17284 test to avoid counting dump threads in favor to reconnect
explicitly with preserving the orig logics.
Problem: the test set @@global.init_slave to garbage at a time
which was not guaranteed to be after the time when the slave's
SQL thread used it. That would cause the slave's SQL thread to
stop in rare cases.
Fix: The test does not care about the value of
@@global.init_slave, except that it should be different on
master and slave. Hence, we set @@global.init_slave to
something that is valid SQL.
mysql-test/suite/rpl/r/rpl_variables.result:
updated result file.
mysql-test/suite/rpl/t/rpl_variables.test:
Set @@global.init_slave to something that is valid SQL.
This bug has been fixed in two slightly different ways in
6.0-rpl and {5.1,6.0}-bugteam. To avoid future merge
problems, I'm now copying the 6.0-rpl fix to 5.1-bugteam.
The previous fix for the bug was incomplete. The test failed
because t2 did not exist on the slave (since the slave was
lagging) when the
wait_condition was executed. Fixed by inserting
sync_slave_with_master just after t2 was created.
Problem: rpl_switch_stm_row_mixed did not wait until row events generated by
INSERT DELAYED were written to the master binlog before it synchronized slave
with master. This caused sporadic errors where these rows were missing on
slave.
Fix: wait until all rows appear on the slave.
This is a backport, applying the same to 5.1-bugteam as was previously
applied to 6.0-rpl
On a slow environment like valgrind the test is vulnerable
because it does not check if slave has stopped at time
of the new session is requested `start slave;' -- disabling
test till it is fixed.
mysql-test/suite/rpl/t/disabled.def:
disable rpl_server_id1 until test is fixed.
rpl_slave_status failed on pushbuild. The slave stopped with an
error. Adding sync_slave_with_master fixes the problem. Updated
test case.
mysql-test/suite/rpl/r/rpl_slave_status.result:
Updated result file.
mysql-test/suite/rpl/t/rpl_slave_status.test:
- Added comment explaining what the test does.
- Added sync_slave_with_master in two places where it was missing. This
caused sporadic pushbuild errors.
- Added wait_for_slave_to_{start,stop} after {START,STOP} SLAVE queries.
- Removed 'drop table if exists' from setup code.
- Replaced save_master_pos;connection slave;sync_with_master by
sync_slave_with_master.
- Replaced 'delete from mysql.user' by 'drop user'.
- Wrapped 'show slave status' inside query_get_value(), so that only what
we test is in the output.
The test is vulnerable because it does not check if slave has stopped at time
of the new session is requested `start slave;'
Fixed with deploying explicitly wait_for_slave_to_stop synchronization macro.
into magare.gmz:/home/kgeorge/mysql/work/B36011-5.1-bugteam
sql/sql_select.cc:
Auto merged
mysql-test/r/subselect.result:
merge of bug 36011 to 5.1-bugteam
mysql-test/t/subselect.test:
merge of bug 36011 to 5.1-bugteam
into zippy.cornsilk.net:/home/cmiller/work/mysql/bug36570/my51-bug36570
mysql-test/suite/rpl/t/rpl_sp.test:
Auto merged
mysql-test/suite/rpl/r/rpl_sp.result:
Use local. Needs re-recording.
mysql-test/extra/rpl_tests/rpl_insert_id.test:
Moving save and restore of @@global.concurrent_insert into the same
session thread.
mysql-test/suite/rpl/r/rpl_insert_id.result:
Result file change.
mysql-test/suite/rpl/t/rpl_insert_id.test:
***MISSING TEXT***
into zippy.cornsilk.net:/home/cmiller/work/mysql/bug36570/my51-bug36570
mysql-test/suite/rpl/t/rpl_sp.test:
Auto merged
mysql-test/suite/rpl/r/rpl_sp.result:
manual merge.
into zippy.cornsilk.net:/home/cmiller/work/mysql/bug36570/my51-bug36570
BitKeeper/deleted/.del-binlog_innodb.result:
Auto merged
sql/sp_head.cc:
Auto merged
mysql-test/suite/binlog/r/binlog_stm_ctype_ucs.result:
need to re-record.
mysql-test/suite/rpl/r/rpl_sp.result:
need to re-record.
mysql-test/r/mysqlbinlog.result:
manual merge.
mysql-test/suite/rpl/t/rpl_sp.test:
manual merge.
sql/sp.cc:
manual merge.
sql/sp_head.h:
manual merge.
into zippy.cornsilk.net:/home/cmiller/work/mysql/bug36570/my51-bug36570
BitKeeper/deleted/.del-binlog_innodb.result:
Auto merged
mysql-test/r/mysqlbinlog.result:
need to record.
mysql-test/suite/binlog/r/binlog_stm_ctype_ucs.result:
need to record.
mysql-test/suite/rpl/r/rpl_sp.result:
need to record.
mysql-test/suite/rpl/t/rpl_sp.test:
manual merge.
sql/sp.cc:
Manual merge
When flushing tables, there were a slight chance that the flush was occuring
between processing of two table map events. Since the tables are opened
one by one, it might result in that the tables were not valid and that sub-
sequent locking of tables would cause the slave to crash.
The problem is solved by opening and locking all tables at once using
simple_open_n_lock_tables(). Also, the patch contain a change to open_tables()
so that pre-locking only takes place when the trg_event_map is not zero, which
was not the case before (this caused the lock to be placed in thd->locked_tables
instead of thd->lock since the assumption was that triggers would be called
later and therefore the tables should be pre-locked).
mysql-test/suite/rpl/r/rpl_found_rows.result:
Result change
mysql-test/suite/rpl/r/rpl_row_inexist_tbl.result:
Result change
mysql-test/suite/rpl/t/rpl_found_rows.test:
Adding drop of table that was created in test.
mysql-test/suite/rpl/t/rpl_slave_status.test:
Adding waits for slave start and stop to ensure that test works.
sql/log_event.cc:
Replacing table-by-table open and lock with a single call
to simple_open_n_lock_tables(), which in turn required some
changes to other code.
sql/log_event_old.cc:
Replacing table-by-table open and lock with a single call
to simple_open_n_lock_tables(), which in turn required some
changes to other code.
sql/sql_base.cc:
Extending check inside open_tables() so that pre-locking in only done if
tables->trg_egent_map is non-zero.
mysql-test/include/wait_for_slave_sql_to_start.inc:
New BitKeeper file ``mysql-test/include/wait_for_slave_sql_to_start.inc''
into client-10-129-10-147.upp.off.mysql.com:/Users/mattiasj/clones/topush-51-bugteam
mysql-test/suite/rpl/r/rpl_sp.result:
Auto merged
mysql-test/suite/rpl/t/rpl_view.test:
Auto merged
sql/sql_view.cc:
This was already fixed in 5.1
mysql-test/suite/rpl/r/rpl_view.result:
manual merge
Temporarily checking in an incorrect test case. Rationale: the impact of
this bug is negligible (it's almost a feature request). We need 5.1 to be
stable, and making a real fix is a bit risky. So the fix is postponed
to 6.0.
mysql-test/suite/rpl/r/rpl_ddl.result:
Updated result file.
mysql-test/suite/rpl/t/disabled.def:
Enabling test case rpl_ddl.test
The test suite/rpl/t/rpl_innodb_bug28430.test was disabled because of
BUG#32247, but not re-enabled when BUG#32247 was fixed. I've re-enabled
it. The test and result file needed to be updated too.
mysql-test/suite/rpl/r/rpl_innodb_bug28430.result:
Updated result file.
mysql-test/suite/rpl/t/disabled.def:
Enabled the rpl_innodb_bug28430 test case.
mysql-test/suite/rpl/t/rpl_innodb_bug28430.test:
show slave status is not needed since we have select count(*)
into ramayana.hindu.god:/home/tsmith/m/bk/build/51
mysql-test/mysql-test-run.pl:
Auto merged
mysql-test/suite/funcs_1/datadict/processlist_val.inc:
Auto merged
mysql-test/t/disabled.def:
Auto merged
mysql-test/suite/rpl/t/disabled.def:
SCCS merged
Among two claimed artifacts the critical one is in that the Table map of
a query following the failing with a duplicate key error CREATE-SELECT is skipped from
instantionating (and thus binlogging). That leads to sending a "chopped" group of the data
row-events without the table map head to the slave.
The slave can not apply the only data row events.
It's not easy to force the slave to react with an error in such a case (the second complaint
on the bug report), because the lack of a table Rows_log_event::do_apply_event the data row event
handler is a common situation which normally designates the event has to be filtered out
basing on the repliation do/ingore rules decision.
Fixed: table map creating and binlogging is restored via deploying the standard cleanup call in
select_create::abort().
No error is reported if by chance the table map was not been binlogged.
Leaving this out to resolve with considering how to combine the do/ingore rules with the situation
when erronoulsy the Table_map is not written to binlog.
mysql-test/suite/rpl/r/rpl_row_create_table.result:
results changed
mysql-test/suite/rpl/t/rpl_row_create_table.test:
regression test for the bug
sql/sql_insert.cc:
adding resetting of thd binlogging state that was missed for the particular case of failing CREATE..SELECT
mysql-test/include/master-slave-reset.inc:
Adding missing waits for slave to start and stop causing test failures.
mysql-test/suite/rpl/t/rpl_insert.test:
Waiting for the rows to be inserted instead of relying on the binlog position
to be updated correctly.
Disabled 'rpl_redirect', failure is sporadic and and the test is superfluous
rpl_packet.test, rpl_packet.result:
Removing race conditions from rpl_packet causing test to fail
mysql-test/suite/rpl/t/disabled.def:
Disabled 'rpl_redirect', failure is sporadic and and the test is superfluous
mysql-test/suite/rpl/r/rpl_packet.result:
Result change.
mysql-test/suite/rpl/t/rpl_packet.test:
Setting net_buffer_length correctly for the test instead of relying on it
being set correctly. Waiting for slave to stop after issuing a SLAVE STOP
and waiting for slave to start when issuing a SLAVE START to prevent race
conditions causing test failure.