Commit a8650b64 authored by Marko Mäkelä's avatar Marko Mäkelä

MDEV-25110 [FATAL] InnoDB: Trying to write ... outside the bounds

In commit 118e258a (part of MDEV-23855)
we inadvertently broke crash recovery, reintroducing MDEV-11556.

fil_system_t::extend_to_recv_size(): Extend all open tablespace files
to the recovered size.

recv_sys_t::apply(): Invoke fil_system.extend_to_recv_size() at the
start of each batch. In this way, any fil_space_t::recv_size
changes that were parsed after the file was opened will be applied.
parent 549a70d7
...@@ -1305,6 +1305,33 @@ void fil_system_t::close() ...@@ -1305,6 +1305,33 @@ void fil_system_t::close()
#endif /* UNIV_LINUX */ #endif /* UNIV_LINUX */
} }
/** Extend all open data files to the recovered size */
ATTRIBUTE_COLD void fil_system_t::extend_to_recv_size()
{
ut_ad(is_initialised());
mutex_enter(&mutex);
for (fil_space_t *space= UT_LIST_GET_FIRST(fil_system.space_list); space;
space= UT_LIST_GET_NEXT(space_list, space))
{
const uint32_t size= space->recv_size;
if (size > space->size)
{
if (space->is_closing())
continue;
space->reacquire();
bool success;
while (fil_space_extend_must_retry(space, UT_LIST_GET_LAST(space->chain),
size, &success))
mutex_enter(&mutex);
/* Crash recovery requires the file extension to succeed. */
ut_a(success);
space->release();
}
}
mutex_exit(&mutex);
}
/** Close all tablespace files at shutdown */ /** Close all tablespace files at shutdown */
void fil_space_t::close_all() void fil_space_t::close_all()
{ {
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2013, 2020, MariaDB Corporation. Copyright (c) 2013, 2021, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -1422,6 +1422,9 @@ struct fil_system_t { ...@@ -1422,6 +1422,9 @@ struct fil_system_t {
@retval NULL if this was the last */ @retval NULL if this was the last */
inline fil_space_t* keyrotate_next(fil_space_t *space, bool recheck, inline fil_space_t* keyrotate_next(fil_space_t *space, bool recheck,
bool encrypt); bool encrypt);
/** Extend all open data files to the recovered size */
ATTRIBUTE_COLD void extend_to_recv_size();
}; };
/** The tablespace memory cache. */ /** The tablespace memory cache. */
......
...@@ -2662,6 +2662,8 @@ void recv_sys_t::apply(bool last_batch) ...@@ -2662,6 +2662,8 @@ void recv_sys_t::apply(bool last_batch)
trim(page_id_t(id + srv_undo_space_id_start, t.pages), t.lsn); trim(page_id_t(id + srv_undo_space_id_start, t.pages), t.lsn);
} }
fil_system.extend_to_recv_size();
buf_block_t *free_block= buf_LRU_get_free_block(false); buf_block_t *free_block= buf_LRU_get_free_block(false);
for (map::iterator p= pages.begin(); p != pages.end(); ) for (map::iterator p= pages.begin(); p != pages.end(); )
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment