#include "trx0rseg.h"#include "trx0undo.h"#include "fut0lst.h"#include "srv0srv.h"#include "trx0purge.h"Include dependency graph for trx0rseg.c:

Go to the source code of this file.
Functions | |
| trx_rseg_t * | trx_rseg_get_on_id (ulint id) |
| ulint | trx_rseg_header_create (ulint space, ulint max_size, ulint *slot_no, mtr_t *mtr) |
| static trx_rseg_t * | trx_rseg_mem_create (ulint id, ulint space, ulint page_no, mtr_t *mtr) |
| void | trx_rseg_list_and_array_init (trx_sysf_t *sys_header, mtr_t *mtr) |
| trx_rseg_t * | trx_rseg_create (ulint space, ulint max_size, ulint *id, mtr_t *mtr) |
| trx_rseg_t* trx_rseg_create | ( | ulint | space, | |
| ulint | max_size, | |||
| ulint * | id, | |||
| mtr_t * | mtr | |||
| ) |
Definition at line 231 of file trx0rseg.c.
References FIL_NULL, fil_space_get_latch(), kernel_mutex, mtr_x_lock, mutex_enter, mutex_exit(), NULL, trx_rseg_header_create(), and trx_rseg_mem_create().
00233 : the created segment object, NULL if 00234 fail */ 00235 ulint space, /* in: space id */ 00236 ulint max_size, /* in: max size in pages */ 00237 ulint* id, /* out: rseg id */ 00238 mtr_t* mtr) /* in: mtr */ 00239 { 00240 ulint page_no; 00241 trx_rseg_t* rseg; 00242 00243 mtr_x_lock(fil_space_get_latch(space), mtr); 00244 mutex_enter(&kernel_mutex); 00245 00246 page_no = trx_rseg_header_create(space, max_size, id, mtr); 00247 00248 if (page_no == FIL_NULL) { 00249 00250 mutex_exit(&kernel_mutex); 00251 return(NULL); 00252 } 00253 00254 rseg = trx_rseg_mem_create(*id, space, page_no, mtr); 00255 00256 mutex_exit(&kernel_mutex); 00257 00258 return(rseg); 00259 }
Here is the call graph for this function:

| trx_rseg_t* trx_rseg_get_on_id | ( | ulint | id | ) |
Definition at line 24 of file trx0rseg.c.
References trx_rseg_struct::id, trx_sys, ut_ad, UT_LIST_GET_FIRST, and UT_LIST_GET_NEXT.
Referenced by trx_undo_get_undo_rec_low().
00026 : rollback segment */ 00027 ulint id) /* in: rollback segment id */ 00028 { 00029 trx_rseg_t* rseg; 00030 00031 rseg = UT_LIST_GET_FIRST(trx_sys->rseg_list); 00032 ut_ad(rseg); 00033 00034 while (rseg->id != id) { 00035 rseg = UT_LIST_GET_NEXT(rseg_list, rseg); 00036 ut_ad(rseg); 00037 } 00038 00039 return(rseg); 00040 }
Here is the caller graph for this function:

