1
by brian
clean slate |
1 |
/******************************************************
|
2 |
Rollback segment
|
|
3 |
||
4 |
(c) 1996 Innobase Oy
|
|
5 |
||
6 |
Created 3/26/1996 Heikki Tuuri
|
|
7 |
*******************************************************/
|
|
8 |
||
9 |
#ifndef trx0rseg_h
|
|
10 |
#define trx0rseg_h
|
|
11 |
||
12 |
#include "univ.i" |
|
13 |
#include "trx0types.h" |
|
14 |
#include "trx0sys.h" |
|
15 |
||
16 |
/**********************************************************************
|
|
17 |
Gets a rollback segment header. */
|
|
18 |
UNIV_INLINE
|
|
19 |
trx_rsegf_t* |
|
20 |
trx_rsegf_get( |
|
21 |
/*==========*/
|
|
22 |
/* out: rollback segment header, page
|
|
23 |
x-latched */
|
|
24 |
ulint space, /* in: space where placed */ |
|
25 |
ulint page_no, /* in: page number of the header */ |
|
26 |
mtr_t* mtr); /* in: mtr */ |
|
27 |
/**********************************************************************
|
|
28 |
Gets a newly created rollback segment header. */
|
|
29 |
UNIV_INLINE
|
|
30 |
trx_rsegf_t* |
|
31 |
trx_rsegf_get_new( |
|
32 |
/*==============*/
|
|
33 |
/* out: rollback segment header, page
|
|
34 |
x-latched */
|
|
35 |
ulint space, /* in: space where placed */ |
|
36 |
ulint page_no, /* in: page number of the header */ |
|
37 |
mtr_t* mtr); /* in: mtr */ |
|
38 |
/*******************************************************************
|
|
39 |
Gets the file page number of the nth undo log slot. */
|
|
40 |
UNIV_INLINE
|
|
41 |
ulint
|
|
42 |
trx_rsegf_get_nth_undo( |
|
43 |
/*===================*/
|
|
44 |
/* out: page number of the undo log segment */
|
|
45 |
trx_rsegf_t* rsegf, /* in: rollback segment header */ |
|
46 |
ulint n, /* in: index of slot */ |
|
47 |
mtr_t* mtr); /* in: mtr */ |
|
48 |
/*******************************************************************
|
|
49 |
Sets the file page number of the nth undo log slot. */
|
|
50 |
UNIV_INLINE
|
|
51 |
void
|
|
52 |
trx_rsegf_set_nth_undo( |
|
53 |
/*===================*/
|
|
54 |
trx_rsegf_t* rsegf, /* in: rollback segment header */ |
|
55 |
ulint n, /* in: index of slot */ |
|
56 |
ulint page_no,/* in: page number of the undo log segment */ |
|
57 |
mtr_t* mtr); /* in: mtr */ |
|
58 |
/********************************************************************
|
|
59 |
Looks for a free slot for an undo log segment. */
|
|
60 |
UNIV_INLINE
|
|
61 |
ulint
|
|
62 |
trx_rsegf_undo_find_free( |
|
63 |
/*=====================*/
|
|
64 |
/* out: slot index or ULINT_UNDEFINED if not
|
|
65 |
found */
|
|
66 |
trx_rsegf_t* rsegf, /* in: rollback segment header */ |
|
67 |
mtr_t* mtr); /* in: mtr */ |
|
68 |
/**********************************************************************
|
|
69 |
Looks for a rollback segment, based on the rollback segment id. */
|
|
70 |
||
71 |
trx_rseg_t* |
|
72 |
trx_rseg_get_on_id( |
|
73 |
/*===============*/
|
|
74 |
/* out: rollback segment */
|
|
75 |
ulint id); /* in: rollback segment id */ |
|
76 |
/********************************************************************
|
|
77 |
Creates a rollback segment header. This function is called only when
|
|
78 |
a new rollback segment is created in the database. */
|
|
79 |
||
80 |
ulint
|
|
81 |
trx_rseg_header_create( |
|
82 |
/*===================*/
|
|
83 |
/* out: page number of the created segment,
|
|
84 |
FIL_NULL if fail */
|
|
85 |
ulint space, /* in: space id */ |
|
86 |
ulint max_size, /* in: max size in pages */ |
|
87 |
ulint* slot_no, /* out: rseg id == slot number in trx sys */ |
|
88 |
mtr_t* mtr); /* in: mtr */ |
|
89 |
/*************************************************************************
|
|
90 |
Creates the memory copies for rollback segments and initializes the
|
|
91 |
rseg list and array in trx_sys at a database startup. */
|
|
92 |
||
93 |
void
|
|
94 |
trx_rseg_list_and_array_init( |
|
95 |
/*=========================*/
|
|
96 |
trx_sysf_t* sys_header, /* in: trx system header */ |
|
97 |
mtr_t* mtr); /* in: mtr */ |
|
98 |
/********************************************************************
|
|
99 |
Creates a new rollback segment to the database. */
|
|
100 |
||
101 |
trx_rseg_t* |
|
102 |
trx_rseg_create( |
|
103 |
/*============*/
|
|
104 |
/* out: the created segment object, NULL if
|
|
105 |
fail */
|
|
106 |
ulint space, /* in: space id */ |
|
107 |
ulint max_size, /* in: max size in pages */ |
|
108 |
ulint* id, /* out: rseg id */ |
|
109 |
mtr_t* mtr); /* in: mtr */ |
|
110 |
||
111 |
||
112 |
/* Number of undo log slots in a rollback segment file copy */
|
|
113 |
#define TRX_RSEG_N_SLOTS 1024
|
|
114 |
||
115 |
/* Maximum number of transactions supported by a single rollback segment */
|
|
116 |
#define TRX_RSEG_MAX_N_TRXS (TRX_RSEG_N_SLOTS / 2)
|
|
117 |
||
118 |
/* The rollback segment memory object */
|
|
119 |
struct trx_rseg_struct{ |
|
120 |
/*--------------------------------------------------------*/
|
|
121 |
ulint id; /* rollback segment id == the index of |
|
122 |
its slot in the trx system file copy */
|
|
123 |
mutex_t mutex; /* mutex protecting the fields in this |
|
124 |
struct except id; NOTE that the latching
|
|
125 |
order must always be kernel mutex ->
|
|
126 |
rseg mutex */
|
|
127 |
ulint space; /* space where the rollback segment is |
|
128 |
header is placed */
|
|
129 |
ulint page_no;/* page number of the rollback segment |
|
130 |
header */
|
|
131 |
ulint max_size;/* maximum allowed size in pages */ |
|
132 |
ulint curr_size;/* current size in pages */ |
|
133 |
/*--------------------------------------------------------*/
|
|
134 |
/* Fields for update undo logs */
|
|
135 |
UT_LIST_BASE_NODE_T(trx_undo_t) update_undo_list; |
|
136 |
/* List of update undo logs */
|
|
137 |
UT_LIST_BASE_NODE_T(trx_undo_t) update_undo_cached; |
|
138 |
/* List of update undo log segments
|
|
139 |
cached for fast reuse */
|
|
140 |
/*--------------------------------------------------------*/
|
|
141 |
/* Fields for insert undo logs */
|
|
142 |
UT_LIST_BASE_NODE_T(trx_undo_t) insert_undo_list; |
|
143 |
/* List of insert undo logs */
|
|
144 |
UT_LIST_BASE_NODE_T(trx_undo_t) insert_undo_cached; |
|
145 |
/* List of insert undo log segments
|
|
146 |
cached for fast reuse */
|
|
147 |
/*--------------------------------------------------------*/
|
|
148 |
ulint last_page_no; /* Page number of the last not yet |
|
149 |
purged log header in the history list;
|
|
150 |
FIL_NULL if all list purged */
|
|
151 |
ulint last_offset; /* Byte offset of the last not yet |
|
152 |
purged log header */
|
|
153 |
dulint last_trx_no; /* Transaction number of the last not |
|
154 |
yet purged log */
|
|
155 |
ibool last_del_marks; /* TRUE if the last not yet purged log |
|
156 |
needs purging */
|
|
157 |
/*--------------------------------------------------------*/
|
|
158 |
UT_LIST_NODE_T(trx_rseg_t) rseg_list; |
|
159 |
/* the list of the rollback segment
|
|
160 |
memory objects */
|
|
161 |
};
|
|
162 |
||
163 |
/* Undo log segment slot in a rollback segment header */
|
|
164 |
/*-------------------------------------------------------------*/
|
|
165 |
#define TRX_RSEG_SLOT_PAGE_NO 0 /* Page number of the header page of |
|
166 |
an undo log segment */
|
|
167 |
/*-------------------------------------------------------------*/
|
|
168 |
/* Slot size */
|
|
169 |
#define TRX_RSEG_SLOT_SIZE 4
|
|
170 |
||
171 |
/* The offset of the rollback segment header on its page */
|
|
172 |
#define TRX_RSEG FSEG_PAGE_DATA
|
|
173 |
||
174 |
/* Transaction rollback segment header */
|
|
175 |
/*-------------------------------------------------------------*/
|
|
176 |
#define TRX_RSEG_MAX_SIZE 0 /* Maximum allowed size for rollback |
|
177 |
segment in pages */
|
|
178 |
#define TRX_RSEG_HISTORY_SIZE 4 /* Number of file pages occupied |
|
179 |
by the logs in the history list */
|
|
180 |
#define TRX_RSEG_HISTORY 8 /* The update undo logs for committed |
|
181 |
transactions */
|
|
182 |
#define TRX_RSEG_FSEG_HEADER (8 + FLST_BASE_NODE_SIZE)
|
|
183 |
/* Header for the file segment where
|
|
184 |
this page is placed */
|
|
185 |
#define TRX_RSEG_UNDO_SLOTS (8 + FLST_BASE_NODE_SIZE + FSEG_HEADER_SIZE)
|
|
186 |
/* Undo log segment slots */
|
|
187 |
/*-------------------------------------------------------------*/
|
|
188 |
||
189 |
#ifndef UNIV_NONINL
|
|
190 |
#include "trx0rseg.ic" |
|
191 |
#endif
|
|
192 |
||
193 |
#endif
|