mirror of
https://github.com/MariaDB/server.git
synced 2025-02-20 12:23:10 +01:00

On Windows systems, occurrences of ERROR_SHARING_VIOLATION due to conflicting share modes between processes accessing the same file can result in CreateFile failures. mysys' my_open() already incorporates a workaround by implementing wait/retry logic on Windows. But this does not help if files are opened using shell redirection like mysqltest traditionally did it, i.e via --echo exec "some text" > output_file In such cases, it is cmd.exe, that opens the output_file, and it won't do any sharing-violation retries. This commit addresses the issue by introducing a new built-in command, 'write_line', in mysqltest. This new command serves as a brief alternative to 'write_file', with a single line output, that also resolves variables like "exec" would. Internally, this command will use my_open(), and therefore retry-on-error logic. Hopefully this will eliminate the very sporadic "can't open file because it is used by another process" error on CI.
170 lines
6 KiB
Text
170 lines
6 KiB
Text
--echo #
|
|
--echo # Bug #17335427 INNODB CAN NOT USE THE DOUBLEWRITE BUFFER PROPERLY
|
|
--echo # Bug #18144349 INNODB CANNOT USE THE DOUBLEWRITE BUFFER FOR THE FIRST
|
|
--echo # PAGE OF SYSTEM TABLESPACE
|
|
--echo #
|
|
|
|
--source include/innodb_page_size.inc
|
|
--source include/have_debug.inc
|
|
--source include/not_embedded.inc
|
|
--disable_query_log
|
|
call mtr.add_suppression("InnoDB: Data file .* uses page size .* but the innodb_page_size start-up parameter is");
|
|
call mtr.add_suppression("InnoDB: adjusting FSP_SPACE_FLAGS");
|
|
call mtr.add_suppression("InnoDB: New log files created");
|
|
call mtr.add_suppression("InnoDB: Cannot create doublewrite buffer: the first file in innodb_data_file_path must be at least (3|6|12)M\\.");
|
|
call mtr.add_suppression("InnoDB: Database creation was aborted");
|
|
call mtr.add_suppression("Plugin 'InnoDB' (init function returned error|registration as a STORAGE ENGINE failed)");
|
|
call mtr.add_suppression("InnoDB: A bad Space ID was found in datafile");
|
|
call mtr.add_suppression("InnoDB: Checksum mismatch in datafile: ");
|
|
call mtr.add_suppression("InnoDB: Inconsistent tablespace ID in .*t1\\.ibd");
|
|
call mtr.add_suppression("InnoDB: Header page consists of zero bytes in datafile:");
|
|
--enable_query_log
|
|
|
|
let INNODB_PAGE_SIZE=`select @@innodb_page_size`;
|
|
let MYSQLD_DATADIR=`select @@datadir`;
|
|
let ALGO=`select @@innodb_checksum_algorithm`;
|
|
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
|
|
|
show variables like 'innodb_doublewrite';
|
|
show variables like 'innodb_fil_make_page_dirty_debug';
|
|
show variables like 'innodb_saved_page_number_debug';
|
|
|
|
create table t1 (f1 int primary key, f2 blob) engine=innodb;
|
|
|
|
start transaction;
|
|
insert into t1 values(1, repeat('#',12));
|
|
insert into t1 values(2, repeat('+',12));
|
|
insert into t1 values(3, repeat('/',12));
|
|
insert into t1 values(4, repeat('-',12));
|
|
insert into t1 values(5, repeat('.',12));
|
|
commit work;
|
|
|
|
--echo # Test Begin: Test if recovery works if 1st page and 2nd page
|
|
--echo # of system tablespace is full of zeroes.
|
|
|
|
# Slow shutdown and restart to make sure ibuf merge is finished
|
|
SET GLOBAL innodb_fast_shutdown = 0;
|
|
let $shutdown_timeout=;
|
|
let $restart_parameters=--debug_dbug=+d,ib_log_checkpoint_avoid_hard --innodb_flush_sync=0;
|
|
--source include/restart_mysqld.inc
|
|
--source ../include/no_checkpoint_start.inc
|
|
begin;
|
|
insert into t1 values (6, repeat('%', 400));
|
|
|
|
--echo # Make the first page dirty for system tablespace
|
|
set global innodb_saved_page_number_debug = 0;
|
|
set global innodb_fil_make_page_dirty_debug = 0;
|
|
|
|
--echo # Make the second page dirty for system tablespace
|
|
set global innodb_saved_page_number_debug = 1;
|
|
set global innodb_fil_make_page_dirty_debug = 0;
|
|
|
|
set global innodb_buf_flush_list_now = 1;
|
|
|
|
--let CLEANUP_IF_CHECKPOINT=drop table t1, unexpected_checkpoint;
|
|
--source ../include/no_checkpoint_end.inc
|
|
|
|
--echo # Make the 1st page (page_no=0) and 2nd page (page_no=1)
|
|
--echo # of the system tablespace all zeroes.
|
|
perl;
|
|
use IO::Handle;
|
|
my $fname= "$ENV{'MYSQLD_DATADIR'}ibdata1";
|
|
open(FILE, "+<", $fname) or die;
|
|
FILE->autoflush(1);
|
|
binmode FILE;
|
|
print FILE chr(0) x ($ENV{'INNODB_PAGE_SIZE'});
|
|
seek(FILE, $ENV{'INNODB_PAGE_SIZE'}, SEEK_SET);
|
|
print FILE chr(0) x ($ENV{'INNODB_PAGE_SIZE'});
|
|
close FILE;
|
|
EOF
|
|
|
|
let $restart_parameters=;
|
|
--source include/start_mysqld.inc
|
|
|
|
let SEARCH_PATTERN=InnoDB: Restoring page \[page id: space=0, page number=0\] of datafile;
|
|
--source include/search_pattern_in_file.inc
|
|
|
|
let SEARCH_PATTERN=InnoDB: Recovered page \[page id: space=0, page number=1\];
|
|
--source include/search_pattern_in_file.inc
|
|
|
|
check table t1;
|
|
select f1, f2 from t1;
|
|
|
|
--echo # Test End
|
|
--echo # ---------------------------------------------------------------
|
|
--echo # Test Begin: Test if recovery works if 1st page of
|
|
--echo # system tablespace is corrupted and 2nd page as corrupted.
|
|
|
|
let $restart_parameters=--debug_dbug=+d,ib_log_checkpoint_avoid_hard --innodb_flush_sync=0;
|
|
--source include/restart_mysqld.inc
|
|
--source ../include/no_checkpoint_start.inc
|
|
begin;
|
|
insert into t1 values (6, repeat('%', 400));
|
|
|
|
--echo # Make the first page dirty for system tablespace
|
|
set global innodb_saved_page_number_debug = 0;
|
|
set global innodb_fil_make_page_dirty_debug = 0;
|
|
|
|
--echo # Make the second page dirty for system tablespace
|
|
set global innodb_saved_page_number_debug = 1;
|
|
set global innodb_fil_make_page_dirty_debug = 0;
|
|
|
|
set global innodb_buf_flush_list_now = 1;
|
|
|
|
--source ../include/no_checkpoint_end.inc
|
|
|
|
--echo # Corrupt the 1st page (page_no=0) and 2nd page of the system tablespace.
|
|
perl;
|
|
use IO::Handle;
|
|
my $fname= "$ENV{'MYSQLD_DATADIR'}ibdata1";
|
|
open(FILE, "+<", $fname) or die;
|
|
FILE->autoflush(1);
|
|
binmode FILE;
|
|
print FILE chr(0) x ($ENV{'INNODB_PAGE_SIZE'}/2);
|
|
seek(FILE, $ENV{'INNODB_PAGE_SIZE'}, SEEK_SET);
|
|
print FILE chr(0) x ($ENV{'INNODB_PAGE_SIZE'}/2);
|
|
close FILE;
|
|
EOF
|
|
|
|
let $restart_parameters=;
|
|
--source include/start_mysqld.inc
|
|
|
|
let SEARCH_PATTERN=InnoDB: Restoring page \[page id: space=0, page number=0\] of datafile;
|
|
--source include/search_pattern_in_file.inc
|
|
|
|
let SEARCH_PATTERN=InnoDB: Recovered page \[page id: space=0, page number=1\];
|
|
--source include/search_pattern_in_file.inc
|
|
|
|
check table t1;
|
|
select f1, f2 from t1;
|
|
drop table t1;
|
|
let $shutdown_timeout=;
|
|
--echo # Test End
|
|
--echo # ---------------------------------------------------------------
|
|
--echo #
|
|
--echo # MDEV-12600 crash during install_db with innodb_page_size=32K
|
|
--echo # and ibdata1=3M
|
|
--echo #
|
|
let bugdir= $MYSQLTEST_VARDIR/tmp/doublewrite;
|
|
--mkdir $bugdir
|
|
|
|
let $check_no_innodb=SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
|
WHERE engine = 'innodb'
|
|
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
|
|
|
--let $ibp=--innodb-log-group-home-dir=$bugdir --innodb-data-home-dir=$bugdir
|
|
--let $ibp=$ibp --innodb-undo-tablespaces=0
|
|
--let $ibp=$ibp --innodb-data-file-path=ibdata1:1M;ibdata2:1M:autoextend
|
|
|
|
--let $restart_parameters= $ibp
|
|
--source include/restart_mysqld.inc
|
|
eval $check_no_innodb;
|
|
--let SEARCH_PATTERN= \[ERROR\] InnoDB: Cannot create doublewrite buffer
|
|
--source include/search_pattern_in_file.inc
|
|
--let $restart_parameters=
|
|
--source include/restart_mysqld.inc
|
|
|
|
--remove_file $bugdir/ibdata1
|
|
--remove_file $bugdir/ibdata2
|
|
--remove_file $bugdir/ib_logfile0
|
|
--rmdir $bugdir
|