diff --git a/storage/innobase/btr/btr0btr.cc b/storage/innobase/btr/btr0btr.cc index a7bc8a2..722b167 100644 --- a/storage/innobase/btr/btr0btr.cc +++ b/storage/innobase/btr/btr0btr.cc @@ -1436,8 +1436,11 @@ func_exit: if (log_ptr && page_zip) { mach_write_to_1(log_ptr, z_level); mlog_close(mtr, log_ptr + 1); + mtr->inc_body_len(1); } + mtr->update_body_len(); + MONITOR_INC(MONITOR_INDEX_REORG_SUCCESSFUL); } #endif /* !UNIV_HOTBACKUP */ @@ -2996,6 +2999,8 @@ btr_set_min_rec_mark_log( /* Write rec offset as a 2-byte ulint */ mlog_catenate_ulint(mtr, page_offset(rec), MLOG_2BYTES); + + mtr->inc_and_update_body_len(2); } #else /* !UNIV_HOTBACKUP */ # define btr_set_min_rec_mark_log(rec,comp,mtr) ((void) 0) diff --git a/storage/innobase/btr/btr0cur.cc b/storage/innobase/btr/btr0cur.cc index 4060300..22350d8 100644 --- a/storage/innobase/btr/btr0cur.cc +++ b/storage/innobase/btr/btr0cur.cc @@ -3568,6 +3568,7 @@ btr_cur_update_in_place_log( return; } + const byte* log_start = log_ptr; /* For secondary indexes, we could skip writing the dummy system fields to the redo log but we have to change redo log parsing of MLOG_REC_UPDATE_IN_PLACE/MLOG_COMP_REC_UPDATE_IN_PLACE or we have to add @@ -3594,7 +3595,11 @@ btr_cur_update_in_place_log( mach_write_to_2(log_ptr, page_offset(rec)); log_ptr += 2; + mtr->inc_body_len(log_ptr - log_start); + row_upd_index_write_log(update, log_ptr, mtr); + + mtr->update_body_len(); } #endif /* UNIV_HOTBACKUP */ @@ -4680,6 +4685,8 @@ btr_cur_del_mark_set_clust_rec_log( return; } + const byte* log_start = log_ptr; + *log_ptr++ = 0; *log_ptr++ = 1; @@ -4688,6 +4695,8 @@ btr_cur_del_mark_set_clust_rec_log( mach_write_to_2(log_ptr, page_offset(rec)); log_ptr += 2; + mtr->inc_and_update_body_len(log_ptr - log_start); + mlog_close(mtr, log_ptr); } #endif /* !UNIV_HOTBACKUP */ @@ -4878,7 +4887,7 @@ btr_cur_del_mark_set_sec_rec_log( byte* log_ptr; ut_ad(val <= 1); - log_ptr = mlog_open(mtr, 11 + 1 + 2); + log_ptr = mlog_open(mtr, 13 + 1 + 2); if (!log_ptr) { /* Logging in mtr is switched off during crash recovery: @@ -4894,6 +4903,7 @@ btr_cur_del_mark_set_sec_rec_log( mach_write_to_2(log_ptr, page_offset(rec)); log_ptr += 2; + mtr->inc_and_update_body_len(1 + 2); mlog_close(mtr, log_ptr); } #endif /* !UNIV_HOTBACKUP */ diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index fba267e..d22499c 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -2074,7 +2074,7 @@ fil_op_write_log( ut_ad(strchr(path, OS_PATH_SEPARATOR) != NULL); ut_ad(strcmp(&path[strlen(path) - strlen(DOT_IBD)], DOT_IBD) == 0); - log_ptr = mlog_open(mtr, 11 + 4 + 2 + 1); + log_ptr = mlog_open(mtr, 13 + 4 + 2 + 1); if (log_ptr == NULL) { /* Logging in mtr is switched off during crash recovery: @@ -2122,6 +2122,9 @@ fil_op_write_log( default: ut_ad(0); } + + /* Storing zero means it will always parse log for file op */ + mtr->update_body_len(); } #ifndef UNIV_HOTBACKUP /** Write redo log for renaming a file. diff --git a/storage/innobase/fsp/fsp0fsp.cc b/storage/innobase/fsp/fsp0fsp.cc index 8894441..ad5e8db 100644 --- a/storage/innobase/fsp/fsp0fsp.cc +++ b/storage/innobase/fsp/fsp0fsp.cc @@ -793,6 +793,8 @@ fsp_init_file_page( ut_d(fsp_space_modify_check(block->page.id.space(), mtr)); mlog_write_initial_log_record(buf_block_get_frame(block), MLOG_INIT_FILE_PAGE2, mtr); + + mtr->update_body_len(); /* reset variables of mtr */ } #endif /* !UNIV_HOTBACKUP */ diff --git a/storage/innobase/gis/gis0rtree.cc b/storage/innobase/gis/gis0rtree.cc index ee89e0a..aea83a9 100644 --- a/storage/innobase/gis/gis0rtree.cc +++ b/storage/innobase/gis/gis0rtree.cc @@ -231,6 +231,8 @@ rtr_update_mbr_field_in_place( return(false); } + const byte* log_start = log_ptr; + /* Flags */ mach_write_to_1(log_ptr, flags); log_ptr++; @@ -257,6 +259,8 @@ rtr_update_mbr_field_in_place( memcpy(log_ptr, new_mbr_ptr, len); log_ptr += len; + mtr->inc_and_update_body_len(log_ptr - log_start); + mlog_close(mtr, log_ptr); return(true); diff --git a/storage/innobase/ibuf/ibuf0ibuf.cc b/storage/innobase/ibuf/ibuf0ibuf.cc index 4085bd2..00eb56d 100644 --- a/storage/innobase/ibuf/ibuf0ibuf.cc +++ b/storage/innobase/ibuf/ibuf0ibuf.cc @@ -607,6 +607,7 @@ ibuf_bitmap_page_init( #ifndef UNIV_HOTBACKUP mlog_write_initial_log_record(page, MLOG_IBUF_BITMAP_INIT, mtr); + mtr->update_body_len(); #endif /* !UNIV_HOTBACKUP */ } diff --git a/storage/innobase/include/log0log.h b/storage/innobase/include/log0log.h index 9b05033..38f0be1 100644 --- a/storage/innobase/include/log0log.h +++ b/storage/innobase/include/log0log.h @@ -550,7 +550,7 @@ or the MySQL version that created the redo log file. */ /** The redo log format identifier corresponding to the current format version. Stored in LOG_HEADER_FORMAT. */ -#define LOG_HEADER_FORMAT_CURRENT 1 +#define LOG_HEADER_FORMAT_CURRENT 2 /* @} */ #define LOG_CHECKPOINT_1 OS_FILE_LOG_BLOCK_SIZE diff --git a/storage/innobase/include/log0recv.h b/storage/innobase/include/log0recv.h index 24369ea..96c3f7f 100644 --- a/storage/innobase/include/log0recv.h +++ b/storage/innobase/include/log0recv.h @@ -345,6 +345,10 @@ struct recv_sys_t{ /*!< set when an inconsistency with the file system contents is detected during log scan or apply */ + bool no_body_len; + /*!< If true, the server is started from old + version which log body header didn't reserve + one byte for storing length of log body */ lsn_t mlog_checkpoint_lsn; /*!< the LSN of a MLOG_CHECKPOINT record, or 0 if none was parsed */ diff --git a/storage/innobase/include/mtr0log.h b/storage/innobase/include/mtr0log.h index 3819d3f..ae02e8f 100644 --- a/storage/innobase/include/mtr0log.h +++ b/storage/innobase/include/mtr0log.h @@ -113,7 +113,7 @@ mlog_catenate_string( /********************************************************//** Catenates a compressed ulint to mlog. */ UNIV_INLINE -void +ulint mlog_catenate_ulint_compressed( /*===========================*/ mtr_t* mtr, /*!< in: mtr */ @@ -121,7 +121,7 @@ mlog_catenate_ulint_compressed( /********************************************************//** Catenates a compressed 64-bit integer to mlog. */ UNIV_INLINE -void +ulint mlog_catenate_ull_compressed( /*=========================*/ mtr_t* mtr, /*!< in: mtr */ @@ -192,7 +192,9 @@ mlog_parse_initial_log_record( const byte* end_ptr,/*!< in: buffer end */ mlog_id_t* type, /*!< out: log record type: MLOG_1BYTE, ... */ ulint* space, /*!< out: space id */ - ulint* page_no);/*!< out: page number */ + ulint* page_no,/*!< out: page number */ + ulint* parsed_len); + /*!< out: length of log rec */ /********************************************************//** Parses a log record written by mlog_write_ulint or mlog_write_ull. @return parsed record end, NULL if not a complete record */ diff --git a/storage/innobase/include/mtr0log.ic b/storage/innobase/include/mtr0log.ic index d957c73..03b4e6d 100644 --- a/storage/innobase/include/mtr0log.ic +++ b/storage/innobase/include/mtr0log.ic @@ -120,7 +120,7 @@ mlog_catenate_ulint( /********************************************************//** Catenates a compressed ulint to mlog. */ UNIV_INLINE -void +ulint mlog_catenate_ulint_compressed( /*===========================*/ mtr_t* mtr, /*!< in: mtr */ @@ -133,18 +133,21 @@ mlog_catenate_ulint_compressed( /* If no logging is requested, we may return now */ if (log_ptr == NULL) { - return; + return(0); } - log_ptr += mach_write_compressed(log_ptr, val); + ulint len = mach_write_compressed(log_ptr, val); + log_ptr += len; mlog_close(mtr, log_ptr); + + return(len); } /********************************************************//** Catenates a compressed 64-bit integer to mlog. */ UNIV_INLINE -void +ulint mlog_catenate_ull_compressed( /*=========================*/ mtr_t* mtr, /*!< in: mtr */ @@ -157,12 +160,15 @@ mlog_catenate_ull_compressed( /* If no logging is requested, we may return now */ if (log_ptr == NULL) { - return; + return(0); } - log_ptr += mach_u64_write_compressed(log_ptr, val); + ulint len = mach_u64_write_compressed(log_ptr, val); + log_ptr += len; mlog_close(mtr, log_ptr); + + return(len); } /** Writes a log record about an operation. @@ -196,6 +202,12 @@ mlog_write_initial_log_record_low( log_ptr += mach_write_compressed(log_ptr, space_id); log_ptr += mach_write_compressed(log_ptr, page_no); + mtr->init_body(log_ptr); + + /* will be updated later. */ + mach_write_to_2(log_ptr, 0); + log_ptr += 2; + mtr->added_rec(); return(log_ptr); } diff --git a/storage/innobase/include/mtr0mtr.h b/storage/innobase/include/mtr0mtr.h index a0cec39..e29bc56 100644 --- a/storage/innobase/include/mtr0mtr.h +++ b/storage/innobase/include/mtr0mtr.h @@ -220,6 +220,13 @@ struct mtr_t { /** Owning mini-transaction */ mtr_t* m_mtr; + + /** Pointer where store the length of log body in one byte. */ + byte* log_len_ptr; + + /** Length of log rec body. */ + ulint log_body_len; + }; mtr_t() @@ -554,6 +561,44 @@ struct mtr_t { ++m_impl.m_n_log_recs; } + /** Store the pointer where log rec length should be + written to. */ + void init_body(byte* log_ptr) + { + ut_a(m_impl.log_len_ptr == NULL); + m_impl.log_len_ptr = log_ptr; + m_impl.log_body_len = 0; + } + + /** Increase the length of log rec */ + void inc_body_len(ulint len) + { + m_impl.log_body_len += len; + } + + /** Store the log rec length. */ + void update_body_len() + { + if (m_impl.log_len_ptr) { + if (m_impl.log_body_len <= 0xFFFF) { + mach_write_to_2(m_impl.log_len_ptr, m_impl.log_body_len); + } else { + mach_write_to_2(m_impl.log_len_ptr, 0xFFFF); + } + + m_impl.log_len_ptr = NULL; + } + + m_impl.log_body_len = 0; + } + + /** Increase and store the log rec length */ + void inc_and_update_body_len(ulint len) + { + inc_body_len(len); + update_body_len(); + } + /** Get the buffered redo log of this mini-transaction. @return redo log */ const mtr_buf_t* get_log() const diff --git a/storage/innobase/include/page0zip.ic b/storage/innobase/include/page0zip.ic index 9963fe0..d10d718 100644 --- a/storage/innobase/include/page0zip.ic +++ b/storage/innobase/include/page0zip.ic @@ -387,6 +387,7 @@ page_zip_compress_write_log_no_data( if (log_ptr) { mach_write_to_1(log_ptr, level); mlog_close(mtr, log_ptr + 1); + mtr->inc_and_update_body_len(1); } } diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc index 65efaf2..82c2676 100644 --- a/storage/innobase/log/log0recv.cc +++ b/storage/innobase/log/log0recv.cc @@ -2997,6 +2997,7 @@ recv_parse_log_rec( byte* new_ptr; *body = NULL; + ulint parsed_len = 0; UNIV_MEM_INVALID(type, sizeof *type); UNIV_MEM_INVALID(space, sizeof *space); @@ -3013,7 +3014,7 @@ recv_parse_log_rec( case MLOG_LSN | MLOG_SINGLE_REC_FLAG: case MLOG_LSN: new_ptr = mlog_parse_initial_log_record( - ptr, end_ptr, type, space, page_no); + ptr, end_ptr, type, space, page_no, &parsed_len); if (new_ptr != NULL) { const lsn_t lsn = static_cast( *space) << 32 | *page_no; @@ -3041,7 +3042,7 @@ recv_parse_log_rec( } new_ptr = mlog_parse_initial_log_record(ptr, end_ptr, type, space, - page_no); + page_no, &parsed_len); *body = new_ptr; if (UNIV_UNLIKELY(!new_ptr)) { @@ -3049,9 +3050,29 @@ recv_parse_log_rec( return(0); } +#if 0 new_ptr = recv_parse_or_apply_log_rec_body( *type, new_ptr, end_ptr, *space, *page_no, apply, NULL, NULL); +#else + if (parsed_len == 0 + || parsed_len == 0xFFFF) { + + if (parsed_len == 0xFFFF + && new_ptr + 0xFFFF > end_ptr) { + + return(0); + } + new_ptr = recv_parse_or_apply_log_rec_body( + *type, new_ptr, end_ptr, *space, *page_no, apply, NULL, NULL); + + } else if (new_ptr + parsed_len <= end_ptr) { + + new_ptr += parsed_len; + } else { + new_ptr = NULL; + } +#endif if (UNIV_UNLIKELY(new_ptr == NULL)) { return(0); @@ -4110,13 +4131,17 @@ recv_recovery_from_checkpoint_start( ut_ad(UT_LIST_GET_LEN(log_sys->log_groups) == 1); group = UT_LIST_GET_FIRST(log_sys->log_groups); + recv_sys->no_body_len = true; ut_ad(recv_sys->n_addrs == 0); contiguous_lsn = checkpoint_lsn; switch (group->format) { case 0: log_mutex_exit(); return(recv_log_format_0_recover(checkpoint_lsn)); + case 1: + break; case LOG_HEADER_FORMAT_CURRENT: + recv_sys->no_body_len = false; break; default: ut_ad(0); diff --git a/storage/innobase/mtr/mtr0log.cc b/storage/innobase/mtr/mtr0log.cc index b64e700..a61d438 100644 --- a/storage/innobase/mtr/mtr0log.cc +++ b/storage/innobase/mtr/mtr0log.cc @@ -73,7 +73,7 @@ mlog_write_initial_log_record( ut_ad(type <= MLOG_BIGGEST_TYPE); ut_ad(type > MLOG_8BYTES); - log_ptr = mlog_open(mtr, 11); + log_ptr = mlog_open(mtr, 13); /* If no logging is requested, we may return now */ if (log_ptr == NULL) { @@ -97,7 +97,9 @@ mlog_parse_initial_log_record( const byte* end_ptr,/*!< in: buffer end */ mlog_id_t* type, /*!< out: log record type: MLOG_1BYTE, ... */ ulint* space, /*!< out: space id */ - ulint* page_no)/*!< out: page number */ + ulint* page_no,/*!< out: page number */ + ulint* parsed_len) + /*!< out: length of log rec */ { if (end_ptr < ptr + 1) { @@ -120,6 +122,24 @@ mlog_parse_initial_log_record( *page_no = mach_parse_compressed(&ptr, end_ptr); } + if (ptr == NULL +#ifdef UNIV_LOG_LSN_DEBUG + || type == MLOG_LSN +#endif + || recv_sys->no_body_len) { + + *parsed_len = 0; + return(const_cast(ptr)); + } + + if (end_ptr < ptr + 2) { + + return(NULL); + } + + *parsed_len = mach_read_from_2(ptr); + ptr += 2; + return(const_cast(ptr)); } @@ -257,7 +277,7 @@ mlog_write_ulint( } if (mtr != 0) { - byte* log_ptr = mlog_open(mtr, 11 + 2 + 5); + byte* log_ptr = mlog_open(mtr, 13 + 2 + 5); /* If no logging is requested, we may return now */ @@ -266,11 +286,15 @@ mlog_write_ulint( log_ptr = mlog_write_initial_log_record_fast( ptr, type, log_ptr, mtr); + const byte* log_start = log_ptr; + mach_write_to_2(log_ptr, page_offset(ptr)); log_ptr += 2; log_ptr += mach_write_compressed(log_ptr, val); + mtr->inc_and_update_body_len(log_ptr - log_start); + mlog_close(mtr, log_ptr); } } @@ -289,7 +313,7 @@ mlog_write_ull( mach_write_to_8(ptr, val); if (mtr != 0) { - byte* log_ptr = mlog_open(mtr, 11 + 2 + 9); + byte* log_ptr = mlog_open(mtr, 13 + 2 + 9); /* If no logging is requested, we may return now */ if (log_ptr != 0) { @@ -297,11 +321,15 @@ mlog_write_ull( log_ptr = mlog_write_initial_log_record_fast( ptr, MLOG_8BYTES, log_ptr, mtr); + const byte* log_start = log_ptr; + mach_write_to_2(log_ptr, page_offset(ptr)); log_ptr += 2; log_ptr += mach_u64_write_compressed(log_ptr, val); + mtr->inc_and_update_body_len(log_ptr - log_start); + mlog_close(mtr, log_ptr); } } @@ -361,6 +389,8 @@ mlog_log_string( mlog_close(mtr, log_ptr); mlog_catenate_string(mtr, ptr, len); + + mtr->inc_and_update_body_len(len + 4); } #endif /* !UNIV_HOTBACKUP */ @@ -437,17 +467,17 @@ mlog_open_and_write_index( ut_ad(!!page_rec_is_comp(rec) == dict_table_is_comp(index->table)); if (!page_rec_is_comp(rec)) { - log_start = log_ptr = mlog_open(mtr, 11 + size); + log_start = log_ptr = mlog_open(mtr, 13 + size); if (!log_ptr) { return(NULL); /* logging is disabled */ } log_ptr = mlog_write_initial_log_record_fast(rec, type, log_ptr, mtr); - log_end = log_ptr + 11 + size; + log_end = log_ptr + 13 + size; } else { ulint i; ulint n = dict_index_get_n_fields(index); - ulint total = 11 + size + (n + 2) * 2; + ulint total = 13 + size + (n + 2) * 2; ulint alloc = total; if (alloc > mtr_buf_t::MAX_DATA_SIZE) { @@ -486,6 +516,8 @@ mlog_open_and_write_index( log_ptr += 2; + mtr->inc_body_len(4); + for (i = 0; i < n; i++) { dict_field_t* field; const dict_col_t* col; @@ -523,6 +555,8 @@ mlog_open_and_write_index( } mach_write_to_2(log_ptr, len); log_ptr += 2; + + mtr->inc_body_len(2); } } if (size == 0) { diff --git a/storage/innobase/mtr/mtr0mtr.cc b/storage/innobase/mtr/mtr0mtr.cc index e7865c5..1a2f9d8 100644 --- a/storage/innobase/mtr/mtr0mtr.cc +++ b/storage/innobase/mtr/mtr0mtr.cc @@ -522,6 +522,8 @@ mtr_t::start(bool sync, bool read_only) m_impl.m_undo_space = NULL; m_impl.m_sys_space = NULL; m_impl.m_flush_observer = NULL; + m_impl.log_len_ptr = NULL; + m_impl.log_body_len = 0; ut_d(m_impl.m_magic_n = MTR_MAGIC_N); } diff --git a/storage/innobase/page/page0cur.cc b/storage/innobase/page/page0cur.cc index d3f39b6..d86397f 100644 --- a/storage/innobase/page/page0cur.cc +++ b/storage/innobase/page/page0cur.cc @@ -957,8 +957,11 @@ page_cur_insert_rec_write_log( ulint cur_extra_size; const byte* ins_ptr; const byte* log_end; + const byte* log_start; ulint i; + bool non_short = (mtr_get_log_mode(mtr) != MTR_LOG_SHORT_INSERTS); + /* Avoid REDO logging to save on costly IO because temporary tables are not recovered during crash recovery. */ if (dict_table_is_temporary(index->table)) { @@ -1034,7 +1037,7 @@ page_cur_insert_rec_write_log( byte* log_ptr; - if (mtr_get_log_mode(mtr) != MTR_LOG_SHORT_INSERTS) { + if (non_short) { if (page_rec_is_comp(insert_rec)) { log_ptr = mlog_open_and_write_index( @@ -1047,7 +1050,7 @@ page_cur_insert_rec_write_log( return; } } else { - log_ptr = mlog_open(mtr, 11 + log_ptr = mlog_open(mtr, 13 + 2 + 5 + 1 + 5 + 5 + MLOG_BUF_MARGIN); if (UNIV_UNLIKELY(!log_ptr)) { @@ -1065,6 +1068,7 @@ page_cur_insert_rec_write_log( /* Write the cursor rec offset as a 2-byte ulint */ mach_write_to_2(log_ptr, page_offset(cursor_rec)); log_ptr += 2; + mtr->inc_body_len(2); } else { log_ptr = mlog_open(mtr, 5 + 1 + 5 + 5 + MLOG_BUF_MARGIN); if (!log_ptr) { @@ -1075,6 +1079,8 @@ page_cur_insert_rec_write_log( log_end = &log_ptr[5 + 1 + 5 + 5 + MLOG_BUF_MARGIN]; } + log_start = log_ptr; + if (page_rec_is_comp(insert_rec)) { if (UNIV_UNLIKELY (rec_get_info_and_status_bits(insert_rec, TRUE) @@ -1119,6 +1125,10 @@ need_extra_info: log_ptr += mach_write_compressed(log_ptr, 2 * (rec_size - i)); } + if (non_short) { + mtr->inc_body_len(log_ptr - log_start); + } + /* Write to the log the inserted index record end segment which differs from the cursor record */ @@ -1132,6 +1142,10 @@ need_extra_info: ut_a(rec_size < UNIV_PAGE_SIZE); mlog_catenate_string(mtr, ins_ptr, rec_size); } + + if (non_short) { + mtr->inc_and_update_body_len(rec_size); + } } #else /* !UNIV_HOTBACKUP */ # define page_cur_insert_rec_write_log(ins_rec,size,cur,index,mtr) ((void) 0) @@ -2222,6 +2236,7 @@ page_copy_rec_list_to_created_page_write_log( : MLOG_LIST_END_COPY_CREATED, 4); if (UNIV_LIKELY(log_ptr != NULL)) { mlog_close(mtr, log_ptr + 4); + mtr->inc_body_len(4); } return(log_ptr); @@ -2443,6 +2458,8 @@ page_copy_rec_list_end_to_created_page( if (log_ptr != NULL) { mach_write_to_4(log_ptr, log_data_len); + + mtr->inc_and_update_body_len(log_data_len); } if (page_is_comp(new_page)) { @@ -2501,6 +2518,8 @@ page_cur_delete_rec_write_log( /* Write the cursor rec offset as a 2-byte ulint */ mach_write_to_2(log_ptr, page_offset(rec)); + mtr->inc_and_update_body_len(2); + mlog_close(mtr, log_ptr + 2); } #else /* !UNIV_HOTBACKUP */ diff --git a/storage/innobase/page/page0page.cc b/storage/innobase/page/page0page.cc index 1f283e3..c96b594 100644 --- a/storage/innobase/page/page0page.cc +++ b/storage/innobase/page/page0page.cc @@ -288,6 +288,7 @@ page_create_write_log( } mlog_write_initial_log_record(frame, type, mtr); + mtr->update_body_len(); } #else /* !UNIV_HOTBACKUP */ # define page_create_write_log(frame,mtr,comp,is_rtree) ((void) 0) @@ -920,6 +921,8 @@ page_delete_rec_list_write_log( if (log_ptr) { /* Write the parameter as a 2-byte ulint */ mach_write_to_2(log_ptr, page_offset(rec)); + mtr->inc_and_update_body_len(2); + mlog_close(mtr, log_ptr + 2); } } diff --git a/storage/innobase/page/page0zip.cc b/storage/innobase/page/page0zip.cc index cb5fe4c..ec2d53c 100644 --- a/storage/innobase/page/page0zip.cc +++ b/storage/innobase/page/page0zip.cc @@ -399,7 +399,7 @@ page_zip_compress_write_log( ut_ad(!dict_index_is_ibuf(index)); - log_ptr = mlog_open(mtr, 11 + 2 + 2); + log_ptr = mlog_open(mtr, 13 + 2 + 2); if (!log_ptr) { @@ -445,6 +445,10 @@ page_zip_compress_write_log( /* Write the uncompressed trailer of the compressed page. */ mlog_catenate_string(mtr, page_zip->data + page_zip_get_size(page_zip) - trailer_size, trailer_size); + + mtr->inc_and_update_body_len(2 + 2 + 4 + 4 + + page_zip->m_end - FIL_PAGE_TYPE + + trailer_size); } #endif /* !UNIV_HOTBACKUP */ @@ -3985,7 +3989,7 @@ page_zip_write_blob_ptr( if (mtr) { #ifndef UNIV_HOTBACKUP byte* log_ptr = mlog_open( - mtr, 11 + 2 + 2 + BTR_EXTERN_FIELD_REF_SIZE); + mtr, 13 + 2 + 2 + BTR_EXTERN_FIELD_REF_SIZE); if (UNIV_UNLIKELY(!log_ptr)) { return; } @@ -3998,6 +4002,8 @@ page_zip_write_blob_ptr( log_ptr += 2; memcpy(log_ptr, externs, BTR_EXTERN_FIELD_REF_SIZE); log_ptr += BTR_EXTERN_FIELD_REF_SIZE; + + mtr->inc_and_update_body_len(2 + 2 + BTR_EXTERN_FIELD_REF_SIZE); mlog_close(mtr, log_ptr); #endif /* !UNIV_HOTBACKUP */ } @@ -4125,7 +4131,7 @@ page_zip_write_node_ptr( if (mtr) { #ifndef UNIV_HOTBACKUP byte* log_ptr = mlog_open(mtr, - 11 + 2 + 2 + REC_NODE_PTR_SIZE); + 13 + 2 + 2 + REC_NODE_PTR_SIZE); if (UNIV_UNLIKELY(!log_ptr)) { return; } @@ -4138,6 +4144,8 @@ page_zip_write_node_ptr( log_ptr += 2; memcpy(log_ptr, field, REC_NODE_PTR_SIZE); log_ptr += REC_NODE_PTR_SIZE; + + mtr->inc_and_update_body_len(2 + 2 + REC_NODE_PTR_SIZE); mlog_close(mtr, log_ptr); #endif /* !UNIV_HOTBACKUP */ } @@ -4634,7 +4642,7 @@ page_zip_write_header_log( ulint length, /*!< in: length of the data */ mtr_t* mtr) /*!< in: mini-transaction */ { - byte* log_ptr = mlog_open(mtr, 11 + 1 + 1); + byte* log_ptr = mlog_open(mtr, 13 + 1 + 1); ulint offset = page_offset(data); ut_ad(offset < PAGE_DATA); @@ -4657,6 +4665,8 @@ page_zip_write_header_log( mlog_close(mtr, log_ptr); mlog_catenate_string(mtr, data, length); + + mtr->inc_and_update_body_len(2 + length); } #endif /* !UNIV_HOTBACKUP */ diff --git a/storage/innobase/row/row0merge.cc b/storage/innobase/row/row0merge.cc index 22ab3ea..62f2aba 100644 --- a/storage/innobase/row/row0merge.cc +++ b/storage/innobase/row/row0merge.cc @@ -4243,7 +4243,7 @@ row_merge_write_redo( ut_ad(!dict_table_is_temporary(index->table)); mtr.start(); - log_ptr = mlog_open(&mtr, 11 + 8); + log_ptr = mlog_open(&mtr, 13 + 8); log_ptr = mlog_write_initial_log_record_low( MLOG_INDEX_LOAD, index->space, index->page, log_ptr, &mtr); diff --git a/storage/innobase/row/row0trunc.cc b/storage/innobase/row/row0trunc.cc index 080a8fd..208fa07 100644 --- a/storage/innobase/row/row0trunc.cc +++ b/storage/innobase/row/row0trunc.cc @@ -438,7 +438,7 @@ public: mtr_start(&mtr); - log_ptr = mlog_open(&mtr, 11 + 8); + log_ptr = mlog_open(&mtr, 13 + 8); log_ptr = mlog_write_initial_log_record_low( MLOG_TRUNCATE, m_table->space, 0, log_ptr, &mtr); diff --git a/storage/innobase/row/row0upd.cc b/storage/innobase/row/row0upd.cc index ba338fe..7e64ced 100644 --- a/storage/innobase/row/row0upd.cc +++ b/storage/innobase/row/row0upd.cc @@ -545,6 +545,7 @@ row_upd_rec_in_place( /*********************************************************************//** Writes into the redo log the values of trx id and roll ptr and enough info to determine their positions within a clustered index record. +If calling mlog_close in this function, the upper function should be adjusted. @return new pointer to mlog */ byte* row_upd_write_sys_vals_to_log( @@ -628,10 +629,14 @@ row_upd_index_write_log( buf_end = log_ptr + MLOG_BUF_MARGIN; + const byte* log_start = log_ptr; + mach_write_to_1(log_ptr, update->info_bits); log_ptr++; log_ptr += mach_write_compressed(log_ptr, n_fields); + mtr->inc_body_len(log_ptr - log_start); + for (i = 0; i < n_fields; i++) { #if MLOG_BUF_MARGIN <= 30 @@ -657,9 +662,13 @@ row_upd_index_write_log( ? REC_MAX_N_FIELDS + upd_field->field_no : upd_field->field_no; + log_start = log_ptr; + log_ptr += mach_write_compressed(log_ptr, field_no); log_ptr += mach_write_compressed(log_ptr, len); + mtr->inc_body_len(log_ptr - log_start); + if (len != UNIV_SQL_NULL) { if (log_ptr + len < buf_end) { memcpy(log_ptr, dfield_get_data(new_val), len); @@ -677,6 +686,8 @@ row_upd_index_write_log( log_ptr = mlog_open(mtr, MLOG_BUF_MARGIN); buf_end = log_ptr + MLOG_BUF_MARGIN; } + + mtr->inc_body_len(len); } } diff --git a/storage/innobase/trx/trx0rec.cc b/storage/innobase/trx/trx0rec.cc index e789a6f..bf03944 100644 --- a/storage/innobase/trx/trx0rec.cc +++ b/storage/innobase/trx/trx0rec.cc @@ -86,6 +86,8 @@ trx_undof_page_add_undo_rec_log( mlog_close(mtr, log_ptr); mlog_catenate_string(mtr, undo_page + old_free + 2, len); } + + mtr->inc_and_update_body_len(2 + len); } #endif /* !UNIV_HOTBACKUP */ @@ -1798,6 +1800,8 @@ trx_undo_erase_page_end( (UNIV_PAGE_SIZE - FIL_PAGE_DATA_END) - first_free); mlog_write_initial_log_record(undo_page, MLOG_UNDO_ERASE_END, mtr); + mtr->update_body_len(); + return(first_free != TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_HDR_SIZE); } diff --git a/storage/innobase/trx/trx0undo.cc b/storage/innobase/trx/trx0undo.cc index f1c932c..395301d 100644 --- a/storage/innobase/trx/trx0undo.cc +++ b/storage/innobase/trx/trx0undo.cc @@ -372,7 +372,9 @@ trx_undo_page_init_log( { mlog_write_initial_log_record(undo_page, MLOG_UNDO_INIT, mtr); - mlog_catenate_ulint_compressed(mtr, type); + ulint len = mlog_catenate_ulint_compressed(mtr, type); + + mtr->inc_and_update_body_len(len); } #else /* !UNIV_HOTBACKUP */ # define trx_undo_page_init_log(undo_page,type,mtr) ((void) 0) @@ -541,7 +543,9 @@ trx_undo_header_create_log( { mlog_write_initial_log_record(undo_page, MLOG_UNDO_HDR_CREATE, mtr); - mlog_catenate_ull_compressed(mtr, trx_id); + ulint len = mlog_catenate_ull_compressed(mtr, trx_id); + + mtr->inc_and_update_body_len(len); } #else /* !UNIV_HOTBACKUP */ # define trx_undo_header_create_log(undo_page,trx_id,mtr) ((void) 0) @@ -720,7 +724,9 @@ trx_undo_insert_header_reuse_log( { mlog_write_initial_log_record(undo_page, MLOG_UNDO_HDR_REUSE, mtr); - mlog_catenate_ull_compressed(mtr, trx_id); + ulint len = mlog_catenate_ull_compressed(mtr, trx_id); + + mtr->inc_and_update_body_len(len); } #else /* !UNIV_HOTBACKUP */ # define trx_undo_insert_header_reuse_log(undo_page,trx_id,mtr) ((void) 0) @@ -831,6 +837,8 @@ trx_undo_discard_latest_log( mtr_t* mtr) /*!< in: mtr */ { mlog_write_initial_log_record(undo_page, MLOG_UNDO_HDR_DISCARD, mtr); + + mtr->update_body_len(); } #else /* !UNIV_HOTBACKUP */ # define trx_undo_discard_latest_log(undo_page, mtr) ((void) 0)