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:
Marko Mäkelä 2021-03-10 19:33:09 +02:00
parent 549a70d7f0
commit a8650b64ed
3 changed files with 33 additions and 1 deletions
storage/innobase

View file

@ -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()
{ {

View file

@ -1,7 +1,7 @@
/***************************************************************************** /*****************************************************************************
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 @@ public:
@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. */

View file

@ -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(); )