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) 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 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
...@@ -1924,6 +1924,23 @@ PageConverter::update_index_page( ...@@ -1924,6 +1924,23 @@ PageConverter::update_index_page(
return(DB_SUCCESS); 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 #ifdef UNIV_ZIP_DEBUG
ut_a(!is_compressed_table() ut_a(!is_compressed_table()
|| page_zip_validate(m_page_zip_ptr, page, m_index->m_srv_index)); || 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) 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 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
...@@ -1353,8 +1353,8 @@ row_import::match_schema( ...@@ -1353,8 +1353,8 @@ row_import::match_schema(
return(DB_ERROR); return(DB_ERROR);
} else if (m_table->n_cols != m_n_cols) { } else if (m_table->n_cols != m_n_cols) {
ib_errf(thd, IB_LOG_LEVEL_ERROR, ER_TABLE_SCHEMA_MISMATCH, ib_errf(thd, IB_LOG_LEVEL_ERROR, ER_TABLE_SCHEMA_MISMATCH,
"Number of columns don't match, table has %u" "Number of columns don't match, table has %u "
" columns but the tablespace meta-data file has " "columns but the tablespace meta-data file has "
ULINTPF " columns", ULINTPF " columns",
m_table->n_cols, m_n_cols); m_table->n_cols, m_n_cols);
...@@ -1924,6 +1924,23 @@ PageConverter::update_index_page( ...@@ -1924,6 +1924,23 @@ PageConverter::update_index_page(
return(DB_SUCCESS); 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 #ifdef UNIV_ZIP_DEBUG
ut_a(!is_compressed_table() ut_a(!is_compressed_table()
|| page_zip_validate(m_page_zip_ptr, page, m_index->m_srv_index)); || 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