FreeBSD Bugzilla – Attachment 227833 Details for
Bug 257958
databases/mariadb103-server: mysqld got signal 6: Failing assertion: page_is_comp(next_page) == page_is_comp(page)
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
patch for MariaDB 10.3 and 10.4
patch-MDEV-26537 (text/plain), 5.19 KB, created by
Bernard Spil
on 2021-09-11 12:53:43 UTC
(
hide
)
Description:
patch for MariaDB 10.3 and 10.4
Filename:
MIME Type:
Creator:
Bernard Spil
Created:
2021-09-11 12:53:43 UTC
Size:
5.19 KB
patch
obsolete
>From d09426f9e60fd93296464ec9eb5f9d85566437d3 Mon Sep 17 00:00:00 2001 >From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= <marko.makela@mariadb.com> >Date: Fri, 10 Sep 2021 19:15:41 +0300 >Subject: [PATCH] MDEV-26537 InnoDB corrupts files due to incorrect st_blksize > calculation > >The st_blksize returned by fstat(2) is not documented to be >a power of 2, like we assumed in >commit 58252fff15acfe7c7b0452a87e202e3f8e454e19 (MDEV-26040). >While on Linux, the st_blksize appears to report the file system >block size (which hopefully is not smaller than the sector size >of the underlying block device), on FreeBSD we observed >st_blksize values that might have been something similar to st_size. > >Also IBM AIX was affected by this. A simple test case would >lead to a crash when using the minimum innodb_buffer_pool_size=5m >on both FreeBSD and AIX: > >seq -f 'create table t%g engine=innodb select * from seq_1_to_200000;' \ >1 100|mysql test& >seq -f 'create table u%g engine=innodb select * from seq_1_to_200000;' \ >1 100|mysql test& > >We will fix this by not trusting st_blksize at all, and assuming that >the smallest allowed write size (for O_DIRECT) is 4096 bytes. We hope >that no storage systems with larger block size exist. Anything larger >than 4096 bytes should be unlikely, given that it is the minimum >virtual memory page size of many contemporary processors. > >MariaDB Server on Microsoft Windows was not affected by this. > >While the 512-byte sector size of the venerable Seagate ST-225 is still >in widespread use, the minimum innodb_page_size is 4096 bytes, and >innodb_log_file_size can be set in integer multiples of 65536 bytes. > >The only occasion where InnoDB uses smaller data file block sizes than >4096 bytes is with ROW_FORMAT=COMPRESSED tables with KEY_BLOCK_SIZE=1 >or KEY_BLOCK_SIZE=2 (or innodb_page_size=4096). For such tables, >we will from now on preallocate space in integer multiples of 4096 bytes >and let regular writes extend the file by 1024, 2048, or 3072 bytes. > >The view INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES.FS_BLOCK_SIZE >should report the raw st_blksize. > >For page_compressed tables, the function fil_space_get_block_size() >will map to 512 any st_blksize value that is larger than 4096. > >os_file_set_size(): Assume that the file system block size is 4096 bytes, >and only support extending files to integer multiples of 4096 bytes. > >fil_space_extend_must_retry(): Round down the preallocation size to >an integer multiple of 4096 bytes. >--- mysql-test/suite/innodb/t/check_ibd_filesize.test.orig 2021-08-02 10:58:56 UTC >+++ mysql-test/suite/innodb/t/check_ibd_filesize.test >@@ -46,6 +46,12 @@ perl; > print "# bytes: ", (-s "$ENV{MYSQLD_DATADIR}/test/t1.ibd"), "\n"; > EOF > INSERT INTO t1 SELECT seq,REPEAT('a',30000) FROM seq_1_to_20; >+# Ensure that the file will be extended with the last 1024-byte page >+# after the file was pre-extended in 4096-byte increments. >+--disable_query_log >+FLUSH TABLE t1 FOR EXPORT; >+UNLOCK TABLES; >+--enable_query_log > perl; > print "# bytes: ", (-s "$ENV{MYSQLD_DATADIR}/test/t1.ibd"), "\n"; > EOF > mysql-test/suite/innodb/t/check_ibd_filesize.test | 6 ++++++ > storage/innobase/fil/fil0fil.cc | 13 +++++++++---- > storage/innobase/os/os0file.cc | 7 ++++--- > 3 files changed, 19 insertions(+), 7 deletions(-) > >--- storage/innobase/fil/fil0fil.cc.orig 2021-08-02 10:58:57 UTC >+++ storage/innobase/fil/fil0fil.cc >@@ -942,11 +942,17 @@ fil_space_extend_must_retry( > const page_size_t pageSize(space->flags); > const ulint page_size = pageSize.physical(); > >- /* fil_read_first_page() expects srv_page_size bytes. >- fil_node_open_file() expects at least 4 * srv_page_size bytes.*/ >- os_offset_t new_size = std::max( >- os_offset_t(size - file_start_page_no) * page_size, >+ /* fil_read_first_page() expects innodb_page_size bytes. >+ fil_node_open_file() expects at least 4 * innodb_page_size bytes. >+ os_file_set_size() expects multiples of 4096 bytes. >+ For ROW_FORMAT=COMPRESSED tables using 1024-byte or 2048-byte >+ pages, we will preallocate up to an integer multiple of 4096 bytes, >+ and let normal writes append 1024, 2048, or 3072 bytes to the file. */ >+ os_offset_t new_size = std::max( >+ (os_offset_t(size - file_start_page_no) * page_size) >+ & ~os_offset_t(4095), > os_offset_t(FIL_IBD_FILE_INITIAL_SIZE << srv_page_size_shift)); >+ > > *success = os_file_set_size(node->name, node->handle, new_size, > FSP_FLAGS_HAS_PAGE_COMPRESSION(space->flags)); >--- storage/innobase/os/os0file.cc.orig 2021-08-02 10:58:57 UTC >+++ storage/innobase/os/os0file.cc >@@ -5351,6 +5351,8 @@ os_file_set_size( > os_offset_t size, > bool is_sparse) > { >+ ut_ad(!(size & 4095)); >+ > #ifdef _WIN32 > /* On Windows, changing file size works well and as expected for both > sparse and normal files. >@@ -5392,7 +5394,7 @@ fallback: > if (current_size >= size) { > return true; > } >- current_size &= ~os_offset_t(statbuf.st_blksize - 1); >+ current_size &= ~4095ULL; > err = posix_fallocate(file, current_size, > size - current_size); > } >@@ -5432,8 +5434,7 @@ fallback: > if (fstat(file, &statbuf)) { > return false; > } >- os_offset_t current_size = statbuf.st_size >- & ~os_offset_t(statbuf.st_blksize - 1); >+ os_offset_t current_size = statbuf.st_size & ~4095ULL; > #endif > if (current_size >= size) { > return true;
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
brnrd
:
maintainer-approval+
Actions:
View
|
Diff
Attachments on
bug 257958
:
227335
| 227833