#include "mtr0mtr.h"#include "buf0buf.h"#include "page0types.h"#include "mtr0log.h"#include "log0log.h"Include dependency graph for mtr0mtr.c:

Go to the source code of this file.
Functions | |
| mtr_t * | mtr_start_noninline (mtr_t *mtr) |
| UNIV_INLINE void | mtr_memo_slot_release (mtr_t *mtr, mtr_memo_slot_t *slot) |
| UNIV_INLINE void | mtr_memo_pop_all (mtr_t *mtr) |
| static void | mtr_log_reserve_and_write (mtr_t *mtr) |
| void | mtr_commit (mtr_t *mtr) |
| void | mtr_rollback_to_savepoint (mtr_t *mtr, ulint savepoint) |
| void | mtr_memo_release (mtr_t *mtr, void *object, ulint type) |
| ulint | mtr_read_ulint (byte *ptr, ulint type, mtr_t *mtr __attribute__((unused))) |
| dulint | mtr_read_dulint (byte *ptr, mtr_t *mtr __attribute__((unused))) |
| void | mtr_print (mtr_t *mtr) |
| void mtr_commit | ( | mtr_t * | mtr | ) |
Definition at line 168 of file mtr0mtr.c.
References dyn_array_free(), mtr_struct::log, log_release(), mtr_struct::magic_n, mtr_struct::memo, mtr_struct::modifications, MTR_ACTIVE, MTR_COMMITTED, MTR_COMMITTING, mtr_log_reserve_and_write(), MTR_MAGIC_N, mtr_memo_pop_all(), mtr_struct::state, and ut_ad.
Referenced by btr_copy_externally_stored_field(), btr_estimate_n_rows_in_range(), btr_estimate_number_of_different_key_vals(), btr_free_but_not_root(), btr_free_externally_stored_field(), btr_get_size(), btr_pcur_move_backward_from_page(), btr_search_drop_page_hash_when_freed(), btr_store_big_rec_extern_fields(), btr_validate_level(), btr_validate_tree(), buf_page_init_for_read(), dict_boot(), dict_build_table_def_step(), dict_check_tablespaces_and_store_max_id(), dict_create(), dict_create_index_tree_step(), dict_get_first_table_name_in_db(), dict_hdr_flush_row_id(), dict_hdr_get_new_id(), dict_load_columns(), dict_load_fields(), dict_load_foreign(), dict_load_foreign_cols(), dict_load_foreigns(), dict_load_indexes(), dict_load_table(), dict_load_table_on_id(), dict_print(), dict_truncate_index_tree(), fil_create_new_single_table_tablespace(), fil_delete_tablespace(), fil_rename_tablespace(), flst_validate(), fseg_free(), fseg_validate_low(), fsp_fill_free_list(), fsp_get_available_space_in_free_extents(), fsp_header_get_free_limit(), fsp_header_get_tablespace_size(), fsp_print(), fsp_validate(), ibuf_add_free_page(), ibuf_data_init_for_space(), ibuf_delete_for_discarded_space(), ibuf_insert_low(), ibuf_is_empty(), ibuf_merge_or_delete_for_page(), ibuf_page(), ibuf_remove_free_page(), ibuf_set_free_bits(), ibuf_update_max_tablespace_id(), innobase_start_or_create_for_mysql(), lock_print_info_all_transactions(), lock_rec_print(), lock_rec_validate_page(), recv_apply_hashed_log_recs(), recv_recover_page(), row_ins_index_entry_low(), row_ins_scan_sec_index_for_duplicate(), row_purge_remove_sec_if_poss_low(), row_purge_upd_exist_or_extern(), row_search_for_mysql(), row_sel(), row_truncate_table_for_mysql(), row_undo_ins_remove_clust_rec(), row_undo_ins_remove_sec_low(), row_undo_mod_del_mark_or_remove_sec_low(), row_undo_mod_del_unmark_sec_and_undo_update(), row_unlock_for_mysql(), row_upd_check_references_constraints(), row_upd_clust_rec(), row_upd_clust_rec_by_insert(), row_upd_clust_step(), row_upd_del_mark_clust_rec(), row_upd_sec_index_entry(), row_vers_impl_x_locked_off_kernel(), trx_commit_off_kernel(), trx_prepare_off_kernel(), trx_purge_choose_next_log(), trx_purge_free_segment(), trx_purge_get_next_rec(), trx_purge_rseg_get_next_history_log(), trx_purge_truncate_rseg_history(), trx_roll_pop_top_rec_of_trx(), trx_sys_create(), trx_sys_create_doublewrite_buf(), trx_sys_flush_max_trx_id(), trx_sys_mark_upgraded_to_multiple_tablespaces(), trx_sys_print_mysql_binlog_offset(), trx_sys_print_mysql_master_log_pos(), trx_undo_assign_undo(), trx_undo_get_undo_rec_low(), trx_undo_lists_init(), trx_undo_report_row_operation(), trx_undo_seg_free(), trx_undo_truncate_end(), and trx_undo_truncate_start().
00170 : mini-transaction */ 00171 { 00172 ut_ad(mtr); 00173 ut_ad(mtr->magic_n == MTR_MAGIC_N); 00174 ut_ad(mtr->state == MTR_ACTIVE); 00175 #ifdef UNIV_DEBUG 00176 mtr->state = MTR_COMMITTING; 00177 #endif 00178 if (mtr->modifications) { 00179 mtr_log_reserve_and_write(mtr); 00180 } 00181 00182 /* We first update the modification info to buffer pages, and only 00183 after that release the log mutex: this guarantees that when the log 00184 mutex is free, all buffer pages contain an up-to-date info of their 00185 modifications. This fact is used in making a checkpoint when we look 00186 at the oldest modification of any page in the buffer pool. It is also 00187 required when we insert modified buffer pages in to the flush list 00188 which must be sorted on oldest_modification. */ 00189 00190 mtr_memo_pop_all(mtr); 00191 00192 if (mtr->modifications) { 00193 log_release(); 00194 } 00195 00196 #ifdef UNIV_DEBUG 00197 mtr->state = MTR_COMMITTED; 00198 #endif 00199 dyn_array_free(&(mtr->memo)); 00200 dyn_array_free(&(mtr->log)); 00201 }
Here is the call graph for this function:

Here is the caller graph for this function:

| static void mtr_log_reserve_and_write | ( | mtr_t * | mtr | ) | [static] |
Definition at line 110 of file mtr0mtr.c.
References yaSSL::block, dyn_array_get_data_size(), dyn_array_get_next_block(), dyn_block_get_data(), dyn_block_get_used(), mtr_struct::end_lsn, dyn_block_struct::heap, mtr_struct::log, log_close(), mtr_struct::log_mode, log_reserve_and_open(), log_reserve_and_write_fast(), log_write_low(), MLOG_1BYTE, mlog_catenate_ulint(), MLOG_MULTI_REC_END, MLOG_SINGLE_REC_FLAG, MTR_LOG_ALL, MTR_LOG_NONE, mtr_struct::n_log_recs, NULL, mtr_struct::start_lsn, and ut_ad.
Referenced by mtr_commit().
00112 : mtr */ 00113 { 00114 dyn_array_t* mlog; 00115 dyn_block_t* block; 00116 ulint data_size; 00117 ibool success; 00118 byte* first_data; 00119 00120 ut_ad(mtr); 00121 00122 mlog = &(mtr->log); 00123 00124 first_data = dyn_block_get_data(mlog); 00125 00126 if (mtr->n_log_recs > 1) { 00127 mlog_catenate_ulint(mtr, MLOG_MULTI_REC_END, MLOG_1BYTE); 00128 } else { 00129 *first_data = (byte)((ulint)*first_data | MLOG_SINGLE_REC_FLAG); 00130 } 00131 00132 if (mlog->heap == NULL) { 00133 mtr->end_lsn = log_reserve_and_write_fast(first_data, 00134 dyn_block_get_used(mlog), 00135 &(mtr->start_lsn), &success); 00136 if (success) { 00137 00138 return; 00139 } 00140 } 00141 00142 data_size = dyn_array_get_data_size(mlog); 00143 00144 /* Open the database log for log_write_low */ 00145 mtr->start_lsn = log_reserve_and_open(data_size); 00146 00147 if (mtr->log_mode == MTR_LOG_ALL) { 00148 00149 block = mlog; 00150 00151 while (block != NULL) { 00152 log_write_low(dyn_block_get_data(block), 00153 dyn_block_get_used(block)); 00154 block = dyn_array_get_next_block(mlog, block); 00155 } 00156 } else { 00157 ut_ad(mtr->log_mode == MTR_LOG_NONE); 00158 /* Do nothing */ 00159 } 00160 00161 mtr->end_lsn = log_close(); 00162 }
Here is the call graph for this function:

Here is the caller graph for this function:

| UNIV_INLINE void mtr_memo_pop_all | ( | mtr_t * | mtr | ) |
Definition at line 82 of file mtr0mtr.c.
References dyn_array_get_data_size(), dyn_array_get_element(), mtr_struct::magic_n, mtr_struct::memo, MTR_COMMITTING, MTR_MAGIC_N, mtr_memo_slot_release(), offset, mtr_struct::state, and ut_ad.
Referenced by mtr_commit().
00084 : mtr */ 00085 { 00086 mtr_memo_slot_t* slot; 00087 dyn_array_t* memo; 00088 ulint offset; 00089 00090 ut_ad(mtr); 00091 ut_ad(mtr->magic_n == MTR_MAGIC_N); 00092 ut_ad(mtr->state == MTR_COMMITTING); /* Currently only used in 00093 commit */ 00094 memo = &(mtr->memo); 00095 00096 offset = dyn_array_get_data_size(memo); 00097 00098 while (offset > 0) { 00099 offset -= sizeof(mtr_memo_slot_t); 00100 slot = dyn_array_get_element(memo, offset); 00101 00102 mtr_memo_slot_release(mtr, slot); 00103 } 00104 }
Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 241 of file mtr0mtr.c.
References dyn_array_get_data_size(), dyn_array_get_element(), mtr_struct::magic_n, mtr_struct::memo, MTR_ACTIVE, MTR_MAGIC_N, mtr_memo_slot_release(), mtr_memo_slot_struct::object, offset, mtr_struct::state, mtr_memo_slot_struct::type, and ut_ad.
Referenced by btr_page_split_and_insert().
00243 : mtr */ 00244 void* object, /* in: object */ 00245 ulint type) /* in: object type: MTR_MEMO_S_LOCK, ... */ 00246 { 00247 mtr_memo_slot_t* slot; 00248 dyn_array_t* memo; 00249 ulint offset; 00250 00251 ut_ad(mtr); 00252 ut_ad(mtr->magic_n == MTR_MAGIC_N); 00253 ut_ad(mtr->state == MTR_ACTIVE); 00254 00255 memo = &(mtr->memo); 00256 00257 offset = dyn_array_get_data_size(memo); 00258 00259 while (offset > 0) { 00260 offset -= sizeof(mtr_memo_slot_t); 00261 00262 slot = dyn_array_get_element(memo, offset); 00263 00264 if ((object == slot->object) && (type == slot->type)) { 00265 00266 mtr_memo_slot_release(mtr, slot); 00267 00268 break; 00269 } 00270 } 00271 }
Here is the call graph for this function:

