Description:
There are some test cases failed in 4k sector disk when using 'innodb_flush_method=O_DIRECT'.
some failed test cases:
innodb.tablespace_encrypt_1 innodb.row_format innodb_fts.zip innodb.readahead innodb.create_tablespace_16k innodb.sdi_compressed innodb_fts.create_index_fail_with_disable_sort_file_cache innodb.check_ibd_filesize_16k innodb.innodb_stats_auto_recalc_on_nonexistent innodb.alter_page_size innodb_fts.tablespace_location innodb.alter_kill innodb.default_row_format_tablespace innodb.partition-16k innodb.create_tablespace_8k innodb.create_tablespace_4k innodb.default_row_format innodb.virtual_index innodb.zlob_geom.
How to repeat:
1. run mtr test case with --mysqld=--innodb_flush_method=O_DIRECT in 4k sector disk:
./mtr --mysqld=--innodb_flush_method=O_DIRECT innodb.readahead
2. the result is:
CURRENT_TEST: innodb.readahead
mysqltest: At line 5: Query 'CREATE TABLE t1 (a INT NOT NULL, d INT NOT NULL, b BLOB NOT NULL, c
TEXT, INDEX(d), INDEX(a), KEY (b(10), a, d), INDEX(c(120), b(120)),
INDEX(b(5), c(10), a) ) charset latin1 ENGINE=INNODB ROW_FORMAT=COMPRESSED
KEY_BLOCK_SIZE=1' failed.
ERROR 3675 (HY000): Create table/tablespace 't1' failed, as disk is full.
Suggested fix:
When using direct IO, the IO size needs to be aligned to sector size.
There are some IO operations whose sizes are not aligned to 4k in innodb.