trx0rseg.ic 3.28 KB
Newer Older
osku's avatar
osku committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/******************************************************
Rollback segment

(c) 1996 Innobase Oy

Created 3/26/1996 Heikki Tuuri
*******************************************************/

#include "srv0srv.h"

/**********************************************************************
Gets a rollback segment header. */
UNIV_INLINE
trx_rsegf_t*
trx_rsegf_get(
/*==========*/
				/* out: rollback segment header, page
				x-latched */
	ulint	space,		/* in: space where placed */
20 21
	ulint	zip_size,	/* in: compressed page size in bytes
				or 0 for uncompressed pages */
osku's avatar
osku committed
22 23 24
	ulint	page_no,	/* in: page number of the header */
	mtr_t*	mtr)		/* in: mtr */
{
25
	buf_block_t*	block;
osku's avatar
osku committed
26 27
	trx_rsegf_t*	header;

28
	block = buf_page_get(space, zip_size, page_no, RW_X_LATCH, mtr);
29
	buf_block_dbg_add_level(block, SYNC_RSEG_HEADER);
marko's avatar
marko committed
30

31
	header = TRX_RSEG + buf_block_get_frame(block);
osku's avatar
osku committed
32 33 34 35 36 37 38 39 40 41 42 43 44

	return(header);
}

/**********************************************************************
Gets a newly created rollback segment header. */
UNIV_INLINE
trx_rsegf_t*
trx_rsegf_get_new(
/*==============*/
				/* out: rollback segment header, page
				x-latched */
	ulint	space,		/* in: space where placed */
45 46
	ulint	zip_size,	/* in: compressed page size in bytes
				or 0 for uncompressed pages */
osku's avatar
osku committed
47 48 49
	ulint	page_no,	/* in: page number of the header */
	mtr_t*	mtr)		/* in: mtr */
{
50
	buf_block_t*	block;
osku's avatar
osku committed
51 52
	trx_rsegf_t*	header;

53
	block = buf_page_get(space, zip_size, page_no, RW_X_LATCH, mtr);
54
	buf_block_dbg_add_level(block, SYNC_RSEG_HEADER_NEW);
marko's avatar
marko committed
55

56
	header = TRX_RSEG + buf_block_get_frame(block);
osku's avatar
osku committed
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73

	return(header);
}

/*******************************************************************
Gets the file page number of the nth undo log slot. */
UNIV_INLINE
ulint
trx_rsegf_get_nth_undo(
/*===================*/
				/* out: page number of the undo log segment */
	trx_rsegf_t*	rsegf,	/* in: rollback segment header */
	ulint		n,	/* in: index of slot */
	mtr_t*		mtr)	/* in: mtr */
{
	if (UNIV_UNLIKELY(n >= TRX_RSEG_N_SLOTS)) {
		fprintf(stderr,
74 75
			"InnoDB: Error: trying to get slot %lu of rseg\n",
			(ulong) n);
osku's avatar
osku committed
76 77 78
		ut_error;
	}

79 80
	return(mtr_read_ulint(rsegf + TRX_RSEG_UNDO_SLOTS
			      + n * TRX_RSEG_SLOT_SIZE, MLOG_4BYTES, mtr));
osku's avatar
osku committed
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
}

/*******************************************************************
Sets the file page number of the nth undo log slot. */
UNIV_INLINE
void
trx_rsegf_set_nth_undo(
/*===================*/
	trx_rsegf_t*	rsegf,	/* in: rollback segment header */
	ulint		n,	/* in: index of slot */
	ulint		page_no,/* in: page number of the undo log segment */
	mtr_t*		mtr)	/* in: mtr */
{
	if (UNIV_UNLIKELY(n >= TRX_RSEG_N_SLOTS)) {
		fprintf(stderr,
96 97
			"InnoDB: Error: trying to set slot %lu of rseg\n",
			(ulong) n);
osku's avatar
osku committed
98 99 100 101
		ut_error;
	}

	mlog_write_ulint(rsegf + TRX_RSEG_UNDO_SLOTS + n * TRX_RSEG_SLOT_SIZE,
102
			 page_no, MLOG_4BYTES, mtr);
osku's avatar
osku committed
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
}

/********************************************************************
Looks for a free slot for an undo log segment. */
UNIV_INLINE
ulint
trx_rsegf_undo_find_free(
/*=====================*/
				/* out: slot index or ULINT_UNDEFINED if not
				found */
	trx_rsegf_t*	rsegf,	/* in: rollback segment header */
	mtr_t*		mtr)	/* in: mtr */
{
	ulint		i;
	ulint		page_no;
118

osku's avatar
osku committed
119 120 121 122 123 124 125 126 127 128 129 130
	for (i = 0; i < TRX_RSEG_N_SLOTS; i++) {

		page_no = trx_rsegf_get_nth_undo(rsegf, i, mtr);

		if (page_no == FIL_NULL) {

			return(i);
		}
	}

	return(ULINT_UNDEFINED);
}