Skip to content

Commit f802c98

Browse files
committed
MDEV-12353: Replace MLOG_UNDO_INSERT
trx_undof_page_add_undo_rec_log(): Remove. trx_undo_page_set_next_prev_and_add(), trx_undo_page_report_modify(), trx_undo_page_report_rename(): Write lower-level redo log records.
1 parent e0bc29d commit f802c98

File tree

2 files changed

+26
-62
lines changed

2 files changed

+26
-62
lines changed

storage/innobase/include/trx0rec.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@ trx_undo_prev_version_build(
246246
@param[in,out] page page or NULL
247247
@return end of log record
248248
@retval NULL if the log record is incomplete */
249+
ATTRIBUTE_COLD /* only used when crash-upgrading */
249250
byte*
250251
trx_undo_parse_add_undo_rec(
251252
const byte* ptr,

storage/innobase/trx/trx0rec.cc

Lines changed: 25 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -54,56 +54,13 @@ const dtuple_t trx_undo_metadata = {
5454

5555
/*=========== UNDO LOG RECORD CREATION AND DECODING ====================*/
5656

57-
/** Write redo log of writing an undo log record.
58-
@param[in] undo_block undo log page
59-
@param[in] old_free start offset of the undo log record
60-
@param[in] new_free end offset of the undo log record
61-
@param[in,out] mtr mini-transaction */
62-
static void trx_undof_page_add_undo_rec_log(const buf_block_t* undo_block,
63-
ulint old_free, ulint new_free,
64-
mtr_t* mtr)
65-
{
66-
ut_ad(old_free >= TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_HDR_SIZE);
67-
ut_ad(new_free >= old_free);
68-
ut_ad(new_free < srv_page_size);
69-
ut_ad(mach_read_from_2(TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_FREE
70-
+ undo_block->frame)
71-
== new_free);
72-
mtr->set_modified();
73-
switch (mtr->get_log_mode()) {
74-
case MTR_LOG_NONE:
75-
case MTR_LOG_NO_REDO:
76-
return;
77-
case MTR_LOG_ALL:
78-
break;
79-
}
80-
81-
const uint32_t
82-
len = uint32_t(new_free - old_free - 4),
83-
reserved = std::min<uint32_t>(11 + 13 + len,
84-
mtr->get_log()->MAX_DATA_SIZE);
85-
byte* log_ptr = mtr->get_log()->open(reserved);
86-
const byte* log_end = log_ptr + reserved;
87-
log_ptr = mlog_write_initial_log_record_low(
88-
MLOG_UNDO_INSERT,
89-
undo_block->page.id.space(), undo_block->page.id.page_no(),
90-
log_ptr, mtr);
91-
mach_write_to_2(log_ptr, len);
92-
if (log_ptr + 2 + len <= log_end) {
93-
memcpy(log_ptr + 2, undo_block->frame + old_free + 2, len);
94-
mlog_close(mtr, log_ptr + 2 + len);
95-
} else {
96-
mlog_close(mtr, log_ptr + 2);
97-
mtr->get_log()->push(undo_block->frame + old_free + 2, len);
98-
}
99-
}
100-
10157
/** Parse MLOG_UNDO_INSERT.
10258
@param[in] ptr log record
10359
@param[in] end_ptr end of log record buffer
104-
@param[in,out] page page or NULL
60+
@param[in,out] page page or NULL
10561
@return end of log record
10662
@retval NULL if the log record is incomplete */
63+
ATTRIBUTE_COLD /* only used when crash-upgrading */
10764
byte*
10865
trx_undo_parse_add_undo_rec(
10966
const byte* ptr,
@@ -177,6 +134,7 @@ trx_undo_page_set_next_prev_and_add(
177134
+ undo_block->frame;
178135

179136
uint16_t first_free = mach_read_from_2(ptr_to_first_free);
137+
ut_ad(ptr > &undo_block->frame[first_free]);
180138

181139
/* Write offset of the previous undo log record */
182140
mach_write_to_2(ptr, first_free);
@@ -188,11 +146,12 @@ trx_undo_page_set_next_prev_and_add(
188146
mach_write_to_2(undo_block->frame + first_free, end_of_rec);
189147

190148
/* Update the offset to first free undo record */
191-
mach_write_to_2(ptr_to_first_free, end_of_rec);
149+
mtr->write<2>(*undo_block, ptr_to_first_free, end_of_rec);
192150

193-
/* Write this log entry to the UNDO log */
194-
trx_undof_page_add_undo_rec_log(undo_block, first_free,
195-
end_of_rec, mtr);
151+
ut_ad(ptr > &undo_block->frame[first_free]);
152+
ut_ad(ptr < &undo_block->frame[srv_page_size]);
153+
mtr->memcpy(*undo_block, first_free,
154+
ptr - &undo_block->frame[first_free]);
196155

197156
return(first_free);
198157
}
@@ -456,7 +415,7 @@ trx_undo_page_report_insert(
456415
inserted to the clustered index */
457416
mtr_t* mtr) /*!< in: mtr */
458417
{
459-
ut_ad(dict_index_is_clust(index));
418+
ut_ad(index->is_primary());
460419
/* MariaDB 10.3.1+ in trx_undo_page_init() always initializes
461420
TRX_UNDO_PAGE_TYPE as 0, but previous versions wrote
462421
TRX_UNDO_INSERT == 1 into insert_undo pages,
@@ -469,6 +428,7 @@ trx_undo_page_report_insert(
469428
+ undo_block->frame);
470429
byte* ptr = undo_block->frame + first_free;
471430

431+
ut_ad(first_free >= TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_HDR_SIZE);
472432
ut_ad(first_free <= srv_page_size);
473433

474434
if (trx_undo_left(undo_block, ptr) < 2 + 1 + 11 + 11) {
@@ -879,6 +839,7 @@ trx_undo_page_report_modify(
879839
+ undo_block->frame);
880840
ptr = undo_block->frame + first_free;
881841

842+
ut_ad(first_free >= TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_HDR_SIZE);
882843
ut_ad(first_free <= srv_page_size);
883844

884845
if (trx_undo_left(undo_block, ptr) < 50) {
@@ -1468,15 +1429,17 @@ trx_undo_page_report_modify(
14681429

14691430
mach_write_to_2(ptr, first_free);
14701431
ptr += 2;
1471-
const ulint new_free = ulint(ptr - undo_block->frame);
1432+
const uint16_t new_free = static_cast<uint16_t>(
1433+
ptr - undo_block->frame);
14721434
mach_write_to_2(undo_block->frame + first_free, new_free);
14731435

1474-
mach_write_to_2(TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_FREE
1475-
+ undo_block->frame, new_free);
1476-
1477-
/* Write to the REDO log about this change in the UNDO log */
1478-
trx_undof_page_add_undo_rec_log(undo_block, first_free, new_free, mtr);
1479-
return(first_free);
1436+
mtr->write<2>(*undo_block, TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_FREE
1437+
+ undo_block->frame, new_free);
1438+
ut_ad(ptr > &undo_block->frame[first_free]);
1439+
ut_ad(page_align(ptr) == undo_block->frame);
1440+
mtr->memcpy(*undo_block, first_free,
1441+
ptr - &undo_block->frame[first_free]);
1442+
return first_free;
14801443
}
14811444

14821445
/**********************************************************************//**
@@ -1931,10 +1894,10 @@ trx_undo_page_report_rename(trx_t* trx, const dict_table_t* table,
19311894
{
19321895
byte* ptr_first_free = TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_FREE
19331896
+ block->frame;
1934-
uint16_t first_free = mach_read_from_2(ptr_first_free);
1897+
const uint16_t first_free = mach_read_from_2(ptr_first_free);
19351898
ut_ad(first_free >= TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_HDR_SIZE);
19361899
ut_ad(first_free <= srv_page_size);
1937-
byte* start = block->frame + first_free;
1900+
byte* const start = block->frame + first_free;
19381901
size_t len = strlen(table->name.m_name);
19391902
const size_t fixed = 2 + 1 + 11 + 11 + 2;
19401903
ut_ad(len <= NAME_LEN * 2 + 1);
@@ -1959,9 +1922,9 @@ trx_undo_page_report_rename(trx_t* trx, const dict_table_t* table,
19591922
ptr += 2;
19601923
uint16_t offset = page_offset(ptr);
19611924
mach_write_to_2(start, offset);
1962-
mach_write_to_2(ptr_first_free, offset);
1963-
1964-
trx_undof_page_add_undo_rec_log(block, first_free, offset, mtr);
1925+
mtr->write<2>(*block, ptr_first_free, offset);
1926+
ut_ad(page_align(ptr) == block->frame);
1927+
mtr->memcpy(*block, first_free, ptr - start);
19651928
return first_free;
19661929
}
19671930

0 commit comments

Comments
 (0)