122
117
trx_rsegf_set_nth_undo(rsegf, i, FIL_NULL, 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);
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);
134
131
/***********************************************************************//**
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
/***************************************************************************
135
175
Creates and initializes a rollback segment object. The values for the
136
176
fields are read from the header. The object is inserted to the rseg
137
177
list of the trx system object and a pointer is inserted in the rseg
148
188
ulint page_no, /*!< in: page number of the segment header */
149
189
mtr_t* mtr) /*!< in: mtr */
193
fil_addr_t node_addr;
151
194
trx_rsegf_t* rseg_header;
153
195
trx_ulogf_t* undo_log_hdr;
154
fil_addr_t node_addr;
155
196
ulint sum_of_undo_sizes;
158
198
ut_ad(mutex_own(&kernel_mutex));
160
rseg = mem_alloc(sizeof(trx_rseg_t));
200
void *rseg_buf= mem_zalloc(sizeof(trx_rseg_t));
201
rseg = static_cast<trx_rseg_t *>(rseg_buf);
163
204
rseg->space = space;
164
205
rseg->zip_size = zip_size;
165
206
rseg->page_no = page_no;
167
mutex_create(&rseg->mutex, SYNC_RSEG);
208
mutex_create(rseg_mutex_key, &rseg->mutex, SYNC_RSEG);
169
210
UT_LIST_ADD_LAST(rseg_list, trx_sys->rseg_list, rseg);
210
/*********************************************************************//**
211
Creates the memory copies for rollback segments and initializes the
251
/********************************************************************
252
Creates the memory copies for the rollback segments and initializes the
212
253
rseg list and array in trx_sys at a database startup. */
215
trx_rseg_list_and_array_init(
216
/*=========================*/
256
trx_rseg_create_instance(
257
/*=====================*/
217
258
trx_sysf_t* sys_header, /*!< in: trx system header */
218
259
mtr_t* mtr) /*!< in: mtr */
224
UT_LIST_INIT(trx_sys->rseg_list);
226
trx_sys->rseg_history_len = 0;
228
263
for (i = 0; i < TRX_SYS_N_RSEGS; i++) {
230
266
page_no = trx_sysf_rseg_get_page_no(sys_header, i, mtr);
232
268
if (page_no == FIL_NULL) {
234
269
trx_sys_set_nth_rseg(trx_sys, i, NULL);
273
trx_rseg_t* rseg = NULL;
275
ut_a(!trx_rseg_get_on_id(i));
238
277
space = trx_sysf_rseg_get_space(sys_header, i, mtr);
240
279
zip_size = space ? fil_space_get_zip_size(space) : 0;
242
trx_rseg_mem_create(i, space, zip_size, page_no, mtr);
281
rseg = trx_rseg_mem_create(
282
i, space, zip_size, page_no, mtr);
247
/****************************************************************//**
248
Creates a new rollback segment to the database.
249
@return the created segment object, NULL if fail */
289
/*********************************************************************
290
Creates a rollback segment.
291
@return pointer to new rollback segment if create successful */
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 */
294
trx_rseg_create(void)
295
/*=================*/
264
mtr_x_lock(fil_space_get_latch(space, &flags), mtr);
265
zip_size = dict_table_flags_to_zip_size(flags);
299
trx_rseg_t* rseg = NULL;
303
/* To obey the latching order, acquire the file space
304
x-latch before the kernel mutex. */
305
mtr_x_lock(fil_space_get_latch(TRX_SYS_SPACE, NULL), &mtr);
266
307
mutex_enter(&kernel_mutex);
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);
309
slot_no = trx_sysf_rseg_find_free(&mtr);
311
if (slot_no != ULINT_UNDEFINED) {
315
trx_sysf_t* sys_header;
317
page_no = trx_rseg_header_create(
318
TRX_SYS_SPACE, 0, ULINT_MAX, slot_no, &mtr);
320
ut_a(page_no != FIL_NULL);
322
ut_ad(!trx_rseg_get_on_id(slot_no));
324
sys_header = trx_sysf_get(&mtr);
326
space = trx_sysf_rseg_get_space(sys_header, slot_no, &mtr);
328
zip_size = space ? fil_space_get_zip_size(space) : 0;
330
rseg = trx_rseg_mem_create(
331
slot_no, space, zip_size, page_no, &mtr);
276
rseg = trx_rseg_mem_create(*id, space, zip_size, page_no, mtr);
278
334
mutex_exit(&kernel_mutex);
340
/********************************************************************
341
Initialize the rollback instance list. */
344
trx_rseg_list_and_array_init(
345
/*=========================*/
346
trx_sysf_t* sys_header, /* in: trx system header */
347
mtr_t* mtr) /* in: mtr */
349
UT_LIST_INIT(trx_sys->rseg_list);
351
trx_sys->rseg_history_len = 0;
353
trx_rseg_create_instance(sys_header, mtr);