mirror of
https://github.com/MariaDB/server.git
synced 2025-01-30 18:41:56 +01:00
cf2a4426a2
This is a backport of commit0bc36758ba
and commit9eb3fcc9fb
. InnoDB in MariaDB 10.2 appears to only write MLOG_FILE_RENAME2 redo log records during table-rebuilding ALGORITHM=INPLACE operations. We must write the records for any .ibd file renames, so that the operations are crash-safe. If InnoDB is killed during a RENAME TABLE operation, it can happen that the transaction for updating the data dictionary will be rolled back. But, nothing will roll back the renaming of the .ibd file (the MLOG_FILE_RENAME2 only guarantees roll-forward), or for that matter, the renaming of the dict_table_t::name in the dict_sys cache. We introduce the undo log record TRX_UNDO_RENAME_TABLE to fix this. fil_space_for_table_exists_in_mem(): Remove the parameters adjust_space, table_id and some code that was trying to work around these deficiencies. fil_name_write_rename(): Write a MLOG_FILE_RENAME2 record. dict_table_rename_in_cache(): Invoke fil_name_write_rename(). trx_undo_rec_copy(): Set the first 2 bytes to the length of the copied undo log record. trx_undo_page_report_rename(), trx_undo_report_rename(): Write a TRX_UNDO_RENAME_TABLE record with the old table name. row_rename_table_for_mysql(): Invoke trx_undo_report_rename() before modifying any data dictionary tables. row_undo_ins_parse_undo_rec(): Roll back TRX_UNDO_RENAME_TABLE by invoking dict_table_rename_in_cache(), which will take care of both renaming the table and the file. ha_innobase::truncate(): Remove a work-around.
102 lines
3.1 KiB
Text
102 lines
3.1 KiB
Text
/*****************************************************************************
|
|
|
|
Copyright (c) 1996, 2014, Oracle and/or its affiliates. All Rights Reserved.
|
|
|
|
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
|
|
Foundation; version 2 of the License.
|
|
|
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License along with
|
|
this program; if not, write to the Free Software Foundation, Inc.,
|
|
51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
|
|
|
|
*****************************************************************************/
|
|
|
|
/**************************************************//**
|
|
@file include/trx0rec.ic
|
|
Transaction undo log record
|
|
|
|
Created 3/26/1996 Heikki Tuuri
|
|
*******************************************************/
|
|
|
|
/**********************************************************************//**
|
|
Reads from an undo log record the record type.
|
|
@return record type */
|
|
UNIV_INLINE
|
|
ulint
|
|
trx_undo_rec_get_type(
|
|
/*==================*/
|
|
const trx_undo_rec_t* undo_rec) /*!< in: undo log record */
|
|
{
|
|
return(mach_read_from_1(undo_rec + 2) & (TRX_UNDO_CMPL_INFO_MULT - 1));
|
|
}
|
|
|
|
/**********************************************************************//**
|
|
Reads from an undo log record the record compiler info.
|
|
@return compiler info */
|
|
UNIV_INLINE
|
|
ulint
|
|
trx_undo_rec_get_cmpl_info(
|
|
/*=======================*/
|
|
const trx_undo_rec_t* undo_rec) /*!< in: undo log record */
|
|
{
|
|
return(mach_read_from_1(undo_rec + 2) / TRX_UNDO_CMPL_INFO_MULT);
|
|
}
|
|
|
|
/**********************************************************************//**
|
|
Returns TRUE if an undo log record contains an extern storage field.
|
|
@return TRUE if extern */
|
|
UNIV_INLINE
|
|
ibool
|
|
trx_undo_rec_get_extern_storage(
|
|
/*============================*/
|
|
const trx_undo_rec_t* undo_rec) /*!< in: undo log record */
|
|
{
|
|
if (mach_read_from_1(undo_rec + 2) & TRX_UNDO_UPD_EXTERN) {
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
return(FALSE);
|
|
}
|
|
|
|
/**********************************************************************//**
|
|
Reads the undo log record number.
|
|
@return undo no */
|
|
UNIV_INLINE
|
|
undo_no_t
|
|
trx_undo_rec_get_undo_no(
|
|
/*=====================*/
|
|
const trx_undo_rec_t* undo_rec) /*!< in: undo log record */
|
|
{
|
|
const byte* ptr;
|
|
|
|
ptr = undo_rec + 3;
|
|
|
|
return(mach_u64_read_much_compressed(ptr));
|
|
}
|
|
|
|
/***********************************************************************//**
|
|
Copies the undo record to the heap.
|
|
@return own: copy of undo log record */
|
|
UNIV_INLINE
|
|
trx_undo_rec_t*
|
|
trx_undo_rec_copy(
|
|
/*==============*/
|
|
const trx_undo_rec_t* undo_rec, /*!< in: undo log record */
|
|
mem_heap_t* heap) /*!< in: heap where copied */
|
|
{
|
|
ulint len;
|
|
|
|
len = mach_read_from_2(undo_rec)
|
|
- ut_align_offset(undo_rec, UNIV_PAGE_SIZE);
|
|
ut_ad(len < UNIV_PAGE_SIZE);
|
|
trx_undo_rec_t* rec = static_cast<trx_undo_rec_t*>(
|
|
mem_heap_dup(heap, undo_rec, len));
|
|
mach_write_to_2(rec, len);
|
|
return rec;
|
|
}
|