mirror of
https://github.com/MariaDB/server.git
synced 2025-01-30 18:41:56 +01:00
MDEV-25110 [FATAL] InnoDB: Trying to write ... outside the bounds
In commit 118e258aaa
(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.
This commit is contained in:
parent
549a70d7f0
commit
a8650b64ed
3 changed files with 33 additions and 1 deletions
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*****************************************************************************
|
||||
|
||||
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 @@ public:
|
|||
@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(); )
|
||||
|
|
Loading…
Add table
Reference in a new issue