diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2019-12-09 16:26:14 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2020-02-13 18:19:13 +0200 |
commit | 07d39cde92c4845c20bfbe890e56361176b7d23e (patch) | |
tree | 43712057fa13270cbb61528d9ac7666b27490615 /storage | |
parent | 5bea43f5e03225327cd04e0c302f613600f06081 (diff) | |
download | mariadb-git-07d39cde92c4845c20bfbe890e56361176b7d23e.tar.gz |
MDEV-12353: Replace MLOG_UNDO_INIT
trx_undo_page_init(): Write lower-level redo log records by
invoking mtr_t::write().
Diffstat (limited to 'storage')
-rw-r--r-- | storage/innobase/fsp/fsp0fsp.cc | 4 | ||||
-rw-r--r-- | storage/innobase/include/trx0undo.h | 2 | ||||
-rw-r--r-- | storage/innobase/log/log0recv.cc | 3 | ||||
-rw-r--r-- | storage/innobase/trx/trx0undo.cc | 42 |
4 files changed, 24 insertions, 27 deletions
diff --git a/storage/innobase/fsp/fsp0fsp.cc b/storage/innobase/fsp/fsp0fsp.cc index 25b2feaca59..9de9dca70f5 100644 --- a/storage/innobase/fsp/fsp0fsp.cc +++ b/storage/innobase/fsp/fsp0fsp.cc @@ -1806,8 +1806,8 @@ fseg_create( } ut_ad(rw_lock_get_sx_lock_count(&block->lock) == 1); - - mtr->write<2>(*block, block->frame + FIL_PAGE_TYPE, + ut_ad(!mach_read_from_2(FIL_PAGE_TYPE + block->frame)); + mtr->write<1>(*block, FIL_PAGE_TYPE + 1 + block->frame, FIL_PAGE_TYPE_SYS); } diff --git a/storage/innobase/include/trx0undo.h b/storage/innobase/include/trx0undo.h index 8dec56a5e7d..bb32dae0954 100644 --- a/storage/innobase/include/trx0undo.h +++ b/storage/innobase/include/trx0undo.h @@ -257,6 +257,7 @@ trx_undo_free_at_shutdown(trx_t *trx); @param[in,out] mtr mini-transaction @return end of log record @retval NULL if the log record is incomplete */ +ATTRIBUTE_COLD /* only used when crash-upgrading */ byte* trx_undo_parse_page_init(const byte* ptr, const byte* end_ptr, page_t* page); /** Parse MLOG_UNDO_HDR_REUSE for crash-upgrade from MariaDB 10.2. @@ -264,6 +265,7 @@ trx_undo_parse_page_init(const byte* ptr, const byte* end_ptr, page_t* page); @param[in] end_ptr end of log buffer @param[in,out] page undo page or NULL @return end of log record or NULL */ +ATTRIBUTE_COLD /* only used when crash-upgrading */ byte* trx_undo_parse_page_header_reuse( const byte* ptr, diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc index e26d25a34a9..5b8aaa6cac7 100644 --- a/storage/innobase/log/log0recv.cc +++ b/storage/innobase/log/log0recv.cc @@ -1469,6 +1469,9 @@ parse_log: switch (type) { default: ut_error; + case MLOG_1BYTE: + ut_ad(offs == FIL_PAGE_TYPE + 1); + break; case MLOG_2BYTES: /* Note that this can fail when the redo log been written with something diff --git a/storage/innobase/trx/trx0undo.cc b/storage/innobase/trx/trx0undo.cc index 4001b4d932d..8b607acacf0 100644 --- a/storage/innobase/trx/trx0undo.cc +++ b/storage/innobase/trx/trx0undo.cc @@ -298,6 +298,7 @@ trx_undo_get_first_rec(const fil_space_t &space, uint32_t page_no, @param[in,out] page page or NULL @return end of log record @retval NULL if the log record is incomplete */ +ATTRIBUTE_COLD /* only used when crash-upgrading */ byte* trx_undo_parse_page_init(const byte* ptr, const byte* end_ptr, page_t* page) { @@ -331,6 +332,7 @@ trx_undo_parse_page_init(const byte* ptr, const byte* end_ptr, page_t* page) @param[in] end_ptr end of log buffer @param[in,out] page undo log page or NULL @return end of log record or NULL */ +ATTRIBUTE_COLD /* only used when crash-upgrading */ byte* trx_undo_parse_page_header_reuse( const byte* ptr, @@ -379,31 +381,21 @@ trx_undo_parse_page_header_reuse( @param[in,out] mtr mini-transaction */ static void trx_undo_page_init(const buf_block_t *undo_block, mtr_t *mtr) { - page_t* page = undo_block->frame; - mach_write_to_2(FIL_PAGE_TYPE + page, FIL_PAGE_UNDO_LOG); - mach_write_to_2(TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_TYPE + page, 0); - mach_write_to_2(TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_START + page, - TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_HDR_SIZE); - mach_write_to_2(TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_FREE + page, - TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_HDR_SIZE); - - mtr->set_modified(); - switch (mtr->get_log_mode()) { - case MTR_LOG_NONE: - case MTR_LOG_NO_REDO: - return; - case MTR_LOG_ALL: - break; - } - - byte* log_ptr = mtr->get_log()->open(11 + 1); - log_ptr = mlog_write_initial_log_record_low( - MLOG_UNDO_INIT, - undo_block->page.id.space(), - undo_block->page.id.page_no(), - log_ptr, mtr); - *log_ptr++ = 0; - mlog_close(mtr, log_ptr); + static_assert(FIL_PAGE_TYPE_ALLOCATED == 0, "compatibility"); + /* FIXME: FIL_PAGE_TYPE should be FIL_PAGE_TYPE_ALLOCATED here! */ + ut_ad(mach_read_from_2(FIL_PAGE_TYPE + undo_block->frame) < 0x100); + mtr->write<1>(*undo_block, FIL_PAGE_TYPE + 1 + undo_block->frame, + FIL_PAGE_UNDO_LOG); + compile_time_assert(TRX_UNDO_PAGE_TYPE == 0); + compile_time_assert(TRX_UNDO_PAGE_START == 2); + compile_time_assert(TRX_UNDO_PAGE_NODE == TRX_UNDO_PAGE_FREE + 2); + + /* MDEV-12353 FIXME: write minimal number of bytes in the new encoding */ + mtr->write<4>(*undo_block, TRX_UNDO_PAGE_HDR + undo_block->frame, + TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_HDR_SIZE); + mtr->write<2>(*undo_block, TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_FREE + + undo_block->frame, + TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_HDR_SIZE); } /** Look for a free slot for an undo log segment. |