summaryrefslogtreecommitdiff
path: root/storage
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2019-12-09 16:26:14 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2020-02-13 18:19:13 +0200
commit07d39cde92c4845c20bfbe890e56361176b7d23e (patch)
tree43712057fa13270cbb61528d9ac7666b27490615 /storage
parent5bea43f5e03225327cd04e0c302f613600f06081 (diff)
downloadmariadb-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.cc4
-rw-r--r--storage/innobase/include/trx0undo.h2
-rw-r--r--storage/innobase/log/log0recv.cc3
-rw-r--r--storage/innobase/trx/trx0undo.cc42
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.