Commit 6f88bc45 authored by Marko Mäkelä's avatar Marko Mäkelä

MDEV-15914: Use buf_block_t* for undo, not page_t*

trx_undof_page_add_undo_rec_log(): Write the undo page number
directly from the buf_block_t descriptor, not by decoding the
fields in the page frame.
parent 76c62bc6
...@@ -52,23 +52,20 @@ const dtuple_t trx_undo_default_rec = { ...@@ -52,23 +52,20 @@ const dtuple_t trx_undo_default_rec = {
/*=========== UNDO LOG RECORD CREATION AND DECODING ====================*/ /*=========== UNDO LOG RECORD CREATION AND DECODING ====================*/
/**********************************************************************//** /** Write redo log of writing an undo log record.
Writes the mtr log entry of the inserted undo log record on the undo log @param[in] undo_block undo log page
page. */ @param[in] old_free start offset of the undo log record
UNIV_INLINE @param[in] new_free end offset of the undo log record
void @param[in,out] mtr mini-transaction */
trx_undof_page_add_undo_rec_log( static void trx_undof_page_add_undo_rec_log(const buf_block_t* undo_block,
/*============================*/ ulint old_free, ulint new_free,
page_t* undo_page, /*!< in: undo log page */ mtr_t* mtr)
ulint old_free, /*!< in: start offset of the inserted entry */
ulint new_free, /*!< in: end offset of the entry */
mtr_t* mtr) /*!< in: mtr */
{ {
ut_ad(old_free >= TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_HDR_SIZE); ut_ad(old_free >= TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_HDR_SIZE);
ut_ad(new_free >= old_free); ut_ad(new_free >= old_free);
ut_ad(new_free < UNIV_PAGE_SIZE); ut_ad(new_free < UNIV_PAGE_SIZE);
ut_ad(mach_read_from_2(undo_page ut_ad(mach_read_from_2(TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_FREE
+ TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_FREE) + undo_block->frame)
== new_free); == new_free);
mtr->set_modified(); mtr->set_modified();
switch (mtr->get_log_mode()) { switch (mtr->get_log_mode()) {
...@@ -88,15 +85,17 @@ trx_undof_page_add_undo_rec_log( ...@@ -88,15 +85,17 @@ trx_undof_page_add_undo_rec_log(
mtr->get_log()->MAX_DATA_SIZE); mtr->get_log()->MAX_DATA_SIZE);
byte* log_ptr = mtr->get_log()->open(reserved); byte* log_ptr = mtr->get_log()->open(reserved);
const byte* log_end = log_ptr + reserved; const byte* log_end = log_ptr + reserved;
log_ptr = mlog_write_initial_log_record_fast( log_ptr = mlog_write_initial_log_record_low(
undo_page, MLOG_UNDO_INSERT, log_ptr, mtr); MLOG_UNDO_INSERT,
undo_block->page.id.space(), undo_block->page.id.page_no(),
log_ptr, mtr);
mach_write_to_2(log_ptr, len); mach_write_to_2(log_ptr, len);
if (log_ptr + 2 + len <= log_end) { if (log_ptr + 2 + len <= log_end) {
memcpy(log_ptr + 2, undo_page + old_free + 2, len); memcpy(log_ptr + 2, undo_block->frame + old_free + 2, len);
mlog_close(mtr, log_ptr + 2 + len); mlog_close(mtr, log_ptr + 2 + len);
} else { } else {
mlog_close(mtr, log_ptr + 2); mlog_close(mtr, log_ptr + 2);
mtr->get_log()->push(undo_page + old_free + 2, len); mtr->get_log()->push(undo_block->frame + old_free + 2, len);
} }
} }
...@@ -143,20 +142,16 @@ trx_undo_parse_add_undo_rec( ...@@ -143,20 +142,16 @@ trx_undo_parse_add_undo_rec(
return(const_cast<byte*>(ptr + len)); return(const_cast<byte*>(ptr + len));
} }
/**********************************************************************//** /** Calculate the free space left for extending an undo log record.
Calculates the free space left for extending an undo log record. @param[in] undo_block undo log page
@param[in] ptr current end of the undo page
@return bytes left */ @return bytes left */
UNIV_INLINE static ulint trx_undo_left(const buf_block_t* undo_block, const byte* ptr)
ulint
trx_undo_left(
/*==========*/
const page_t* page, /*!< in: undo log page */
const byte* ptr) /*!< in: pointer to page */
{ {
/* The '- 10' is a safety margin, in case we have some small /* The 10 is a safety margin, in case we have some small
calculation error below */ calculation error below */
return srv_page_size - (ptr - undo_block->frame)
return(UNIV_PAGE_SIZE - (ptr - page) - 10 - FIL_PAGE_DATA_END); - (10 + FIL_PAGE_DATA_END);
} }
/**********************************************************************//** /**********************************************************************//**
...@@ -168,7 +163,7 @@ static ...@@ -168,7 +163,7 @@ static
ulint ulint
trx_undo_page_set_next_prev_and_add( trx_undo_page_set_next_prev_and_add(
/*================================*/ /*================================*/
page_t* undo_page, /*!< in/out: undo log page */ buf_block_t* undo_block, /*!< in/out: undo log page */
byte* ptr, /*!< in: ptr up to where data has been byte* ptr, /*!< in: ptr up to where data has been
written on this undo page. */ written on this undo page. */
mtr_t* mtr) /*!< in: mtr */ mtr_t* mtr) /*!< in: mtr */
...@@ -180,15 +175,15 @@ trx_undo_page_set_next_prev_and_add( ...@@ -180,15 +175,15 @@ trx_undo_page_set_next_prev_and_add(
that points to the next free that points to the next free
offset value within undo_page.*/ offset value within undo_page.*/
ut_ad(ptr > undo_page); ut_ad(ptr > undo_block->frame);
ut_ad(ptr < undo_page + UNIV_PAGE_SIZE); ut_ad(ptr < undo_block->frame + UNIV_PAGE_SIZE);
if (UNIV_UNLIKELY(trx_undo_left(undo_page, ptr) < 2)) {
if (UNIV_UNLIKELY(trx_undo_left(undo_block, ptr) < 2)) {
return(0); return(0);
} }
ptr_to_first_free = undo_page + TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_FREE; ptr_to_first_free = TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_FREE
+ undo_block->frame;
first_free = mach_read_from_2(ptr_to_first_free); first_free = mach_read_from_2(ptr_to_first_free);
...@@ -196,16 +191,16 @@ trx_undo_page_set_next_prev_and_add( ...@@ -196,16 +191,16 @@ trx_undo_page_set_next_prev_and_add(
mach_write_to_2(ptr, first_free); mach_write_to_2(ptr, first_free);
ptr += 2; ptr += 2;
end_of_rec = ptr - undo_page; end_of_rec = ptr - undo_block->frame;
/* Write offset of the next undo log record */ /* Write offset of the next undo log record */
mach_write_to_2(undo_page + first_free, end_of_rec); mach_write_to_2(undo_block->frame + first_free, end_of_rec);
/* Update the offset to first free undo record */ /* Update the offset to first free undo record */
mach_write_to_2(ptr_to_first_free, end_of_rec); mach_write_to_2(ptr_to_first_free, end_of_rec);
/* Write this log entry to the UNDO log */ /* Write this log entry to the UNDO log */
trx_undof_page_add_undo_rec_log(undo_page, first_free, trx_undof_page_add_undo_rec_log(undo_block, first_free,
end_of_rec, mtr); end_of_rec, mtr);
return(first_free); return(first_free);
...@@ -217,7 +212,7 @@ static const ulint VIRTUAL_COL_UNDO_FORMAT_1 = 0xF1; ...@@ -217,7 +212,7 @@ static const ulint VIRTUAL_COL_UNDO_FORMAT_1 = 0xF1;
/** Write virtual column index info (index id and column position in index) /** Write virtual column index info (index id and column position in index)
to the undo log to the undo log
@param[in,out] undo_page undo log page @param[in,out] undo_block undo log page
@param[in] table the table @param[in] table the table
@param[in] pos the virtual column position @param[in] pos the virtual column position
@param[in] ptr undo log record being written @param[in] ptr undo log record being written
...@@ -227,7 +222,7 @@ to the undo log ...@@ -227,7 +222,7 @@ to the undo log
static static
byte* byte*
trx_undo_log_v_idx( trx_undo_log_v_idx(
page_t* undo_page, buf_block_t* undo_block,
const dict_table_t* table, const dict_table_t* table,
ulint pos, ulint pos,
byte* ptr, byte* ptr,
...@@ -246,7 +241,7 @@ trx_undo_log_v_idx( ...@@ -246,7 +241,7 @@ trx_undo_log_v_idx(
1 byte for undo log record format version marker */ 1 byte for undo log record format version marker */
ulint size = n_idx * (5 + 5) + 5 + 2 + (first_v_col ? 1 : 0); ulint size = n_idx * (5 + 5) + 5 + 2 + (first_v_col ? 1 : 0);
if (trx_undo_left(undo_page, ptr) < size) { if (trx_undo_left(undo_block, ptr) < size) {
return(NULL); return(NULL);
} }
...@@ -376,7 +371,7 @@ trx_undo_read_v_idx( ...@@ -376,7 +371,7 @@ trx_undo_read_v_idx(
} }
/** Reports in the undo log of an insert of virtual columns. /** Reports in the undo log of an insert of virtual columns.
@param[in] undo_page undo log page @param[in] undo_block undo log page
@param[in] table the table @param[in] table the table
@param[in] row dtuple contains the virtual columns @param[in] row dtuple contains the virtual columns
@param[in,out] ptr log ptr @param[in,out] ptr log ptr
...@@ -384,7 +379,7 @@ trx_undo_read_v_idx( ...@@ -384,7 +379,7 @@ trx_undo_read_v_idx(
static static
bool bool
trx_undo_report_insert_virtual( trx_undo_report_insert_virtual(
page_t* undo_page, buf_block_t* undo_block,
dict_table_t* table, dict_table_t* table,
const dtuple_t* row, const dtuple_t* row,
byte** ptr) byte** ptr)
...@@ -392,7 +387,7 @@ trx_undo_report_insert_virtual( ...@@ -392,7 +387,7 @@ trx_undo_report_insert_virtual(
byte* start = *ptr; byte* start = *ptr;
bool first_v_col = true; bool first_v_col = true;
if (trx_undo_left(undo_page, *ptr) < 2) { if (trx_undo_left(undo_block, *ptr) < 2) {
return(false); return(false);
} }
...@@ -411,7 +406,7 @@ trx_undo_report_insert_virtual( ...@@ -411,7 +406,7 @@ trx_undo_report_insert_virtual(
if (col->m_col.ord_part) { if (col->m_col.ord_part) {
/* make sure enought space to write the length */ /* make sure enought space to write the length */
if (trx_undo_left(undo_page, *ptr) < 5) { if (trx_undo_left(undo_block, *ptr) < 5) {
return(false); return(false);
} }
...@@ -419,7 +414,7 @@ trx_undo_report_insert_virtual( ...@@ -419,7 +414,7 @@ trx_undo_report_insert_virtual(
pos += REC_MAX_N_FIELDS; pos += REC_MAX_N_FIELDS;
*ptr += mach_write_compressed(*ptr, pos); *ptr += mach_write_compressed(*ptr, pos);
*ptr = trx_undo_log_v_idx(undo_page, table, *ptr = trx_undo_log_v_idx(undo_block, table,
col_no, *ptr, first_v_col); col_no, *ptr, first_v_col);
first_v_col = false; first_v_col = false;
...@@ -439,8 +434,8 @@ trx_undo_report_insert_virtual( ...@@ -439,8 +434,8 @@ trx_undo_report_insert_virtual(
flen = max_len; flen = max_len;
} }
if (trx_undo_left(undo_page, *ptr) < flen + 5) { if (trx_undo_left(undo_block, *ptr)
< flen + 5) {
return(false); return(false);
} }
*ptr += mach_write_compressed(*ptr, flen); *ptr += mach_write_compressed(*ptr, flen);
...@@ -448,8 +443,7 @@ trx_undo_report_insert_virtual( ...@@ -448,8 +443,7 @@ trx_undo_report_insert_virtual(
ut_memcpy(*ptr, vfield->data, flen); ut_memcpy(*ptr, vfield->data, flen);
*ptr += flen; *ptr += flen;
} else { } else {
if (trx_undo_left(undo_page, *ptr) < 5) { if (trx_undo_left(undo_block, *ptr) < 5) {
return(false); return(false);
} }
...@@ -471,7 +465,7 @@ static ...@@ -471,7 +465,7 @@ static
ulint ulint
trx_undo_page_report_insert( trx_undo_page_report_insert(
/*========================*/ /*========================*/
page_t* undo_page, /*!< in: undo log page */ buf_block_t* undo_block, /*!< in: undo log page */
trx_t* trx, /*!< in: transaction */ trx_t* trx, /*!< in: transaction */
dict_index_t* index, /*!< in: clustered index */ dict_index_t* index, /*!< in: clustered index */
const dtuple_t* clust_entry, /*!< in: index entry which will be const dtuple_t* clust_entry, /*!< in: index entry which will be
...@@ -488,18 +482,16 @@ trx_undo_page_report_insert( ...@@ -488,18 +482,16 @@ trx_undo_page_report_insert(
TRX_UNDO_INSERT == 1 into insert_undo pages, TRX_UNDO_INSERT == 1 into insert_undo pages,
or TRX_UNDO_UPDATE == 2 into update_undo pages. */ or TRX_UNDO_UPDATE == 2 into update_undo pages. */
ut_ad(mach_read_from_2(TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_TYPE ut_ad(mach_read_from_2(TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_TYPE
+ undo_page) <= 2); + undo_block->frame) <= 2);
first_free = mach_read_from_2(undo_page + TRX_UNDO_PAGE_HDR first_free = mach_read_from_2(TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_FREE
+ TRX_UNDO_PAGE_FREE); + undo_block->frame);
ptr = undo_page + first_free; ptr = undo_block->frame + first_free;
ut_ad(first_free <= UNIV_PAGE_SIZE); ut_ad(first_free <= UNIV_PAGE_SIZE);
if (trx_undo_left(undo_page, ptr) < 2 + 1 + 11 + 11) { if (trx_undo_left(undo_block, ptr) < 2 + 1 + 11 + 11) {
/* Not enough space for writing the general parameters */ /* Not enough space for writing the general parameters */
return(0); return(0);
} }
...@@ -516,8 +508,9 @@ trx_undo_page_report_insert( ...@@ -516,8 +508,9 @@ trx_undo_page_report_insert(
if (UNIV_UNLIKELY(clust_entry->info_bits)) { if (UNIV_UNLIKELY(clust_entry->info_bits)) {
ut_ad(clust_entry->info_bits == REC_INFO_DEFAULT_ROW); ut_ad(clust_entry->info_bits == REC_INFO_DEFAULT_ROW);
ut_ad(index->is_instant()); ut_ad(index->is_instant());
ut_ad(undo_page[first_free + 2] == TRX_UNDO_INSERT_REC); ut_ad(undo_block->frame[first_free + 2]
undo_page[first_free + 2] = TRX_UNDO_INSERT_DEFAULT; == TRX_UNDO_INSERT_REC);
undo_block->frame[first_free + 2] = TRX_UNDO_INSERT_DEFAULT;
goto done; goto done;
} }
...@@ -526,7 +519,7 @@ trx_undo_page_report_insert( ...@@ -526,7 +519,7 @@ trx_undo_page_report_insert(
const dfield_t* field = dtuple_get_nth_field(clust_entry, i); const dfield_t* field = dtuple_get_nth_field(clust_entry, i);
ulint flen = dfield_get_len(field); ulint flen = dfield_get_len(field);
if (trx_undo_left(undo_page, ptr) < 5) { if (trx_undo_left(undo_block, ptr) < 5) {
return(0); return(0);
} }
...@@ -534,7 +527,7 @@ trx_undo_page_report_insert( ...@@ -534,7 +527,7 @@ trx_undo_page_report_insert(
ptr += mach_write_compressed(ptr, flen); ptr += mach_write_compressed(ptr, flen);
if (flen != UNIV_SQL_NULL) { if (flen != UNIV_SQL_NULL) {
if (trx_undo_left(undo_page, ptr) < flen) { if (trx_undo_left(undo_block, ptr) < flen) {
return(0); return(0);
} }
...@@ -546,13 +539,13 @@ trx_undo_page_report_insert( ...@@ -546,13 +539,13 @@ trx_undo_page_report_insert(
if (index->table->n_v_cols) { if (index->table->n_v_cols) {
if (!trx_undo_report_insert_virtual( if (!trx_undo_report_insert_virtual(
undo_page, index->table, clust_entry, &ptr)) { undo_block, index->table, clust_entry, &ptr)) {
return(0); return(0);
} }
} }
done: done:
return(trx_undo_page_set_next_prev_and_add(undo_page, ptr, mtr)); return(trx_undo_page_set_next_prev_and_add(undo_block, ptr, mtr));
} }
/**********************************************************************//** /**********************************************************************//**
...@@ -868,7 +861,7 @@ static ...@@ -868,7 +861,7 @@ static
ulint ulint
trx_undo_page_report_modify( trx_undo_page_report_modify(
/*========================*/ /*========================*/
page_t* undo_page, /*!< in: undo log page */ buf_block_t* undo_block, /*!< in: undo log page */
trx_t* trx, /*!< in: transaction */ trx_t* trx, /*!< in: transaction */
dict_index_t* index, /*!< in: clustered index where update or dict_index_t* index, /*!< in: clustered index where update or
delete marking is done */ delete marking is done */
...@@ -884,47 +877,46 @@ trx_undo_page_report_modify( ...@@ -884,47 +877,46 @@ trx_undo_page_report_modify(
virtual column info */ virtual column info */
mtr_t* mtr) /*!< in: mtr */ mtr_t* mtr) /*!< in: mtr */
{ {
dict_table_t* table = index->table;
ulint first_free; ulint first_free;
byte* ptr; byte* ptr;
const byte* field;
ulint flen;
ulint col_no;
ulint type_cmpl;
byte* type_cmpl_ptr;
ulint i;
trx_id_t trx_id;
ibool ignore_prefix = FALSE;
byte ext_buf[REC_VERSION_56_MAX_INDEX_COL_LEN
+ BTR_EXTERN_FIELD_REF_SIZE];
bool first_v_col = true;
ut_a(dict_index_is_clust(index)); ut_ad(index->is_primary());
ut_ad(rec_offs_validate(rec, index, offsets)); ut_ad(rec_offs_validate(rec, index, offsets));
/* MariaDB 10.3.1+ in trx_undo_page_init() always initializes /* MariaDB 10.3.1+ in trx_undo_page_init() always initializes
TRX_UNDO_PAGE_TYPE as 0, but previous versions wrote TRX_UNDO_PAGE_TYPE as 0, but previous versions wrote
TRX_UNDO_INSERT == 1 into insert_undo pages, TRX_UNDO_INSERT == 1 into insert_undo pages,
or TRX_UNDO_UPDATE == 2 into update_undo pages. */ or TRX_UNDO_UPDATE == 2 into update_undo pages. */
ut_ad(mach_read_from_2(TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_TYPE ut_ad(mach_read_from_2(TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_TYPE
+ undo_page) <= 2); + undo_block->frame) <= 2);
first_free = mach_read_from_2(undo_page + TRX_UNDO_PAGE_HDR first_free = mach_read_from_2(TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_FREE
+ TRX_UNDO_PAGE_FREE); + undo_block->frame);
ptr = undo_page + first_free; ptr = undo_block->frame + first_free;
ut_ad(first_free <= UNIV_PAGE_SIZE); ut_ad(first_free <= UNIV_PAGE_SIZE);
if (trx_undo_left(undo_page, ptr) < 50) { if (trx_undo_left(undo_block, ptr) < 50) {
/* NOTE: the value 50 must be big enough so that the general /* NOTE: the value 50 must be big enough so that the general
fields written below fit on the undo log page */ fields written below fit on the undo log page */
return 0;
return(0);
} }
/* Reserve 2 bytes for the pointer to the next undo log record */ /* Reserve 2 bytes for the pointer to the next undo log record */
ptr += 2; ptr += 2;
dict_table_t* table = index->table;
const byte* field;
ulint flen;
ulint col_no;
ulint type_cmpl;
byte* type_cmpl_ptr;
ulint i;
trx_id_t trx_id;
ibool ignore_prefix = FALSE;
byte ext_buf[REC_VERSION_56_MAX_INDEX_COL_LEN
+ BTR_EXTERN_FIELD_REF_SIZE];
bool first_v_col = true;
/* Store first some general parameters to the undo log */ /* Store first some general parameters to the undo log */
if (!update) { if (!update) {
...@@ -997,16 +989,14 @@ trx_undo_page_report_modify( ...@@ -997,16 +989,14 @@ trx_undo_page_report_modify(
ut_ad(!rec_offs_nth_extern(offsets, i)); ut_ad(!rec_offs_nth_extern(offsets, i));
ut_ad(dict_index_get_nth_col(index, i)->ord_part); ut_ad(dict_index_get_nth_col(index, i)->ord_part);
if (trx_undo_left(undo_page, ptr) < 5) { if (trx_undo_left(undo_block, ptr) < 5) {
return(0); return(0);
} }
ptr += mach_write_compressed(ptr, flen); ptr += mach_write_compressed(ptr, flen);
if (flen != UNIV_SQL_NULL) { if (flen != UNIV_SQL_NULL) {
if (trx_undo_left(undo_page, ptr) < flen) { if (trx_undo_left(undo_block, ptr) < flen) {
return(0); return(0);
} }
...@@ -1019,8 +1009,7 @@ trx_undo_page_report_modify( ...@@ -1019,8 +1009,7 @@ trx_undo_page_report_modify(
/* Save to the undo log the old values of the columns to be updated. */ /* Save to the undo log the old values of the columns to be updated. */
if (update) { if (update) {
if (trx_undo_left(undo_page, ptr) < 5) { if (trx_undo_left(undo_block, ptr) < 5) {
return(0); return(0);
} }
...@@ -1058,8 +1047,7 @@ trx_undo_page_report_modify( ...@@ -1058,8 +1047,7 @@ trx_undo_page_report_modify(
ulint pos = fld->field_no; ulint pos = fld->field_no;
/* Write field number to undo log */ /* Write field number to undo log */
if (trx_undo_left(undo_page, ptr) < 5) { if (trx_undo_left(undo_block, ptr) < 5) {
return(0); return(0);
} }
...@@ -1083,7 +1071,7 @@ trx_undo_page_report_modify( ...@@ -1083,7 +1071,7 @@ trx_undo_page_report_modify(
if (is_virtual) { if (is_virtual) {
ut_ad(fld->field_no < table->n_v_def); ut_ad(fld->field_no < table->n_v_def);
ptr = trx_undo_log_v_idx(undo_page, table, ptr = trx_undo_log_v_idx(undo_block, table,
fld->field_no, ptr, fld->field_no, ptr,
first_v_col); first_v_col);
if (ptr == NULL) { if (ptr == NULL) {
...@@ -1110,8 +1098,7 @@ trx_undo_page_report_modify( ...@@ -1110,8 +1098,7 @@ trx_undo_page_report_modify(
rec, index, offsets, pos, &flen); rec, index, offsets, pos, &flen);
} }
if (trx_undo_left(undo_page, ptr) < 15) { if (trx_undo_left(undo_block, ptr) < 15) {
return(0); return(0);
} }
...@@ -1140,8 +1127,7 @@ trx_undo_page_report_modify( ...@@ -1140,8 +1127,7 @@ trx_undo_page_report_modify(
} }
if (flen != UNIV_SQL_NULL) { if (flen != UNIV_SQL_NULL) {
if (trx_undo_left(undo_page, ptr) < flen) { if (trx_undo_left(undo_block, ptr) < flen) {
return(0); return(0);
} }
...@@ -1158,16 +1144,15 @@ trx_undo_page_report_modify( ...@@ -1158,16 +1144,15 @@ trx_undo_page_report_modify(
flen, max_v_log_len); flen, max_v_log_len);
} }
if (trx_undo_left(undo_page, ptr) < 15) { if (trx_undo_left(undo_block, ptr) < 15) {
return(0); return(0);
} }
ptr += mach_write_compressed(ptr, flen); ptr += mach_write_compressed(ptr, flen);
if (flen != UNIV_SQL_NULL) { if (flen != UNIV_SQL_NULL) {
if (trx_undo_left(undo_page, ptr) < flen) { if (trx_undo_left(undo_block, ptr)
< flen) {
return(0); return(0);
} }
...@@ -1201,8 +1186,7 @@ trx_undo_page_report_modify( ...@@ -1201,8 +1186,7 @@ trx_undo_page_report_modify(
double mbr[SPDIMS * 2]; double mbr[SPDIMS * 2];
mem_heap_t* row_heap = NULL; mem_heap_t* row_heap = NULL;
if (trx_undo_left(undo_page, ptr) < 5) { if (trx_undo_left(undo_block, ptr) < 5) {
return(0); return(0);
} }
...@@ -1268,8 +1252,7 @@ trx_undo_page_report_modify( ...@@ -1268,8 +1252,7 @@ trx_undo_page_report_modify(
if (true) { if (true) {
/* Write field number to undo log */ /* Write field number to undo log */
if (trx_undo_left(undo_page, ptr) < 5 + 15) { if (trx_undo_left(undo_block, ptr) < 5 + 15) {
return(0); return(0);
} }
...@@ -1317,9 +1300,8 @@ trx_undo_page_report_modify( ...@@ -1317,9 +1300,8 @@ trx_undo_page_report_modify(
if (flen != UNIV_SQL_NULL if (flen != UNIV_SQL_NULL
&& spatial_status != SPATIAL_ONLY) { && spatial_status != SPATIAL_ONLY) {
if (trx_undo_left(undo_page, ptr) if (trx_undo_left(undo_block, ptr)
< flen) { < flen) {
return(0); return(0);
} }
...@@ -1328,7 +1310,7 @@ trx_undo_page_report_modify( ...@@ -1328,7 +1310,7 @@ trx_undo_page_report_modify(
} }
if (spatial_status != SPATIAL_NONE) { if (spatial_status != SPATIAL_NONE) {
if (trx_undo_left(undo_page, ptr) if (trx_undo_left(undo_block, ptr)
< DATA_MBR_LEN) { < DATA_MBR_LEN) {
return(0); return(0);
} }
...@@ -1361,8 +1343,7 @@ trx_undo_page_report_modify( ...@@ -1361,8 +1343,7 @@ trx_undo_page_report_modify(
/* Write field number to undo log. /* Write field number to undo log.
Make sure there is enought space in log */ Make sure there is enought space in log */
if (trx_undo_left(undo_page, ptr) < 5) { if (trx_undo_left(undo_block, ptr) < 5) {
return(0); return(0);
} }
...@@ -1370,7 +1351,7 @@ trx_undo_page_report_modify( ...@@ -1370,7 +1351,7 @@ trx_undo_page_report_modify(
ptr += mach_write_compressed(ptr, pos); ptr += mach_write_compressed(ptr, pos);
ut_ad(col_no < table->n_v_def); ut_ad(col_no < table->n_v_def);
ptr = trx_undo_log_v_idx(undo_page, table, ptr = trx_undo_log_v_idx(undo_block, table,
col_no, ptr, col_no, ptr,
first_v_col); first_v_col);
first_v_col = false; first_v_col = false;
...@@ -1410,9 +1391,8 @@ trx_undo_page_report_modify( ...@@ -1410,9 +1391,8 @@ trx_undo_page_report_modify(
ptr += mach_write_compressed(ptr, flen); ptr += mach_write_compressed(ptr, flen);
if (flen != UNIV_SQL_NULL) { if (flen != UNIV_SQL_NULL) {
if (trx_undo_left(undo_page, ptr) if (trx_undo_left(undo_block, ptr)
< flen) { < flen) {
return(0); return(0);
} }
...@@ -1431,22 +1411,20 @@ trx_undo_page_report_modify( ...@@ -1431,22 +1411,20 @@ trx_undo_page_report_modify(
/*----------------------------------------*/ /*----------------------------------------*/
/* Write pointers to the previous and the next undo log records */ /* Write pointers to the previous and the next undo log records */
if (trx_undo_left(undo_page, ptr) < 2) { if (trx_undo_left(undo_block, ptr) < 2) {
return(0); return(0);
} }
mach_write_to_2(ptr, first_free); mach_write_to_2(ptr, first_free);
ptr += 2; ptr += 2;
mach_write_to_2(undo_page + first_free, ptr - undo_page); const ulint new_free = ptr - undo_block->frame;
mach_write_to_2(undo_block->frame + first_free, new_free);
mach_write_to_2(undo_page + TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_FREE, mach_write_to_2(TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_FREE
ptr - undo_page); + undo_block->frame, new_free);
/* Write to the REDO log about this change in the UNDO log */ /* Write to the REDO log about this change in the UNDO log */
trx_undof_page_add_undo_rec_log(undo_block, first_free, new_free, mtr);
trx_undof_page_add_undo_rec_log(undo_page, first_free,
ptr - undo_page, mtr);
return(first_free); return(first_free);
} }
...@@ -1893,7 +1871,7 @@ trx_undo_page_report_rename(trx_t* trx, const dict_table_t* table, ...@@ -1893,7 +1871,7 @@ trx_undo_page_report_rename(trx_t* trx, const dict_table_t* table,
+ TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_HDR_SIZE + TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_HDR_SIZE
< UNIV_PAGE_SIZE_MIN - 10 - FIL_PAGE_DATA_END); < UNIV_PAGE_SIZE_MIN - 10 - FIL_PAGE_DATA_END);
if (trx_undo_left(block->frame, start) < fixed + len) { if (trx_undo_left(block, start) < fixed + len) {
ut_ad(first_free > TRX_UNDO_PAGE_HDR ut_ad(first_free > TRX_UNDO_PAGE_HDR
+ TRX_UNDO_PAGE_HDR_SIZE); + TRX_UNDO_PAGE_HDR_SIZE);
return 0; return 0;
...@@ -1911,7 +1889,7 @@ trx_undo_page_report_rename(trx_t* trx, const dict_table_t* table, ...@@ -1911,7 +1889,7 @@ trx_undo_page_report_rename(trx_t* trx, const dict_table_t* table,
mach_write_to_2(start, offset); mach_write_to_2(start, offset);
mach_write_to_2(ptr_first_free, offset); mach_write_to_2(ptr_first_free, offset);
trx_undof_page_add_undo_rec_log(block->frame, first_free, offset, mtr); trx_undof_page_add_undo_rec_log(block, first_free, offset, mtr);
return first_free; return first_free;
} }
...@@ -2041,16 +2019,15 @@ trx_undo_report_row_operation( ...@@ -2041,16 +2019,15 @@ trx_undo_report_row_operation(
ut_ad(undo != NULL); ut_ad(undo != NULL);
do { do {
page_t* undo_page = buf_block_get_frame(undo_block);
ulint offset = !rec ulint offset = !rec
? trx_undo_page_report_insert( ? trx_undo_page_report_insert(
undo_page, trx, index, clust_entry, &mtr) undo_block, trx, index, clust_entry, &mtr)
: trx_undo_page_report_modify( : trx_undo_page_report_modify(
undo_page, trx, index, rec, offsets, update, undo_block, trx, index, rec, offsets, update,
cmpl_info, clust_entry, &mtr); cmpl_info, clust_entry, &mtr);
if (UNIV_UNLIKELY(offset == 0)) { if (UNIV_UNLIKELY(offset == 0)) {
if (!trx_undo_erase_page_end(undo_page)) { if (!trx_undo_erase_page_end(undo_block->frame)) {
/* The record did not fit on an empty /* The record did not fit on an empty
undo page. Discard the freshly allocated undo page. Discard the freshly allocated
page and return an error. */ page and return an error. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment