1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-18 17:42:20 +03:00
Files
mariadb/mysql-test/include/check-testcase.test
Marko Mäkelä 88aff5f471 Follow-up to MDEV-13407 innodb.drop_table_background failed in buildbot with "Tablespace for table exists"
The InnoDB background DROP TABLE queue is something that we should
really remove, but are unable to until we remove dict_operation_lock
so that DDL and DML operations can be combined in a single transaction.

Because the queue is not persistent, it is not crash-safe. We should
in some way ensure that the deferred-dropped tables will be dropped
after server restart.

The existence of two separate transactions complicates the error handling
of CREATE TABLE...SELECT. We should really not break locks in DROP TABLE.

Our solution to these problems is to rename the table to a temporary
name, and to drop such-named tables on InnoDB startup. Also, the
queue will use table IDs instead of names from now on.

check-testcase.test: Ignore #sql-ib*.ibd files, because tables may enter
the background DROP TABLE queue shortly before the test finishes.

innodb.drop_table_background: Test CREATE...SELECT and the creation of
tables whose file name starts with #sql-ib.

innodb.alter_crash: Adjust the recovery, now that the #sql-ib tables
will be dropped on InnoDB startup.

row_mysql_drop_garbage_tables(): New function, to drop all #sql-ib tables
on InnoDB startup.

row_drop_table_for_mysql_in_background(): Remove an unnecessary and
misplaced call to log_buffer_flush_to_disk(). (The call should have been
after the transaction commit. We do not care about flushing the redo log
here, because the table would be dropped again at server startup.)

Remove the entry from the list after the table no longer exists.

If server shutdown has been initiated, empty the list without actually
dropping any tables. They will be dropped again on startup.

row_drop_table_for_mysql(): Do not call lock_remove_all_on_table().
Instead, if locks exist, defer the DROP TABLE until they do not exist.
If the table name does not start with #sql-ib, rename it to that prefix
before adding it to the background DROP TABLE queue.
2017-12-19 17:12:39 +02:00

93 lines
3.0 KiB
Plaintext

# ==== Purpose ====
#
# This test is executed twice for each test case. Before every
# testcase it is run with mysqltest in record mode and will thus
# produce an output file that can be compared to output from after the
# tescase. In that way, it is possible to check that a testcase does
# not have any unwanted side affects.
--disable_query_log
# We want to ensure all slave configuration is restored. But SHOW
# SLAVE STATUS returns nothing for servers not configured as slaves,
# and (after BUG#28796 was fixed) there is no way to de-configure a
# slave. Hence, it's impossible to clean up the replication state at
# the end. But we want to check that the slave is stopped, there is
# no error, and a few other invariants. So we issue SHOW SLAVE
# STATUS, and if it returns no rows we fake the result.
--let $tmp= query_get_value(SHOW SLAVE STATUS, Slave_IO_Running, 1)
--let $tmp= `SELECT '$tmp' = 'No such row'`
if ($tmp)
{
# Note: after WL#5177, fields 13-18 shall not be filtered-out.
--echo Slave_IO_State
--echo Master_Host 127.0.0.1
--echo Master_User root
--echo Master_Port #
--echo Connect_Retry #
--echo Master_Log_File #
--echo Read_Master_Log_Pos #
--echo Relay_Log_File #
--echo Relay_Log_Pos #
--echo Relay_Master_Log_File #
--echo Slave_IO_Running No
--echo Slave_SQL_Running No
--echo Replicate_Do_DB #
--echo Replicate_Ignore_DB #
--echo Replicate_Do_Table #
--echo Replicate_Ignore_Table #
--echo Replicate_Wild_Do_Table #
--echo Replicate_Wild_Ignore_Table #
--echo Last_Errno 0
--echo Last_Error
--echo Skip_Counter 0
--echo Exec_Master_Log_Pos #
--echo Relay_Log_Space #
--echo Until_Condition #
--echo Until_Log_File #
--echo Until_Log_Pos #
--echo Master_SSL_Allowed No
--echo Master_SSL_CA_File
--echo Master_SSL_CA_Path
--echo Master_SSL_Cert
--echo Master_SSL_Cipher
--echo Master_SSL_Key
--echo Seconds_Behind_Master NULL
--echo Master_SSL_Verify_Server_Cert No
--echo Last_IO_Errno 0
--echo Last_IO_Error
--echo Last_SQL_Errno 0
--echo Last_SQL_Error
--echo Replicate_Ignore_Server_Ids
--echo Master_Server_Id #
--echo Master_SSL_Crl #
--echo Master_SSL_Crlpath #
--echo Using_Gtid No
--echo Gtid_IO_Pos #
--echo Replicate_Do_Domain_Ids
--echo Replicate_Ignore_Domain_Ids
--echo Parallel_Mode conservative
--echo SQL_Delay 0
--echo SQL_Remaining_Delay NULL
--echo Slave_SQL_Running_State
}
if (!$tmp) {
# Note: after WL#5177, fields 13-18 shall not be filtered-out.
--replace_column 4 # 5 # 6 # 7 # 8 # 9 # 10 # 13 # 14 # 15 # 16 # 17 # 18 # 22 # 23 # 24 # 25 # 26 # 40 # 41 # 42 # 44 #
query_vertical
SHOW SLAVE STATUS;
}
call mtr.check_testcase();
let $datadir=`select @@datadir`;
list_files $datadir mysql_upgrade_info;
list_files_write_file $datadir.tempfiles.txt $datadir/test #sql*;
--replace_regex /#sql-ib[0-9a-f]+-[0-9a-f]+\.ibd\n//
cat_file $datadir.tempfiles.txt;
remove_file $datadir.tempfiles.txt;
list_files $datadir/mysql #sql*;
--enable_query_log