Here is the caller graph for this function:

| UNIV_INLINE void mtr_memo_slot_release | ( | mtr_t * | mtr, | |
| mtr_memo_slot_t * | slot | |||
| ) |
Definition at line 38 of file mtr0mtr.c.
References buf_page_release(), MTR_MEMO_BUF_FIX, mtr_memo_contains(), MTR_MEMO_MODIFY, MTR_MEMO_PAGE_X_FIX, MTR_MEMO_S_LOCK, MTR_MEMO_X_LOCK, NULL, mtr_memo_slot_struct::object, rw_lock_s_unlock, rw_lock_x_unlock, mtr_memo_slot_struct::type, and ut_ad.
Referenced by mtr_memo_pop_all(), mtr_memo_release(), and mtr_rollback_to_savepoint().
00040 : mtr */ 00041 mtr_memo_slot_t* slot) /* in: memo slot */ 00042 { 00043 void* object; 00044 ulint type; 00045 00046 ut_ad(mtr && slot); 00047 00048 object = slot->object; 00049 type = slot->type; 00050 00051 if (UNIV_LIKELY(object != NULL)) { 00052 if (type <= MTR_MEMO_BUF_FIX) { 00053 buf_page_release((buf_block_t*)object, type, mtr); 00054 } else if (type == MTR_MEMO_S_LOCK) { 00055 rw_lock_s_unlock((rw_lock_t*)object); 00056 #ifdef UNIV_DEBUG 00057 } else if (type == MTR_MEMO_X_LOCK) { 00058 rw_lock_x_unlock((rw_lock_t*)object); 00059 } else { 00060 ut_ad(type == MTR_MEMO_MODIFY); 00061 ut_ad(mtr_memo_contains(mtr, object, 00062 MTR_MEMO_PAGE_X_FIX)); 00063 #else 00064 } else { 00065 rw_lock_x_unlock((rw_lock_t*)object); 00066 #endif 00067 } 00068 } 00069 00070 slot->object = NULL; 00071 }
Here is the call graph for this function:

Here is the caller graph for this function:

| void mtr_print | ( | mtr_t * | mtr | ) |
Definition at line 324 of file mtr0mtr.c.
References dyn_array_get_data_size(), mtr_struct::log, and mtr_struct::memo.
00326 : mtr */ 00327 { 00328 fprintf(stderr, 00329 "Mini-transaction handle: memo size %lu bytes log size %lu bytes\n", 00330 (ulong) dyn_array_get_data_size(&(mtr->memo)), 00331 (ulong) dyn_array_get_data_size(&(mtr->log))); 00332 }
Here is the call graph for this function:

Definition at line 304 of file mtr0mtr.c.
References buf_block_align(), mach_read_from_8(), MTR_ACTIVE, mtr_memo_contains(), MTR_MEMO_PAGE_S_FIX, MTR_MEMO_PAGE_X_FIX, and ut_ad.
00306 : value read */ 00307 byte* ptr, /* in: pointer from where to read */ 00308 mtr_t* mtr __attribute__((unused))) 00309 /* in: mini-transaction handle */ 00310 { 00311 ut_ad(mtr->state == MTR_ACTIVE); 00312 ut_ad(ptr && mtr); 00313 ut_ad(mtr_memo_contains(mtr, buf_block_align(ptr), 00314 MTR_MEMO_PAGE_S_FIX) || 00315 mtr_memo_contains(mtr, buf_block_align(ptr), 00316 MTR_MEMO_PAGE_X_FIX)); 00317 return(mach_read_from_8(ptr)); 00318 }
Here is the call graph for this function:

Definition at line 277 of file mtr0mtr.c.
References buf_block_align(), mach_read_from_1(), mach_read_from_2(), mach_read_from_4(), MLOG_1BYTE, MLOG_2BYTES, MLOG_4BYTES, MTR_ACTIVE, mtr_memo_contains(), MTR_MEMO_PAGE_S_FIX, MTR_MEMO_PAGE_X_FIX, and ut_ad.
00279 : value read */ 00280 byte* ptr, /* in: pointer from where to read */ 00281 ulint type, /* in: MLOG_1BYTE, MLOG_2BYTES, MLOG_4BYTES */ 00282 mtr_t* mtr __attribute__((unused))) 00283 /* in: mini-transaction handle */ 00284 { 00285 ut_ad(mtr->state == MTR_ACTIVE); 00286 ut_ad(mtr_memo_contains(mtr, buf_block_align(ptr), 00287 MTR_MEMO_PAGE_S_FIX) || 00288 mtr_memo_contains(mtr, buf_block_align(ptr), 00289 MTR_MEMO_PAGE_X_FIX)); 00290 if (type == MLOG_1BYTE) { 00291 return(mach_read_from_1(ptr)); 00292 } else if (type == MLOG_2BYTES) { 00293 return(mach_read_from_2(ptr)); 00294 } else { 00295 ut_ad(type == MLOG_4BYTES); 00296 return(mach_read_from_4(ptr)); 00297 } 00298 }
Here is the call graph for this function:

Definition at line 209 of file mtr0mtr.c.
References dyn_array_get_data_size(), dyn_array_get_element(), mtr_struct::magic_n, mtr_struct::memo, MTR_ACTIVE, MTR_MAGIC_N, MTR_MEMO_MODIFY, mtr_memo_slot_release(), offset, mtr_struct::state, mtr_memo_slot_struct::type, and ut_ad.
00211 : mtr */ 00212 ulint savepoint) /* in: savepoint */ 00213 { 00214 mtr_memo_slot_t* slot; 00215 dyn_array_t* memo; 00216 ulint offset; 00217 00218 ut_ad(mtr); 00219 ut_ad(mtr->magic_n == MTR_MAGIC_N); 00220 ut_ad(mtr->state == MTR_ACTIVE); 00221 00222 memo = &(mtr->memo); 00223 00224 offset = dyn_array_get_data_size(memo); 00225 ut_ad(offset >= savepoint); 00226 00227 while (offset > savepoint) { 00228 offset -= sizeof(mtr_memo_slot_t); 00229 00230 slot = dyn_array_get_element(memo, offset); 00231 00232 ut_ad(slot->type != MTR_MEMO_MODIFY); 00233 mtr_memo_slot_release(mtr, slot); 00234 } 00235 }
Here is the call graph for this function:

1.4.7

