@@ -54,56 +54,13 @@ const dtuple_t trx_undo_metadata = {
54
54
55
55
/* =========== UNDO LOG RECORD CREATION AND DECODING ====================*/
56
56
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
-
101
57
/* * Parse MLOG_UNDO_INSERT.
102
58
@param[in] ptr log record
103
59
@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
105
61
@return end of log record
106
62
@retval NULL if the log record is incomplete */
63
+ ATTRIBUTE_COLD /* only used when crash-upgrading */
107
64
byte*
108
65
trx_undo_parse_add_undo_rec (
109
66
const byte* ptr,
@@ -177,6 +134,7 @@ trx_undo_page_set_next_prev_and_add(
177
134
+ undo_block->frame ;
178
135
179
136
uint16_t first_free = mach_read_from_2 (ptr_to_first_free);
137
+ ut_ad (ptr > &undo_block->frame [first_free]);
180
138
181
139
/* Write offset of the previous undo log record */
182
140
mach_write_to_2 (ptr, first_free);
@@ -188,11 +146,12 @@ trx_undo_page_set_next_prev_and_add(
188
146
mach_write_to_2 (undo_block->frame + first_free, end_of_rec);
189
147
190
148
/* 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);
192
150
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]);
196
155
197
156
return (first_free);
198
157
}
@@ -456,7 +415,7 @@ trx_undo_page_report_insert(
456
415
inserted to the clustered index */
457
416
mtr_t * mtr) /* !< in: mtr */
458
417
{
459
- ut_ad (dict_index_is_clust ( index));
418
+ ut_ad (index-> is_primary ( ));
460
419
/* MariaDB 10.3.1+ in trx_undo_page_init() always initializes
461
420
TRX_UNDO_PAGE_TYPE as 0, but previous versions wrote
462
421
TRX_UNDO_INSERT == 1 into insert_undo pages,
@@ -469,6 +428,7 @@ trx_undo_page_report_insert(
469
428
+ undo_block->frame );
470
429
byte* ptr = undo_block->frame + first_free;
471
430
431
+ ut_ad (first_free >= TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_HDR_SIZE);
472
432
ut_ad (first_free <= srv_page_size);
473
433
474
434
if (trx_undo_left (undo_block, ptr) < 2 + 1 + 11 + 11 ) {
@@ -879,6 +839,7 @@ trx_undo_page_report_modify(
879
839
+ undo_block->frame );
880
840
ptr = undo_block->frame + first_free;
881
841
842
+ ut_ad (first_free >= TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_HDR_SIZE);
882
843
ut_ad (first_free <= srv_page_size);
883
844
884
845
if (trx_undo_left (undo_block, ptr) < 50 ) {
@@ -1468,15 +1429,17 @@ trx_undo_page_report_modify(
1468
1429
1469
1430
mach_write_to_2 (ptr, first_free);
1470
1431
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 );
1472
1434
mach_write_to_2 (undo_block->frame + first_free, new_free);
1473
1435
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;
1480
1443
}
1481
1444
1482
1445
/* *********************************************************************/ /* *
@@ -1931,10 +1894,10 @@ trx_undo_page_report_rename(trx_t* trx, const dict_table_t* table,
1931
1894
{
1932
1895
byte* ptr_first_free = TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_FREE
1933
1896
+ 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);
1935
1898
ut_ad (first_free >= TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_HDR_SIZE);
1936
1899
ut_ad (first_free <= srv_page_size);
1937
- byte* start = block->frame + first_free;
1900
+ byte* const start = block->frame + first_free;
1938
1901
size_t len = strlen (table->name .m_name );
1939
1902
const size_t fixed = 2 + 1 + 11 + 11 + 2 ;
1940
1903
ut_ad (len <= NAME_LEN * 2 + 1 );
@@ -1959,9 +1922,9 @@ trx_undo_page_report_rename(trx_t* trx, const dict_table_t* table,
1959
1922
ptr += 2 ;
1960
1923
uint16_t offset = page_offset (ptr);
1961
1924
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 );
1965
1928
return first_free;
1966
1929
}
1967
1930
0 commit comments