Skip to content

Commit 48d6a5f

Browse files
dr-mvuvova
authored andcommitted
MDEV-31234 fixup: Free some UNDO pages earlier
trx_purge_truncate_rseg_history(): Add a parameter to specify if the entire rollback segment is safe to be freed. If not, we may still be able to invoke trx_undo_truncate_start() and free some pages.
1 parent 318012a commit 48d6a5f

File tree

1 file changed

+11
-4
lines changed

1 file changed

+11
-4
lines changed

storage/innobase/trx/trx0purge.cc

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -399,12 +399,14 @@ void trx_purge_free_segment(mtr_t &mtr, trx_rseg_t* rseg, fil_addr_t hdr_addr)
399399

400400
/** Remove unnecessary history data from a rollback segment.
401401
@param[in,out] rseg rollback segment
402-
@param[in] limit truncate anything before this */
402+
@param[in] limit truncate anything before this
403+
@param[in] all whether everything can be truncated */
403404
static
404405
void
405406
trx_purge_truncate_rseg_history(
406407
trx_rseg_t& rseg,
407-
const purge_sys_t::iterator& limit)
408+
const purge_sys_t::iterator& limit,
409+
bool all)
408410
{
409411
fil_addr_t hdr_addr;
410412
fil_addr_t prev_hdr_addr;
@@ -443,6 +445,10 @@ trx_purge_truncate_rseg_history(
443445
goto func_exit;
444446
}
445447

448+
if (!all) {
449+
goto func_exit;
450+
}
451+
446452
prev_hdr_addr = flst_get_prev_addr(block->frame + hdr_addr.boffset
447453
+ TRX_UNDO_HISTORY_NODE);
448454
prev_hdr_addr.boffset = static_cast<uint16_t>(prev_hdr_addr.boffset
@@ -539,8 +545,9 @@ static void trx_purge_truncate_history()
539545
ut_ad(rseg->id == i);
540546
ut_ad(rseg->is_persistent());
541547
mutex_enter(&rseg->mutex);
542-
if (!rseg->trx_ref_count && rseg->needs_purge <= head.trx_no)
543-
trx_purge_truncate_rseg_history(*rseg, head);
548+
trx_purge_truncate_rseg_history(*rseg, head,
549+
!rseg->trx_ref_count &&
550+
rseg->needs_purge <= head.trx_no);
544551
mutex_exit(&rseg->mutex);
545552
}
546553
}

0 commit comments

Comments
 (0)