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()
#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 */
void fil_space_t::close_all()
{
......
/*****************************************************************************
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
the terms of the GNU General Public License as published by the Free Software
......@@ -1422,6 +1422,9 @@ struct fil_system_t {
@retval NULL if this was the last */
inline fil_space_t* keyrotate_next(fil_space_t *space, bool recheck,
bool encrypt);
/** Extend all open data files to the recovered size */
ATTRIBUTE_COLD void extend_to_recv_size();
};
/** The tablespace memory cache. */
......
......@@ -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);
}
fil_system.extend_to_recv_size();
buf_block_t *free_block= buf_LRU_get_free_block(false);
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