Definition at line 47 of file trx0rseg.c.
References buf_frame_get_page_no(), FIL_NULL, fil_space_get_latch(), flst_init(), fseg_create(), kernel_mutex, MLOG_4BYTES, mlog_write_ulint(), mtr_memo_contains(), MTR_MEMO_X_LOCK, NULL, page, page_t, SYNC_RSEG_HEADER_NEW, TRX_RSEG, TRX_RSEG_FSEG_HEADER, TRX_RSEG_HISTORY, TRX_RSEG_HISTORY_SIZE, TRX_RSEG_MAX_SIZE, TRX_RSEG_N_SLOTS, trx_rsegf_get_new(), trx_rsegf_set_nth_undo(), trx_sysf_get(), trx_sysf_rseg_find_free(), trx_sysf_rseg_set_page_no(), trx_sysf_rseg_set_space(), and ut_ad.
Referenced by trx_rseg_create(), and trx_sysf_create().
00049 : page number of the created segment, 00050 FIL_NULL if fail */ 00051 ulint space, /* in: space id */ 00052 ulint max_size, /* in: max size in pages */ 00053 ulint* slot_no, /* out: rseg id == slot number in trx sys */ 00054 mtr_t* mtr) /* in: mtr */ 00055 { 00056 ulint page_no; 00057 trx_rsegf_t* rsegf; 00058 trx_sysf_t* sys_header; 00059 ulint i; 00060 page_t* page; 00061 00062 ut_ad(mtr); 00063 #ifdef UNIV_SYNC_DEBUG 00064 ut_ad(mutex_own(&kernel_mutex)); 00065 #endif /* UNIV_SYNC_DEBUG */ 00066 ut_ad(mtr_memo_contains(mtr, fil_space_get_latch(space), 00067 MTR_MEMO_X_LOCK)); 00068 sys_header = trx_sysf_get(mtr); 00069 00070 *slot_no = trx_sysf_rseg_find_free(mtr); 00071 00072 if (*slot_no == ULINT_UNDEFINED) { 00073 00074 return(FIL_NULL); 00075 } 00076 00077 /* Allocate a new file segment for the rollback segment */ 00078 page = fseg_create(space, 0, TRX_RSEG + TRX_RSEG_FSEG_HEADER, mtr); 00079 00080 if (page == NULL) { 00081 /* No space left */ 00082 00083 return(FIL_NULL); 00084 } 00085 00086 #ifdef UNIV_SYNC_DEBUG 00087 buf_page_dbg_add_level(page, SYNC_RSEG_HEADER_NEW); 00088 #endif /* UNIV_SYNC_DEBUG */ 00089 00090 page_no = buf_frame_get_page_no(page); 00091 00092 /* Get the rollback segment file page */ 00093 rsegf = trx_rsegf_get_new(space, page_no, mtr); 00094 00095 /* Initialize max size field */ 00096 mlog_write_ulint(rsegf + TRX_RSEG_MAX_SIZE, max_size, MLOG_4BYTES, mtr); 00097 00098 /* Initialize the history list */ 00099 00100 mlog_write_ulint(rsegf + TRX_RSEG_HISTORY_SIZE, 0, MLOG_4BYTES, mtr); 00101 flst_init(rsegf + TRX_RSEG_HISTORY, mtr); 00102 00103 /* Reset the undo log slots */ 00104 for (i = 0; i < TRX_RSEG_N_SLOTS; i++) { 00105 00106 trx_rsegf_set_nth_undo(rsegf, i, FIL_NULL, mtr); 00107 } 00108 00109 /* Add the rollback segment info to the free slot in the trx system 00110 header */ 00111 00112 trx_sysf_rseg_set_space(sys_header, *slot_no, space, mtr); 00113 trx_sysf_rseg_set_page_no(sys_header, *slot_no, page_no, mtr); 00114 00115 return(page_no); 00116 }
Here is the call graph for this function:

Here is the caller graph for this function:

| void trx_rseg_list_and_array_init | ( | trx_sysf_t * | sys_header, | |
| mtr_t * | mtr | |||
| ) |
Definition at line 199 of file trx0rseg.c.
References FIL_NULL, NULL, trx_sys_struct::rseg_history_len, trx_rseg_mem_create(), trx_sys, TRX_SYS_N_RSEGS, trx_sys_set_nth_rseg(), trx_sysf_rseg_get_page_no(), trx_sysf_rseg_get_space(), and UT_LIST_INIT.
Referenced by trx_sys_init_at_db_start().
00201 : trx system header */ 00202 mtr_t* mtr) /* in: mtr */ 00203 { 00204 ulint i; 00205 ulint page_no; 00206 ulint space; 00207 00208 UT_LIST_INIT(trx_sys->rseg_list); 00209 00210 trx_sys->rseg_history_len = 0; 00211 00212 for (i = 0; i < TRX_SYS_N_RSEGS; i++) { 00213 00214 page_no = trx_sysf_rseg_get_page_no(sys_header, i, mtr); 00215 00216 if (page_no == FIL_NULL) { 00217 00218 trx_sys_set_nth_rseg(trx_sys, i, NULL); 00219 } else { 00220 space = trx_sysf_rseg_get_space(sys_header, i, mtr); 00221 00222 trx_rseg_mem_create(i, space, page_no, mtr); 00223 } 00224 } 00225 }
Here is the call graph for this function:

Here is the caller graph for this function:

