Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 36 additions & 25 deletions storage/innobase/fsp/fsp0fsp.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4610,13 +4610,6 @@ class PageOperator final
@return error code */
dberr_t alloc_from_fseg_prepare() noexcept
{
uint32_t n_used= xdes_get_n_used(m_new_descr);
if (n_used < 1 || n_used >= m_extent_size)
return DB_CORRUPTION;

if (n_used < m_extent_size)
return DB_SUCCESS;

byte *lst= m_iblock->page.frame + uint16_t(m_ioffset + FSEG_NOT_FULL);
if (!mach_read_from_4(lst + FLST_LEN))
return DB_CORRUPTION;
Expand Down Expand Up @@ -4683,13 +4676,6 @@ class PageOperator final
@return error code */
dberr_t alloc_from_free_frag_prepare() noexcept
{
uint32_t n_used= xdes_get_n_used(m_new_descr);
if (n_used < 1 || n_used >= m_extent_size)
return DB_CORRUPTION;

if (n_used < m_extent_size)
return DB_SUCCESS;

byte *lst= m_header_block->page.frame + FSP_HEADER_OFFSET + FSP_FREE_FRAG;
if (!mach_read_from_4(lst + FLST_LEN))
return DB_CORRUPTION;
Expand Down Expand Up @@ -5088,10 +5074,14 @@ class PageOperator final
/* Allocate the page from file segment */
if (m_seg_id != FIL_NULL && m_new_state == XDES_FSEG &&
mach_read_from_8(m_new_descr + XDES_ID) == m_seg_id)
err= alloc_from_fseg_prepare();
err= (n_used + 1 == m_extent_size)
? alloc_from_fseg_prepare()
: DB_SUCCESS;
/* Allocate the page from free frag */
else if (m_new_state == XDES_FREE_FRAG || m_new_state == XDES_FULL_FRAG)
err= alloc_from_free_frag_prepare();
err= (n_used + 1 == m_extent_size)
? alloc_from_free_frag_prepare()
: DB_SUCCESS;
else return DB_CORRUPTION;

if (err) return err;
Expand Down Expand Up @@ -5376,10 +5366,30 @@ class SpaceDefragmenter final

sql_print_information("InnoDB: System tablespace defragmentation "
"process starts");
sql_print_information("InnoDB: Moving the data from extents %"
PRIu32 " through %" PRIu32,
m_extent_map.begin()->first,
m_extent_map.rbegin()->first);

if (m_extent_map.size() == 1)
{
auto it= m_extent_map.begin();
sql_print_information("InnoDB: Moving the data from extent "
"%" PRIu32 " to extent %" PRIu32, it->first,
it->second);
}
else
{
sql_print_information("InnoDB: Moving the data from extents "
"%" PRIu32 " through %" PRIu32,
m_extent_map.begin()->first,
m_extent_map.rbegin()->first);

uint32_t min_dest= UINT32_MAX, max_dest= 0;
for (const auto &entry : m_extent_map)
{
min_dest= std::min(min_dest, entry.second);
max_dest= std::max(max_dest, entry.second);
}
sql_print_information("InnoDB: Destination extent range: "
"%" PRIu32 " through %" PRIu32, min_dest, max_dest);
}
return DB_SUCCESS;
}

Expand Down Expand Up @@ -5626,6 +5636,12 @@ dberr_t IndexDefragmenter::defragment_level(
block->page.frame + FIL_PAGE_TYPE,
srv_page_size - FIL_PAGE_TYPE - 8);

if (level)
{
err= get_child_pages(new_block);
if (err) goto err_exit;
}

/* Assign the new block page number in left, right
and parent block */
related_pages.complete(new_page_no, parent_offset);
Expand All @@ -5635,11 +5651,6 @@ dberr_t IndexDefragmenter::defragment_level(
/* Add the new page in inode fragment array */
operation.assign_frag_slot();

if (level)
{
err= get_child_pages(new_block);
if (err) return err;
}
goto fetch_next_page;
}

Expand Down
Loading