Commit a2c3ba24 authored by Annamalai Gurusami's avatar Annamalai Gurusami

Merging from mysql-5.1 to mysql-5.5.

parents d97caadc 180a2378
...@@ -2702,7 +2702,7 @@ retry: ...@@ -2702,7 +2702,7 @@ retry:
mutex_exit(&fil_system->mutex); mutex_exit(&fil_system->mutex);
#ifndef UNIV_HOTBACKUP #ifndef UNIV_HOTBACKUP
if (success) { if (success && !recv_recovery_on) {
mtr_t mtr; mtr_t mtr;
mtr_start(&mtr); mtr_start(&mtr);
...@@ -4947,3 +4947,28 @@ fil_close(void) ...@@ -4947,3 +4947,28 @@ fil_close(void)
fil_system = NULL; fil_system = NULL;
} }
/****************************************************************//**
Generate redo logs for swapping two .ibd files */
UNIV_INTERN
void
fil_mtr_rename_log(
/*===============*/
ulint old_space_id, /*!< in: tablespace id of the old
table. */
const char* old_name, /*!< in: old table name */
ulint new_space_id, /*!< in: tablespace id of the new
table */
const char* new_name, /*!< in: new table name */
const char* tmp_name) /*!< in: temp table name used while
swapping */
{
mtr_t mtr;
mtr_start(&mtr);
fil_op_write_log(MLOG_FILE_RENAME, old_space_id,
0, 0, old_name, tmp_name, &mtr);
fil_op_write_log(MLOG_FILE_RENAME, new_space_id,
0, 0, new_name, old_name, &mtr);
mtr_commit(&mtr);
}
...@@ -734,6 +734,21 @@ fil_tablespace_is_being_deleted( ...@@ -734,6 +734,21 @@ fil_tablespace_is_being_deleted(
/*============================*/ /*============================*/
ulint id); /*!< in: space id */ ulint id); /*!< in: space id */
/****************************************************************//**
Generate redo logs for swapping two .ibd files */
UNIV_INTERN
void
fil_mtr_rename_log(
/*===============*/
ulint old_space_id, /*!< in: tablespace id of the old
table. */
const char* old_name, /*!< in: old table name */
ulint new_space_id, /*!< in: tablespace id of the new
table */
const char* new_name, /*!< in: new table name */
const char* tmp_name); /*!< in: temp table name used while
swapping */
typedef struct fil_space_struct fil_space_t; typedef struct fil_space_struct fil_space_t;
#endif #endif
...@@ -965,8 +965,11 @@ recv_parse_or_apply_log_rec_body( ...@@ -965,8 +965,11 @@ recv_parse_or_apply_log_rec_body(
not NULL, then the log record is not NULL, then the log record is
applied to the page, and the log applied to the page, and the log
record should be complete then */ record should be complete then */
mtr_t* mtr) /*!< in: mtr or NULL; should be non-NULL mtr_t* mtr, /*!< in: mtr or NULL; should be non-NULL
if and only if block is non-NULL */ if and only if block is non-NULL */
ulint space_id)
/*!< in: tablespace id obtained by
parsing initial log record */
{ {
dict_index_t* index = NULL; dict_index_t* index = NULL;
page_t* page; page_t* page;
...@@ -1238,8 +1241,11 @@ recv_parse_or_apply_log_rec_body( ...@@ -1238,8 +1241,11 @@ recv_parse_or_apply_log_rec_body(
ut_ad(!page || page_type != FIL_PAGE_TYPE_ALLOCATED); ut_ad(!page || page_type != FIL_PAGE_TYPE_ALLOCATED);
ptr = mlog_parse_string(ptr, end_ptr, page, page_zip); ptr = mlog_parse_string(ptr, end_ptr, page, page_zip);
break; break;
case MLOG_FILE_CREATE:
case MLOG_FILE_RENAME: case MLOG_FILE_RENAME:
ptr = fil_op_log_parse_or_replay(ptr, end_ptr, type,
space_id, 0);
break;
case MLOG_FILE_CREATE:
case MLOG_FILE_DELETE: case MLOG_FILE_DELETE:
case MLOG_FILE_CREATE2: case MLOG_FILE_CREATE2:
ptr = fil_op_log_parse_or_replay(ptr, end_ptr, type, 0, 0); ptr = fil_op_log_parse_or_replay(ptr, end_ptr, type, 0, 0);
...@@ -1611,7 +1617,8 @@ recv_recover_page_func( ...@@ -1611,7 +1617,8 @@ recv_recover_page_func(
recv_parse_or_apply_log_rec_body(recv->type, buf, recv_parse_or_apply_log_rec_body(recv->type, buf,
buf + recv->len, buf + recv->len,
block, &mtr); block, &mtr,
recv_addr->space);
end_lsn = recv->start_lsn + recv->len; end_lsn = recv->start_lsn + recv->len;
mach_write_to_8(FIL_PAGE_LSN + page, end_lsn); mach_write_to_8(FIL_PAGE_LSN + page, end_lsn);
...@@ -2078,7 +2085,7 @@ recv_parse_log_rec( ...@@ -2078,7 +2085,7 @@ recv_parse_log_rec(
#endif /* UNIV_LOG_LSN_DEBUG */ #endif /* UNIV_LOG_LSN_DEBUG */
new_ptr = recv_parse_or_apply_log_rec_body(*type, new_ptr, end_ptr, new_ptr = recv_parse_or_apply_log_rec_body(*type, new_ptr, end_ptr,
NULL, NULL); NULL, NULL, *space);
if (UNIV_UNLIKELY(new_ptr == NULL)) { if (UNIV_UNLIKELY(new_ptr == NULL)) {
return(0); return(0);
......
...@@ -2494,6 +2494,28 @@ row_merge_rename_tables( ...@@ -2494,6 +2494,28 @@ row_merge_rename_tables(
goto err_exit; goto err_exit;
} }
/* Generate the redo logs for file operations */
fil_mtr_rename_log(old_table->space, old_name,
new_table->space, new_table->name, tmp_name);
/* What if the redo logs are flushed to disk here? This is
tested with following crash point */
DBUG_EXECUTE_IF("bug14669848_precommit", log_buffer_flush_to_disk();
DBUG_SUICIDE(););
/* File operations cannot be rolled back. So, before proceeding
with file operations, commit the dictionary changes.*/
trx_commit_for_mysql(trx);
/* If server crashes here, the dictionary in InnoDB and MySQL
will differ. The .ibd files and the .frm files must be swapped
manually by the administrator. No loss of data. */
DBUG_EXECUTE_IF("bug14669848", DBUG_SUICIDE(););
/* Ensure that the redo logs are flushed to disk. The config
innodb_flush_log_at_trx_commit must not affect this. */
log_buffer_flush_to_disk();
/* The following calls will also rename the .ibd data files if /* The following calls will also rename the .ibd data files if
the tables are stored in a single-table tablespace */ the tables are stored in a single-table tablespace */
......
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