summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2021-03-17 16:17:22 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2021-03-17 16:17:22 +0200
commitf92e32bb52e4010194ca6be5b33de045561ec70e (patch)
treefdd75ec947b2eb265bc414a09eea27ae5d27066e
parent4d7bf30b6a8e4624464d61118424b78f01e6495c (diff)
downloadmariadb-git-bb-10.2-MDEV-25121.tar.gz
MDEV-25121: innodb_flush_method=O_DIRECT was refused on page_compressedbb-10.2-MDEV-25121
Tests on a storage with 4096-byte sector size confirm that it is safe to use O_DIRECT with page_compressed tables. The fil_node_t::block_size was being set mostly correctly until commit 10dd290b4b8b8b235c8cf42e100f0a4415629e79 (MDEV-17380) introduced a regression in MariaDB Server 10.4.4. fil_node_t::read_page0(): Initialize fil_node_t::block_size. This will probably make similar code in fil_space_extend_must_retry() redundant, but we play it safe and will not remove that code.
-rw-r--r--storage/innobase/fil/fil0fil.cc40
1 files changed, 27 insertions, 13 deletions
diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc
index 5adbd4df69e..659cfa26033 100644
--- a/storage/innobase/fil/fil0fil.cc
+++ b/storage/innobase/fil/fil0fil.cc
@@ -566,6 +566,10 @@ bool fil_node_t::read_page0(bool first)
this->size = ulint(size_bytes / psize);
space->committed_size = space->size += this->size;
+
+ if (block_size == 0) {
+ block_size = os_file_get_block_size(handle, name);
+ }
} else if (space->id != TRX_SYS_SPACE || space->size_in_header) {
/* If this is not the first-time open, do nothing.
For the system tablespace, we always get invoked as
@@ -605,12 +609,15 @@ static bool fil_node_open_file(fil_node_t* node)
const bool first_time_open = node->size == 0;
- bool o_direct_possible = !FSP_FLAGS_HAS_PAGE_COMPRESSION(space->flags);
- if (const ulint ssize = FSP_FLAGS_GET_ZIP_SSIZE(space->flags)) {
- compile_time_assert(((UNIV_ZIP_SIZE_MIN >> 1) << 3) == 4096);
- if (ssize < 3) {
- o_direct_possible = false;
- }
+ ulint type;
+ compile_time_assert(((UNIV_ZIP_SIZE_MIN >> 1) << 3) == 4096);
+ switch (FSP_FLAGS_GET_ZIP_SSIZE(space->flags)) {
+ case 1:
+ case 2:
+ type = OS_DATA_FILE_NO_O_DIRECT;
+ break;
+ default:
+ type = OS_DATA_FILE;
}
if (first_time_open
@@ -632,9 +639,7 @@ retry:
? OS_FILE_OPEN_RAW | OS_FILE_ON_ERROR_NO_EXIT
: OS_FILE_OPEN | OS_FILE_ON_ERROR_NO_EXIT,
OS_FILE_AIO,
- o_direct_possible
- ? OS_DATA_FILE
- : OS_DATA_FILE_NO_O_DIRECT,
+ type,
read_only_mode,
&success);
@@ -668,9 +673,7 @@ retry:
? OS_FILE_OPEN_RAW | OS_FILE_ON_ERROR_NO_EXIT
: OS_FILE_OPEN | OS_FILE_ON_ERROR_NO_EXIT,
OS_FILE_AIO,
- o_direct_possible
- ? OS_DATA_FILE
- : OS_DATA_FILE_NO_O_DIRECT,
+ type,
read_only_mode,
&success);
}
@@ -3601,11 +3604,22 @@ fil_ibd_create(
return(err);
}
+ ulint type;
+ compile_time_assert(((UNIV_ZIP_SIZE_MIN >> 1) << 3) == 4096);
+ switch (FSP_FLAGS_GET_ZIP_SSIZE(flags)) {
+ case 1:
+ case 2:
+ type = OS_DATA_FILE_NO_O_DIRECT;
+ break;
+ default:
+ type = OS_DATA_FILE;
+ }
+
file = os_file_create(
innodb_data_file_key, path,
OS_FILE_CREATE | OS_FILE_ON_ERROR_NO_EXIT,
OS_FILE_NORMAL,
- OS_DATA_FILE,
+ type,
srv_read_only_mode,
&success);