| static trx_rseg_t* trx_rseg_mem_create | ( | ulint | id, | |
| ulint | space, | |||
| ulint | page_no, | |||
| mtr_t * | mtr | |||
| ) | [static] |
Definition at line 125 of file trx0rseg.c.
References fil_addr_struct::boffset, trx_rseg_struct::curr_size, FIL_NULL, flst_get_last(), flst_get_len(), trx_rseg_struct::id, kernel_mutex, trx_rseg_struct::last_del_marks, trx_rseg_struct::last_offset, trx_rseg_struct::last_page_no, trx_rseg_struct::last_trx_no, trx_rseg_struct::max_size, mem_alloc, MLOG_2BYTES, MLOG_4BYTES, mtr_read_dulint(), mtr_read_ulint(), trx_rseg_struct::mutex, mutex_create, fil_addr_struct::page, trx_rseg_struct::page_no, trx_sys_struct::rseg_history_len, trx_rseg_struct::space, SYNC_RSEG, trx_purge_get_log_from_hist(), TRX_RSEG_HISTORY, TRX_RSEG_HISTORY_SIZE, TRX_RSEG_MAX_SIZE, trx_rsegf_get_new(), trx_sys, trx_sys_set_nth_rseg(), TRX_UNDO_DEL_MARKS, trx_undo_lists_init(), trx_undo_page_get(), TRX_UNDO_TRX_NO, ut_ad, and UT_LIST_ADD_LAST.
Referenced by trx_rseg_create(), and trx_rseg_list_and_array_init().
00127 : rollback segment object */ 00128 ulint id, /* in: rollback segment id */ 00129 ulint space, /* in: space where the segment placed */ 00130 ulint page_no, /* in: page number of the segment header */ 00131 mtr_t* mtr) /* in: mtr */ 00132 { 00133 trx_rsegf_t* rseg_header; 00134 trx_rseg_t* rseg; 00135 trx_ulogf_t* undo_log_hdr; 00136 fil_addr_t node_addr; 00137 ulint sum_of_undo_sizes; 00138 ulint len; 00139 00140 #ifdef UNIV_SYNC_DEBUG 00141 ut_ad(mutex_own(&kernel_mutex)); 00142 #endif /* UNIV_SYNC_DEBUG */ 00143 00144 rseg = mem_alloc(sizeof(trx_rseg_t)); 00145 00146 rseg->id = id; 00147 rseg->space = space; 00148 rseg->page_no = page_no; 00149 00150 mutex_create(&rseg->mutex, SYNC_RSEG); 00151 00152 UT_LIST_ADD_LAST(rseg_list, trx_sys->rseg_list, rseg); 00153 00154 trx_sys_set_nth_rseg(trx_sys, id, rseg); 00155 00156 rseg_header = trx_rsegf_get_new(space, page_no, mtr); 00157 00158 rseg->max_size = mtr_read_ulint(rseg_header + TRX_RSEG_MAX_SIZE, 00159 MLOG_4BYTES, mtr); 00160 00161 /* Initialize the undo log lists according to the rseg header */ 00162 00163 sum_of_undo_sizes = trx_undo_lists_init(rseg); 00164 00165 rseg->curr_size = mtr_read_ulint(rseg_header + TRX_RSEG_HISTORY_SIZE, 00166 MLOG_4BYTES, mtr) 00167 + 1 + sum_of_undo_sizes; 00168 00169 len = flst_get_len(rseg_header + TRX_RSEG_HISTORY, mtr); 00170 if (len > 0) { 00171 trx_sys->rseg_history_len += len; 00172 00173 node_addr = trx_purge_get_log_from_hist( 00174 flst_get_last(rseg_header + TRX_RSEG_HISTORY, 00175 mtr)); 00176 rseg->last_page_no = node_addr.page; 00177 rseg->last_offset = node_addr.boffset; 00178 00179 undo_log_hdr = trx_undo_page_get(rseg->space, node_addr.page, 00180 mtr) + node_addr.boffset; 00181 00182 rseg->last_trx_no = mtr_read_dulint( 00183 undo_log_hdr + TRX_UNDO_TRX_NO, mtr); 00184 rseg->last_del_marks = mtr_read_ulint( 00185 undo_log_hdr + TRX_UNDO_DEL_MARKS, 00186 MLOG_2BYTES, mtr); 00187 } else { 00188 rseg->last_page_no = FIL_NULL; 00189 } 00190 00191 return(rseg); 00192 }
Here is the call graph for this function:

Here is the caller graph for this function:

1.4.7

