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

MDEV-21549 IMPORT TABLESPACE fails to adjust all tablespace ID in root pages

After MDEV-12353, the consistency check that I originally added for
commit 1b9fe0bb
(InnoDB Plugin for MySQL 5.1) started randomly failing.

It turns out that the IMPORT TABLESPACE code was always incorrect:
it did not update the (redundantly stored) tablespace ID
in index tree root pages. It only does that for page headers
and BLOB pointers.

PageConverter::update_index_page(): Update the tablespace ID
in the BTR_SEG_TOP and BTR_SEG_LEAF of index root pages.

This is a backport of commit b8b3edff.
parent a215e213
/*****************************************************************************
Copyright (c) 2012, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2015, 2018, MariaDB Corporation.
Copyright (c) 2015, 2020, 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
......@@ -1924,6 +1924,23 @@ PageConverter::update_index_page(
return(DB_SUCCESS);
}
if (m_index && block->page.offset == m_index->m_page_no) {
byte *b = FIL_PAGE_DATA + PAGE_BTR_SEG_LEAF + FSEG_HDR_SPACE
+ page;
mach_write_to_4(b, block->page.space);
memcpy(FIL_PAGE_DATA + PAGE_BTR_SEG_TOP + FSEG_HDR_SPACE
+ page, b, 4);
if (UNIV_LIKELY_NULL(block->page.zip.data)) {
memcpy(&block->page.zip.data[FIL_PAGE_DATA
+ PAGE_BTR_SEG_TOP
+ FSEG_HDR_SPACE], b, 4);
memcpy(&block->page.zip.data[FIL_PAGE_DATA
+ PAGE_BTR_SEG_LEAF
+ FSEG_HDR_SPACE], b, 4);
}
}
#ifdef UNIV_ZIP_DEBUG
ut_a(!is_compressed_table()
|| page_zip_validate(m_page_zip_ptr, page, m_index->m_srv_index));
......
/*****************************************************************************
Copyright (c) 2012, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2015, 2018, MariaDB Corporation.
Copyright (c) 2015, 2020, 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
......@@ -1353,8 +1353,8 @@ row_import::match_schema(
return(DB_ERROR);
} else if (m_table->n_cols != m_n_cols) {
ib_errf(thd, IB_LOG_LEVEL_ERROR, ER_TABLE_SCHEMA_MISMATCH,
"Number of columns don't match, table has %u"
" columns but the tablespace meta-data file has "
"Number of columns don't match, table has %u "
"columns but the tablespace meta-data file has "
ULINTPF " columns",
m_table->n_cols, m_n_cols);
......@@ -1924,6 +1924,23 @@ PageConverter::update_index_page(
return(DB_SUCCESS);
}
if (m_index && block->page.offset == m_index->m_page_no) {
byte *b = FIL_PAGE_DATA + PAGE_BTR_SEG_LEAF + FSEG_HDR_SPACE
+ page;
mach_write_to_4(b, block->page.space);
memcpy(FIL_PAGE_DATA + PAGE_BTR_SEG_TOP + FSEG_HDR_SPACE
+ page, b, 4);
if (UNIV_LIKELY_NULL(block->page.zip.data)) {
memcpy(&block->page.zip.data[FIL_PAGE_DATA
+ PAGE_BTR_SEG_TOP
+ FSEG_HDR_SPACE], b, 4);
memcpy(&block->page.zip.data[FIL_PAGE_DATA
+ PAGE_BTR_SEG_LEAF
+ FSEG_HDR_SPACE], b, 4);
}
}
#ifdef UNIV_ZIP_DEBUG
ut_a(!is_compressed_table()
|| page_zip_validate(m_page_zip_ptr, page, m_index->m_srv_index));
......
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