Current Path : /usr/opt/mysql57/mysql-test/suite/federated/ |
FreeBSD hs32.drive.ne.jp 9.1-RELEASE FreeBSD 9.1-RELEASE #1: Wed Jan 14 12:18:08 JST 2015 root@hs32.drive.ne.jp:/sys/amd64/compile/hs32 amd64 |
Current File : //usr/opt/mysql57/mysql-test/suite/federated/federated_get_table_share.test |
--source include/have_debug.inc --source include/have_debug_sync.inc --source suite/federated/include/federated.inc --enable_connect_log --echo ########################################################### --echo # --echo # Test cases for wl#7593: Don't hold LOCK_open... --echo # --echo # Most of the tests related to this wl are in a different --echo # test file main.get_table_share.test. One scenario is relevant --echo # for the federated storage engine, which is why it is put into --echo # this file. --echo # --echo # This test case is based on two threads: One thread master --echo # opening table tb, being paused while opening the share, --echo # while another thread issues a ALTER and DROP SERVER commands --echo # to make sure the tables related to the dropped server are --echo # being closed. --echo # --echo # Please note that the include files federated.inc and --echo # federated_cleanup.inc creates an cleans up various resources --echo # related to the federated engine (connections, schemas, etc). --echo # --echo # --connection slave --echo # Create a database and the tables on the slave: CREATE DATABASE new_federated; CREATE TABLE federated.ta (pk integer primary key); CREATE TABLE federated.tb (pk integer primary key); CREATE TABLE new_federated.ta (pk integer primary key); CREATE TABLE new_federated.tb (pk integer primary key); --echo # --connection master --echo # Create one server and two local, federated tables on the master: --replace_result $SLAVE_MYPORT SLAVE_PORT eval CREATE SERVER s FOREIGN DATA WRAPPER 'mysql' OPTIONS (USER 'root', HOST '127.0.0.1', PORT $SLAVE_MYPORT, DATABASE 'federated'); CREATE TABLE federated.ta (pk integer primary key) ENGINE= FEDERATED CONNECTION= 's'; CREATE TABLE federated.tb (pk integer primary key) ENGINE= FEDERATED CONNECTION= 's'; --echo # --echo # Check that the server is created, and do an insert into ta to make --echo # sure it is open and in the cache, then show open federated tables: --replace_result $SLAVE_MYPORT SLAVE_PORT SELECT * from mysql.servers; INSERT INTO federated.ta VALUES(0); SELECT * from federated.ta; SHOW OPEN TABLES IN federated; --echo # --echo # Wait after releasing LOCK_open for tb, and make sure we never --echo # end up at the 'found_share' sync point: SET DEBUG_SYNC= 'get_share_before_open SIGNAL open_master WAIT_FOR cont_master'; SET DEBUG_SYNC= 'get_share_found_share HIT_LIMIT 1'; --send INSERT INTO federated.tb VALUES(1) --echo # --connection default --echo # Wait for open_master, then issue an ALTER SERVER command, which will --echo # close the tables for the server being altered. The table ta is open, --echo # and will be closed, while tb is in the process of being opened, and --echo # will therefore be skipped (i.e. not closed): SET DEBUG_SYNC= 'now WAIT_FOR open_master'; ALTER SERVER s OPTIONS (DATABASE 'new_federated'); --echo # --echo # Then, we show open federated tables to verify that neither tb nor --echo # ta are open, then we let the master open the tb share and insert, --echo # then we reap the master to be sure it is done with the insert: SHOW OPEN TABLES IN federated; SET DEBUG_SYNC= 'now SIGNAL cont_master'; --connection master --reap --echo # --connection default --echo # Now, tb should be open: SHOW OPEN TABLES IN federated; --echo # --echo # A select from tb will show the inserted data since the --echo # actual server information from after the ALTER SERVER is used --echo # to open the table: SELECT * from federated.tb; --echo # --echo # A select from ta will now be empty since we switched --echo # remote table: SELECT * from federated.ta; --echo # --echo # Now, both ta and tb should be open: --sorted_result SHOW OPEN TABLES IN federated; --echo # --connection master --echo # Back to the master, we flush table tb and do a new insert, --echo # pausing before opening the share, just like we did above: FLUSH TABLE federated.tb; SHOW OPEN TABLES IN federated; SET DEBUG_SYNC= 'get_share_before_open SIGNAL open_master WAIT_FOR cont_master'; SET DEBUG_SYNC= 'get_share_found_share HIT_LIMIT 1'; --send INSERT INTO federated.tb VALUES(2) --echo # --connection default --echo # Wait for open_master, then issue a DROP SERVER command: SET DEBUG_SYNC= 'now WAIT_FOR open_master'; DROP SERVER s; --echo # --echo # Let the master finish opening the tb share, and then reap it, which --echo # will fail since the server has been deleted: SET DEBUG_SYNC= 'now SIGNAL cont_master'; --connection master --error ER_FOREIGN_DATA_STRING_INVALID_CANT_CREATE --reap # Not resetting DEBUG_SYNC for "master" was resulting in failure of subsequent # statement execution. # Reason is, when table_open_cache_instances <> 1 then tables accessed including # mysql.* may not exists in the table open cache instance of "master". So while # opening those tables DEBUG_SYNC='get_share_found_share HIT_LIMIT 1' was hit # more than once and subsequent statements execution was failing. # This worked well with table_open_cache_instances=1 as tables opened by other # connections also exists in the single cache. SET DEBUG_SYNC= 'RESET'; --echo # --connection default --echo # Then, we show open tables to verify that tb is left opened, --echo # while ta is not open anymore: SHOW OPEN TABLES IN federated; --echo # --connection slave --echo # Drop remote tables and database: DROP TABLE federated.ta, federated.tb; DROP TABLE new_federated.ta, new_federated.tb; DROP DATABASE new_federated; --echo # --connection default --echo # Reset DEBUG_SYNC and drop local tables: SET DEBUG_SYNC= 'RESET'; DROP TABLE federated.ta, federated.tb; --echo # --echo # Disconnecting slave and master is handled in federated_cleanup.inc --disable_connect_log --source suite/federated/include/federated_cleanup.inc