1
/*****************************************************************************
3
Copyright (C) 1996, 2009, Innobase Oy. All Rights Reserved.
5
This program is free software; you can redistribute it and/or modify it under
6
the terms of the GNU General Public License as published by the Free Software
7
Foundation; version 2 of the License.
9
This program is distributed in the hope that it will be useful, but WITHOUT
10
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
13
You should have received a copy of the GNU General Public License along with
14
this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
15
St, Fifth Floor, Boston, MA 02110-1301 USA
17
*****************************************************************************/
19
/**************************************************//**
20
@file include/trx0undo.ic
1
/******************************************************
21
2
Transaction undo log
23
6
Created 3/26/1996 Heikki Tuuri
24
7
*******************************************************/
26
9
#include "data0type.h"
27
10
#include "page0page.h"
29
#ifndef UNIV_HOTBACKUP
30
/***********************************************************************//**
31
Builds a roll pointer.
32
@return roll pointer */
12
/***************************************************************************
13
Builds a roll pointer dulint. */
35
16
trx_undo_build_roll_ptr(
36
17
/*====================*/
37
ibool is_insert, /*!< in: TRUE if insert undo log */
38
ulint rseg_id, /*!< in: rollback segment id */
39
ulint page_no, /*!< in: page number */
40
ulint offset) /*!< in: offset of the undo entry within page */
18
/* out: roll pointer */
19
ibool is_insert, /* in: TRUE if insert undo log */
20
ulint rseg_id, /* in: rollback segment id */
21
ulint page_no, /* in: page number */
22
ulint offset) /* in: offset of the undo entry within page */
43
24
#if DATA_ROLL_PTR_LEN != 7
44
25
# error "DATA_ROLL_PTR_LEN != 7"
46
ut_ad(is_insert == 0 || is_insert == 1);
47
ut_ad(rseg_id < TRX_SYS_N_RSEGS);
48
ut_ad(offset < 65536);
50
roll_ptr = (roll_ptr_t) is_insert << 55
51
| (roll_ptr_t) rseg_id << 48
52
| (roll_ptr_t) page_no << 16
29
return(ut_dulint_create(is_insert * 128 * 256 * 256
31
+ (page_no / 256) / 256,
32
(page_no % (256 * 256)) * 256 * 256
57
/***********************************************************************//**
58
Decodes a roll pointer. */
36
/***************************************************************************
37
Decodes a roll pointer dulint. */
61
40
trx_undo_decode_roll_ptr(
62
41
/*=====================*/
63
roll_ptr_t roll_ptr, /*!< in: roll pointer */
64
ibool* is_insert, /*!< out: TRUE if insert undo log */
65
ulint* rseg_id, /*!< out: rollback segment id */
66
ulint* page_no, /*!< out: page number */
67
ulint* offset) /*!< out: offset of the undo
42
dulint roll_ptr, /* in: roll pointer */
43
ibool* is_insert, /* out: TRUE if insert undo log */
44
ulint* rseg_id, /* out: rollback segment id */
45
ulint* page_no, /* out: page number */
46
ulint* offset) /* out: offset of the undo entry within page */
70
50
#if DATA_ROLL_PTR_LEN != 7
71
51
# error "DATA_ROLL_PTR_LEN != 7"
74
54
# error "TRUE != 1"
76
ut_ad(roll_ptr < (1ULL << 56));
77
*offset = (ulint) roll_ptr & 0xFFFF;
79
*page_no = (ulint) roll_ptr & 0xFFFFFFFF;
81
*rseg_id = (ulint) roll_ptr & 0x7F;
83
*is_insert = (ibool) roll_ptr; /* TRUE==1 */
56
high = ut_dulint_get_high(roll_ptr);
57
low = ut_dulint_get_low(roll_ptr);
59
*offset = low % (256 * 256);
61
*is_insert = high / (256 * 256 * 128); /* TRUE == 1 */
62
*rseg_id = (high / (256 * 256)) % 128;
64
*page_no = (high % (256 * 256)) * 256 * 256
86
/***********************************************************************//**
87
Returns TRUE if the roll pointer is of the insert type.
88
@return TRUE if insert undo log */
68
/***************************************************************************
69
Returns TRUE if the roll pointer is of the insert type. */
91
72
trx_undo_roll_ptr_is_insert(
92
73
/*========================*/
93
roll_ptr_t roll_ptr) /*!< in: roll pointer */
74
/* out: TRUE if insert undo log */
75
dulint roll_ptr) /* in: roll pointer */
95
78
#if DATA_ROLL_PTR_LEN != 7
96
79
# error "DATA_ROLL_PTR_LEN != 7"
99
82
# error "TRUE != 1"
101
ut_ad(roll_ptr < (1ULL << 56));
102
return((ibool) (roll_ptr >> 55));
84
high = ut_dulint_get_high(roll_ptr);
86
return(high / (256 * 256 * 128));
104
#endif /* !UNIV_HOTBACKUP */
106
/*****************************************************************//**
89
/*********************************************************************
107
90
Writes a roll ptr to an index page. In case that the size changes in
108
91
some future version, this function should be used instead of
138
120
return(mach_read_from_7(ptr));
141
#ifndef UNIV_HOTBACKUP
142
/******************************************************************//**
143
Gets an undo log page and x-latches it.
144
@return pointer to page x-latched */
123
/**********************************************************************
124
Gets an undo log page and x-latches it. */
147
127
trx_undo_page_get(
148
128
/*==============*/
149
ulint space, /*!< in: space where placed */
150
ulint zip_size, /*!< in: compressed page size in bytes
129
/* out: pointer to page x-latched */
130
ulint space, /* in: space where placed */
131
ulint zip_size, /* in: compressed page size in bytes
151
132
or 0 for uncompressed pages */
152
ulint page_no, /*!< in: page number */
153
mtr_t* mtr) /*!< in: mtr */
133
ulint page_no, /* in: page number */
134
mtr_t* mtr) /* in: mtr */
155
136
buf_block_t* block = buf_page_get(space, zip_size, page_no,
156
137
RW_X_LATCH, mtr);
159
140
return(buf_block_get_frame(block));
162
/******************************************************************//**
163
Gets an undo log page and s-latches it.
164
@return pointer to page s-latched */
143
/**********************************************************************
144
Gets an undo log page and s-latches it. */
167
147
trx_undo_page_get_s_latched(
168
148
/*========================*/
169
ulint space, /*!< in: space where placed */
170
ulint zip_size, /*!< in: compressed page size in bytes
149
/* out: pointer to page s-latched */
150
ulint space, /* in: space where placed */
151
ulint zip_size, /* in: compressed page size in bytes
171
152
or 0 for uncompressed pages */
172
ulint page_no, /*!< in: page number */
173
mtr_t* mtr) /*!< in: mtr */
153
ulint page_no, /* in: page number */
154
mtr_t* mtr) /* in: mtr */
175
156
buf_block_t* block = buf_page_get(space, zip_size, page_no,
176
157
RW_S_LATCH, mtr);
264
245
return(undo_page + mach_read_from_2(rec - 2));
267
/******************************************************************//**
248
/**********************************************************************
268
249
Returns the next undo log record on the page in the specified log, or
270
@return pointer to record, NULL if none */
250
NULL if none exists. */
273
253
trx_undo_page_get_next_rec(
274
254
/*=======================*/
275
trx_undo_rec_t* rec, /*!< in: undo log record */
276
ulint page_no,/*!< in: undo log header page number */
277
ulint offset) /*!< in: undo log header offset on page */
255
/* out: pointer to record, NULL if none */
256
trx_undo_rec_t* rec, /* in: undo log record */
257
ulint page_no,/* in: undo log header page number */
258
ulint offset) /* in: undo log header offset on page */
279
260
page_t* undo_page;
294
275
return(undo_page + next);
297
/******************************************************************//**
278
/**********************************************************************
298
279
Returns the last undo record on the page in the specified undo log, or
300
@return pointer to record, NULL if none */
280
NULL if none exists. */
303
283
trx_undo_page_get_last_rec(
304
284
/*=======================*/
305
page_t* undo_page,/*!< in: undo log page */
306
ulint page_no,/*!< in: undo log header page number */
307
ulint offset) /*!< in: undo log header offset on page */
285
/* out: pointer to record, NULL if none */
286
page_t* undo_page,/* in: undo log page */
287
ulint page_no,/* in: undo log header page number */
288
ulint offset) /* in: undo log header offset on page */
320
301
return(undo_page + mach_read_from_2(undo_page + end - 2));
323
/******************************************************************//**
304
/**********************************************************************
324
305
Returns the first undo record on the page in the specified undo log, or
326
@return pointer to record, NULL if none */
306
NULL if none exists. */
329
309
trx_undo_page_get_first_rec(
330
310
/*========================*/
331
page_t* undo_page,/*!< in: undo log page */
332
ulint page_no,/*!< in: undo log header page number */
333
ulint offset) /*!< in: undo log header offset on page */
311
/* out: pointer to record, NULL if none */
312
page_t* undo_page,/* in: undo log page */
313
ulint page_no,/* in: undo log header page number */
314
ulint offset) /* in: undo log header offset on page */