mirror of
https://github.com/MariaDB/server.git
synced 2025-01-28 01:34:17 +01:00
MDEV-30069 InnoDB: Trying to write ... bytes at ... outside the bounds
recv_sys_t::recover_deferred(): If the *.ibd file already exists, adjust the size to the tablespace metadata. It could be that in a multi-batch recovery, we will initially recover an all-zero *.ibd file to a smaller size, and then a fatal error would be reported during the last recovery batch. This bug could be worked around by executing the recovery again. During the initial (failed) recovery attempt, something should have been written to the first page of the file and the file size should be recovered by fil_node_t::read_page0().
This commit is contained in:
parent
377ec1b5c9
commit
46f8c46e94
1 changed files with 14 additions and 0 deletions
|
@ -986,6 +986,20 @@ bool recv_sys_t::recover_deferred(recv_sys_t::map::iterator &p,
|
|||
DB_SUCCESS == os_file_punch_hole(node->handle, 0, 4096) &&
|
||||
!my_test_if_thinly_provisioned(node->handle);
|
||||
#endif
|
||||
/* Mimic fil_node_t::read_page0() in case the file exists and
|
||||
has already been extended to a larger size. */
|
||||
ut_ad(node->size == size);
|
||||
const os_offset_t file_size= os_file_get_size(node->handle);
|
||||
if (file_size != os_offset_t(-1))
|
||||
{
|
||||
const uint32_t n_pages=
|
||||
uint32_t(file_size / fil_space_t::physical_size(flags));
|
||||
if (n_pages > size)
|
||||
{
|
||||
space->size= node->size= n_pages;
|
||||
space->set_committed_size();
|
||||
}
|
||||
}
|
||||
if (!os_file_set_size(node->name, node->handle,
|
||||
(size * fil_space_t::physical_size(flags)) &
|
||||
~4095ULL, is_sparse))
|
||||
|
|
Loading…
Add table
Reference in a new issue