/********************************************************************//**
Removes unnecessary history data from rollback segments. NOTE that when this
function is called, the caller must not have any latches on undo log pages! */
static
void
trx_purge_truncate_history(void)
/*============================*/
{
	trx_rseg_t*	rseg;
	trx_id_t	limit_trx_no;
	undo_no_t	limit_undo_no;

	ut_ad(mutex_own(&(purge_sys->mutex)));

	trx_purge_arr_get_biggest(purge_sys->arr, &limit_trx_no,
				  &limit_undo_no);

	if (ut_dulint_is_zero(limit_trx_no)) {

		limit_trx_no = purge_sys->purge_trx_no;
		limit_undo_no = purge_sys->purge_undo_no;
	}

	/* We play safe and set the truncate limit at most to the purge view
	low_limit number, though this is not necessary */

	if (ut_dulint_cmp(limit_trx_no, purge_sys->view->low_limit_no) >= 0) {
		limit_trx_no = purge_sys->view->low_limit_no;
		limit_undo_no = ut_dulint_zero;
	}

	ut_ad((ut_dulint_cmp(limit_trx_no,
			     purge_sys->view->low_limit_no) <= 0));

	rseg = UT_LIST_GET_FIRST(trx_sys->rseg_list);

	while (rseg) {
		trx_purge_truncate_rseg_history(rseg, limit_trx_no,
						limit_undo_no);
		rseg = UT_LIST_GET_NEXT(rseg_list, rseg);
	}
}
/********************************************************************//**
Removes unnecessary history data from rollback segments. NOTE that when this
function is called, the caller must not have any latches on undo log pages! */
static
void
trx_purge_truncate_history(void)
/*============================*/
{
    trx_rseg_t*	rseg;
    trx_id_t	limit_trx_no;
    undo_no_t	limit_undo_no;

    trx_purge_arr_get_biggest(
        purge_sys->arr, &limit_trx_no, &limit_undo_no);

    if (limit_trx_no == 0) {

        limit_trx_no = purge_sys->purge_trx_no;
        limit_undo_no = purge_sys->purge_undo_no;
    }

    /* We play safe and set the truncate limit at most to the purge view
    low_limit number, though this is not necessary */

    if (limit_trx_no >= purge_sys->view->low_limit_no) {
        limit_trx_no = purge_sys->view->low_limit_no;
        limit_undo_no = 0;
    }

    ut_ad(limit_trx_no <= purge_sys->view->low_limit_no);

    for (rseg = UT_LIST_GET_FIRST(trx_sys->rseg_list);
            rseg != NULL;
            rseg = UT_LIST_GET_NEXT(rseg_list, rseg)) {

        trx_purge_truncate_rseg_history(
            rseg, limit_trx_no, limit_undo_no);
    }
}