117
122
trx_rsegf_set_nth_undo(rsegf, i, FIL_NULL, mtr);
120
/* Add the rollback segment info to the free slot in
121
the trx system header */
123
sys_header = trx_sysf_get(mtr);
125
trx_sysf_rseg_set_space(sys_header, rseg_slot_no, space, mtr);
126
trx_sysf_rseg_set_page_no(sys_header, rseg_slot_no, page_no, mtr);
125
/* Add the rollback segment info to the free slot in the trx system
128
trx_sysf_rseg_set_space(sys_header, *slot_no, space, mtr);
129
trx_sysf_rseg_set_page_no(sys_header, *slot_no, page_no, mtr);
131
134
/***********************************************************************//**
132
Free's an instance of the rollback segment in memory. */
137
trx_rseg_t* rseg) /* in, own: instance to free */
141
mutex_free(&rseg->mutex);
143
/* There can't be any active transactions. */
144
ut_a(UT_LIST_GET_LEN(rseg->update_undo_list) == 0);
145
ut_a(UT_LIST_GET_LEN(rseg->insert_undo_list) == 0);
147
undo = UT_LIST_GET_FIRST(rseg->update_undo_cached);
149
while (undo != NULL) {
150
trx_undo_t* prev_undo = undo;
152
undo = UT_LIST_GET_NEXT(undo_list, undo);
153
UT_LIST_REMOVE(undo_list, rseg->update_undo_cached, prev_undo);
155
trx_undo_mem_free(prev_undo);
158
undo = UT_LIST_GET_FIRST(rseg->insert_undo_cached);
160
while (undo != NULL) {
161
trx_undo_t* prev_undo = undo;
163
undo = UT_LIST_GET_NEXT(undo_list, undo);
164
UT_LIST_REMOVE(undo_list, rseg->insert_undo_cached, prev_undo);
166
trx_undo_mem_free(prev_undo);
169
trx_sys_set_nth_rseg(trx_sys, rseg->id, NULL);
174
/***************************************************************************
175
135
Creates and initializes a rollback segment object. The values for the
176
136
fields are read from the header. The object is inserted to the rseg
177
137
list of the trx system object and a pointer is inserted in the rseg
188
148
ulint page_no, /*!< in: page number of the segment header */
189
149
mtr_t* mtr) /*!< in: mtr */
193
fil_addr_t node_addr;
194
151
trx_rsegf_t* rseg_header;
195
153
trx_ulogf_t* undo_log_hdr;
154
fil_addr_t node_addr;
196
155
ulint sum_of_undo_sizes;
198
158
ut_ad(mutex_own(&kernel_mutex));
200
rseg = mem_zalloc(sizeof(trx_rseg_t));
160
rseg = mem_alloc(sizeof(trx_rseg_t));
203
163
rseg->space = space;
204
164
rseg->zip_size = zip_size;
205
165
rseg->page_no = page_no;
207
mutex_create(rseg_mutex_key, &rseg->mutex, SYNC_RSEG);
167
mutex_create(&rseg->mutex, SYNC_RSEG);
209
169
UT_LIST_ADD_LAST(rseg_list, trx_sys->rseg_list, rseg);
250
/********************************************************************
251
Creates the memory copies for the rollback segments and initializes the
210
/*********************************************************************//**
211
Creates the memory copies for rollback segments and initializes the
252
212
rseg list and array in trx_sys at a database startup. */
255
trx_rseg_create_instance(
256
/*=====================*/
215
trx_rseg_list_and_array_init(
216
/*=========================*/
257
217
trx_sysf_t* sys_header, /*!< in: trx system header */
258
218
mtr_t* mtr) /*!< in: mtr */
224
UT_LIST_INIT(trx_sys->rseg_list);
226
trx_sys->rseg_history_len = 0;
262
228
for (i = 0; i < TRX_SYS_N_RSEGS; i++) {
265
230
page_no = trx_sysf_rseg_get_page_no(sys_header, i, mtr);
267
232
if (page_no == FIL_NULL) {
268
234
trx_sys_set_nth_rseg(trx_sys, i, NULL);
272
trx_rseg_t* rseg = NULL;
274
ut_a(!trx_rseg_get_on_id(i));
276
238
space = trx_sysf_rseg_get_space(sys_header, i, mtr);
278
240
zip_size = space ? fil_space_get_zip_size(space) : 0;
280
rseg = trx_rseg_mem_create(
281
i, space, zip_size, page_no, mtr);
242
trx_rseg_mem_create(i, space, zip_size, page_no, mtr);
288
/*********************************************************************
289
Creates a rollback segment.
290
@return pointer to new rollback segment if create successful */
247
/****************************************************************//**
248
Creates a new rollback segment to the database.
249
@return the created segment object, NULL if fail */
293
trx_rseg_create(void)
294
/*=================*/
254
ulint space, /*!< in: space id */
255
ulint max_size, /*!< in: max size in pages */
256
ulint* id, /*!< out: rseg id */
257
mtr_t* mtr) /*!< in: mtr */
298
trx_rseg_t* rseg = NULL;
302
/* To obey the latching order, acquire the file space
303
x-latch before the kernel mutex. */
304
mtr_x_lock(fil_space_get_latch(TRX_SYS_SPACE, NULL), &mtr);
264
mtr_x_lock(fil_space_get_latch(space, &flags), mtr);
265
zip_size = dict_table_flags_to_zip_size(flags);
306
266
mutex_enter(&kernel_mutex);
308
slot_no = trx_sysf_rseg_find_free(&mtr);
310
if (slot_no != ULINT_UNDEFINED) {
314
trx_sysf_t* sys_header;
316
page_no = trx_rseg_header_create(
317
TRX_SYS_SPACE, 0, ULINT_MAX, slot_no, &mtr);
319
ut_a(page_no != FIL_NULL);
321
ut_ad(!trx_rseg_get_on_id(slot_no));
323
sys_header = trx_sysf_get(&mtr);
325
space = trx_sysf_rseg_get_space(sys_header, slot_no, &mtr);
327
zip_size = space ? fil_space_get_zip_size(space) : 0;
329
rseg = trx_rseg_mem_create(
330
slot_no, space, zip_size, page_no, &mtr);
268
page_no = trx_rseg_header_create(space, zip_size, max_size, id, mtr);
270
if (page_no == FIL_NULL) {
272
mutex_exit(&kernel_mutex);
276
rseg = trx_rseg_mem_create(*id, space, zip_size, page_no, mtr);
333
278
mutex_exit(&kernel_mutex);
339
/********************************************************************
340
Initialize the rollback instance list. */
343
trx_rseg_list_and_array_init(
344
/*=========================*/
345
trx_sysf_t* sys_header, /* in: trx system header */
346
mtr_t* mtr) /* in: mtr */
348
UT_LIST_INIT(trx_sys->rseg_list);
350
trx_sys->rseg_history_len = 0;
352
trx_rseg_create_instance(sys_header, mtr);