#include "univ.i"#include "trx0types.h"#include "mtr0mtr.h"#include "mtr0log.h"#include "ut0byte.h"#include "mem0mem.h"#include "sync0sync.h"#include "ut0lst.h"#include "buf0buf.h"#include "fil0fil.h"#include "fut0lst.h"#include "fsp0fsp.h"#include "read0types.h"Include dependency graph for trx0sys.h:

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.
| #define TRX_SYS FSEG_PAGE_DATA |
Definition at line 308 of file trx0sys.h.
Referenced by trx_sys_print_mysql_binlog_offset_from_page(), and trx_sysf_create().
| #define TRX_SYS_DOUBLEWRITE (UNIV_PAGE_SIZE - 200) |
Definition at line 353 of file trx0sys.h.
Referenced by trx_sys_create_doublewrite_buf(), trx_sys_doublewrite_init_or_restore_pages(), and trx_sys_mark_upgraded_to_multiple_tablespaces().
| #define TRX_SYS_DOUBLEWRITE_BLOCK1 (4 + FSEG_HEADER_SIZE) |
Definition at line 363 of file trx0sys.h.
Referenced by trx_doublewrite_init(), and trx_sys_create_doublewrite_buf().
| #define TRX_SYS_DOUBLEWRITE_BLOCK2 (8 + FSEG_HEADER_SIZE) |
Definition at line 370 of file trx0sys.h.
Referenced by trx_doublewrite_init(), and trx_sys_create_doublewrite_buf().
| #define TRX_SYS_DOUBLEWRITE_BLOCK_SIZE FSP_EXTENT_SIZE |
Definition at line 393 of file trx0sys.h.
Referenced by buf_flush_post_to_doublewrite_buf(), buf_read_page_low(), trx_doublewrite_init(), trx_doublewrite_page_inside(), trx_sys_create_doublewrite_buf(), and trx_sys_doublewrite_init_or_restore_pages().
| #define TRX_SYS_DOUBLEWRITE_FSEG 0 |
| #define TRX_SYS_DOUBLEWRITE_MAGIC FSEG_HEADER_SIZE |
Definition at line 358 of file trx0sys.h.
Referenced by trx_sys_create_doublewrite_buf(), and trx_sys_doublewrite_init_or_restore_pages().
| #define TRX_SYS_DOUBLEWRITE_MAGIC_N 536853855 |
Definition at line 389 of file trx0sys.h.
Referenced by trx_sys_create_doublewrite_buf(), and trx_sys_doublewrite_init_or_restore_pages().
| #define TRX_SYS_DOUBLEWRITE_REPEAT 12 |
| #define TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED (24 + FSEG_HEADER_SIZE) |
Definition at line 381 of file trx0sys.h.
Referenced by trx_sys_create_doublewrite_buf(), trx_sys_doublewrite_init_or_restore_pages(), and trx_sys_mark_upgraded_to_multiple_tablespaces().
| #define TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED_N 1783657386 |
Definition at line 390 of file trx0sys.h.
Referenced by trx_sys_create_doublewrite_buf(), trx_sys_doublewrite_init_or_restore_pages(), and trx_sys_mark_upgraded_to_multiple_tablespaces().
| #define TRX_SYS_FSEG_HEADER 8 |
| #define TRX_SYS_MYSQL_LOG_INFO (UNIV_PAGE_SIZE - 1000) |
Definition at line 341 of file trx0sys.h.
Referenced by trx_commit_off_kernel(), trx_sys_print_mysql_binlog_offset(), and trx_sys_print_mysql_binlog_offset_from_page().
| #define TRX_SYS_MYSQL_LOG_MAGIC_N 873422344 |
Definition at line 334 of file trx0sys.h.
Referenced by trx_sys_print_mysql_binlog_offset(), trx_sys_print_mysql_binlog_offset_from_page(), trx_sys_print_mysql_master_log_pos(), and trx_sys_update_mysql_binlog_offset().
| #define TRX_SYS_MYSQL_LOG_MAGIC_N_FLD 0 |
Definition at line 342 of file trx0sys.h.
Referenced by trx_sys_print_mysql_binlog_offset(), trx_sys_print_mysql_binlog_offset_from_page(), trx_sys_print_mysql_master_log_pos(), and trx_sys_update_mysql_binlog_offset().
| #define TRX_SYS_MYSQL_LOG_NAME 12 |
Definition at line 350 of file trx0sys.h.
Referenced by trx_sys_print_mysql_binlog_offset(), trx_sys_print_mysql_binlog_offset_from_page(), trx_sys_print_mysql_master_log_pos(), and trx_sys_update_mysql_binlog_offset().
| #define TRX_SYS_MYSQL_LOG_NAME_LEN 512 |
Definition at line 333 of file trx0sys.h.
Referenced by trx_sys_print_mysql_binlog_offset(), trx_sys_print_mysql_master_log_pos(), and trx_sys_update_mysql_binlog_offset().
| #define TRX_SYS_MYSQL_LOG_OFFSET_HIGH 4 |
Definition at line 346 of file trx0sys.h.
Referenced by trx_sys_print_mysql_binlog_offset(), trx_sys_print_mysql_binlog_offset_from_page(), trx_sys_print_mysql_master_log_pos(), and trx_sys_update_mysql_binlog_offset().
| #define TRX_SYS_MYSQL_LOG_OFFSET_LOW 8 |
Definition at line 348 of file trx0sys.h.
Referenced by trx_sys_print_mysql_binlog_offset(), trx_sys_print_mysql_binlog_offset_from_page(), trx_sys_print_mysql_master_log_pos(), and trx_sys_update_mysql_binlog_offset().
| #define TRX_SYS_MYSQL_MASTER_LOG_INFO (UNIV_PAGE_SIZE - 2000) |
Definition at line 338 of file trx0sys.h.
Referenced by trx_commit_off_kernel(), and trx_sys_print_mysql_master_log_pos().
| #define TRX_SYS_N_RSEGS 256 |
Definition at line 331 of file trx0sys.h.
Referenced by trx_rseg_list_and_array_init(), trx_sysf_create(), and trx_sysf_rseg_find_free().
| #define TRX_SYS_PAGE_NO FSP_TRX_SYS_PAGE_NO |
Definition at line 305 of file trx0sys.h.
Referenced by trx_sys_create_doublewrite_buf(), trx_sys_doublewrite_init_or_restore_pages(), trx_sys_mark_upgraded_to_multiple_tablespaces(), and trx_sysf_create().
| #define TRX_SYS_SPACE 0 |
Definition at line 304 of file trx0sys.h.
Referenced by buf_read_page_low(), trx_sys_create_doublewrite_buf(), trx_sys_doublewrite_init_or_restore_pages(), trx_sys_mark_upgraded_to_multiple_tablespaces(), and trx_sysf_create().
| #define TRX_SYS_SYSTEM_RSEG_ID 0 |
| #define TRX_SYS_TRX_ID_STORE 0 |
Definition at line 312 of file trx0sys.h.
Referenced by trx_sys_flush_max_trx_id(), trx_sys_init_at_db_start(), and trx_sysf_create().
| #define TRX_SYS_TRX_ID_WRITE_MARGIN 256 |
| ibool trx_doublewrite_page_inside | ( | ulint | page_no | ) |
Definition at line 61 of file trx0sys.c.
References trx_doublewrite_struct::block1, trx_doublewrite_struct::block2, FALSE, NULL, TRUE, trx_doublewrite, and TRX_SYS_DOUBLEWRITE_BLOCK_SIZE.
Referenced by buf_page_io_complete().
00063 : TRUE if the location is inside 00064 the two blocks of the doublewrite buffer */ 00065 ulint page_no) /* in: page number */ 00066 { 00067 if (trx_doublewrite == NULL) { 00068 00069 return(FALSE); 00070 } 00071 00072 if (page_no >= trx_doublewrite->block1 00073 && page_no < trx_doublewrite->block1 00074 + TRX_SYS_DOUBLEWRITE_BLOCK_SIZE) { 00075 return(TRUE); 00076 } 00077 00078 if (page_no >= trx_doublewrite->block2 00079 && page_no < trx_doublewrite->block2 00080 + TRX_SYS_DOUBLEWRITE_BLOCK_SIZE) { 00081 return(TRUE); 00082 } 00083 00084 return(FALSE); 00085 }
Here is the caller graph for this function:

Referenced by row_vers_build_for_semi_consistent_read(), row_vers_impl_x_locked_off_kernel(), and trx_lists_init_at_db_start().
Here is the caller graph for this function:

| ibool trx_in_trx_list | ( | trx_t * | in_trx | ) |
Definition at line 523 of file trx0sys.c.
References FALSE, kernel_mutex, NULL, TRUE, trx_sys, ut_ad, UT_LIST_GET_FIRST, and UT_LIST_GET_NEXT.
Referenced by lock_rec_queue_validate(), lock_rec_validate_page(), and lock_validate().
00525 : TRUE if is in */ 00526 trx_t* in_trx) /* in: trx */ 00527 { 00528 trx_t* trx; 00529 00530 #ifdef UNIV_SYNC_DEBUG 00531 ut_ad(mutex_own(&(kernel_mutex))); 00532 #endif /* UNIV_SYNC_DEBUG */ 00533 00534 trx = UT_LIST_GET_FIRST(trx_sys->trx_list); 00535 00536 while (trx != NULL) { 00537 00538 if (trx == in_trx) { 00539 00540 return(TRUE); 00541 } 00542 00543 trx = UT_LIST_GET_NEXT(trx_list, trx); 00544 } 00545 00546 return(FALSE); 00547 }
Here is the caller graph for this function:

| UNIV_INLINE ibool trx_is_active | ( | dulint | trx_id | ) |
| UNIV_INLINE dulint trx_list_get_min_trx_id | ( | void | ) |
Referenced by lock_sec_rec_read_check_and_lock(), and lock_sec_rec_some_has_impl_off_kernel().
Here is the caller graph for this function:

Referenced by row_get_rec_sys_field(), and trx_undo_page_report_modify().
Here is the caller graph for this function:

| void trx_sys_create | ( | void | ) |
Definition at line 939 of file trx0sys.c.
References mtr_commit(), mtr_start(), trx_sys_init_at_db_start(), and trx_sysf_create().
Referenced by innobase_start_or_create_for_mysql().
00941 { 00942 mtr_t mtr; 00943 00944 mtr_start(&mtr); 00945 00946 trx_sysf_create(&mtr); 00947 00948 mtr_commit(&mtr); 00949 00950 trx_sys_init_at_db_start(); 00951 }
Here is the call graph for this function:

Here is the caller graph for this function:

| void trx_sys_create_doublewrite_buf | ( | void | ) |
Definition at line 168 of file trx0sys.c.
References buf_page_get, buf_pool_get_curr_size(), exit, FIL_NULL, FIL_PAGE_DATA, fseg_alloc_free_page(), fseg_create(), FSP_EXTENT_SIZE, FSP_UP, log_make_checkpoint_at(), mach_read_from_4(), MLOG_4BYTES, mlog_write_ulint(), mtr_commit(), mtr_start(), NULL, page, page_t, RW_X_LATCH, SYNC_NO_ORDER_CHECK, TRUE, trx_doublewrite, trx_doublewrite_init(), TRX_SYS_DOUBLEWRITE, TRX_SYS_DOUBLEWRITE_BLOCK1, TRX_SYS_DOUBLEWRITE_BLOCK2, TRX_SYS_DOUBLEWRITE_BLOCK_SIZE, TRX_SYS_DOUBLEWRITE_FSEG, TRX_SYS_DOUBLEWRITE_MAGIC, TRX_SYS_DOUBLEWRITE_MAGIC_N, TRX_SYS_DOUBLEWRITE_REPEAT, TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED, TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED_N, trx_sys_multiple_tablespace_format, TRX_SYS_PAGE_NO, TRX_SYS_SPACE, UNIV_PAGE_SIZE, ut_a, and ut_dulint_max.
Referenced by innobase_start_or_create_for_mysql().
00170 { 00171 page_t* page; 00172 page_t* page2; 00173 page_t* new_page; 00174 byte* doublewrite; 00175 byte* fseg_header; 00176 ulint page_no; 00177 ulint prev_page_no; 00178 ulint i; 00179 mtr_t mtr; 00180 00181 if (trx_doublewrite) { 00182 /* Already inited */ 00183 00184 return; 00185 } 00186 00187 start_again: 00188 mtr_start(&mtr); 00189 00190 page = buf_page_get(TRX_SYS_SPACE, TRX_SYS_PAGE_NO, RW_X_LATCH, &mtr); 00191 #ifdef UNIV_SYNC_DEBUG 00192 buf_page_dbg_add_level(page, SYNC_NO_ORDER_CHECK); 00193 #endif /* UNIV_SYNC_DEBUG */ 00194 00195 doublewrite = page + TRX_SYS_DOUBLEWRITE; 00196 00197 if (mach_read_from_4(doublewrite + TRX_SYS_DOUBLEWRITE_MAGIC) 00198 == TRX_SYS_DOUBLEWRITE_MAGIC_N) { 00199 /* The doublewrite buffer has already been created: 00200 just read in some numbers */ 00201 00202 trx_doublewrite_init(doublewrite); 00203 00204 mtr_commit(&mtr); 00205 } else { 00206 fprintf(stderr, 00207 "InnoDB: Doublewrite buffer not found: creating new\n"); 00208 00209 if (buf_pool_get_curr_size() < 00210 (2 * TRX_SYS_DOUBLEWRITE_BLOCK_SIZE 00211 + FSP_EXTENT_SIZE / 2 + 100) 00212 * UNIV_PAGE_SIZE) { 00213 fprintf(stderr, 00214 "InnoDB: Cannot create doublewrite buffer: you must\n" 00215 "InnoDB: increase your buffer pool size.\n" 00216 "InnoDB: Cannot continue operation.\n"); 00217 00218 exit(1); 00219 } 00220 00221 page2 = fseg_create(TRX_SYS_SPACE, TRX_SYS_PAGE_NO, 00222 TRX_SYS_DOUBLEWRITE + TRX_SYS_DOUBLEWRITE_FSEG, &mtr); 00223 00224 /* fseg_create acquires a second latch on the page, 00225 therefore we must declare it: */ 00226 00227 #ifdef UNIV_SYNC_DEBUG 00228 buf_page_dbg_add_level(page2, SYNC_NO_ORDER_CHECK); 00229 #endif /* UNIV_SYNC_DEBUG */ 00230 00231 if (page2 == NULL) { 00232 fprintf(stderr, 00233 "InnoDB: Cannot create doublewrite buffer: you must\n" 00234 "InnoDB: increase your tablespace size.\n" 00235 "InnoDB: Cannot continue operation.\n"); 00236 00237 /* We exit without committing the mtr to prevent 00238 its modifications to the database getting to disk */ 00239 00240 exit(1); 00241 } 00242 00243 fseg_header = page + TRX_SYS_DOUBLEWRITE 00244 + TRX_SYS_DOUBLEWRITE_FSEG; 00245 prev_page_no = 0; 00246 00247 for (i = 0; i < 2 * TRX_SYS_DOUBLEWRITE_BLOCK_SIZE 00248 + FSP_EXTENT_SIZE / 2; i++) { 00249 page_no = fseg_alloc_free_page(fseg_header, 00250 prev_page_no + 1, 00251 FSP_UP, &mtr); 00252 if (page_no == FIL_NULL) { 00253 fprintf(stderr, 00254 "InnoDB: Cannot create doublewrite buffer: you must\n" 00255 "InnoDB: increase your tablespace size.\n" 00256 "InnoDB: Cannot continue operation.\n"); 00257 00258 exit(1); 00259 } 00260 00261 /* We read the allocated pages to the buffer pool; 00262 when they are written to disk in a flush, the space 00263 id and page number fields are also written to the 00264 pages. When we at database startup read pages 00265 from the doublewrite buffer, we know that if the 00266 space id and page number in them are the same as 00267 the page position in the tablespace, then the page 00268 has not been written to in doublewrite. */ 00269 00270 new_page = buf_page_get(TRX_SYS_SPACE, page_no, 00271 RW_X_LATCH, &mtr); 00272 #ifdef UNIV_SYNC_DEBUG 00273 buf_page_dbg_add_level(new_page, SYNC_NO_ORDER_CHECK); 00274 #endif /* UNIV_SYNC_DEBUG */ 00275 00276 /* Make a dummy change to the page to ensure it will 00277 be written to disk in a flush */ 00278 00279 mlog_write_ulint(new_page + FIL_PAGE_DATA, 00280 TRX_SYS_DOUBLEWRITE_MAGIC_N, 00281 MLOG_4BYTES, &mtr); 00282 00283 if (i == FSP_EXTENT_SIZE / 2) { 00284 mlog_write_ulint(doublewrite 00285 + TRX_SYS_DOUBLEWRITE_BLOCK1, 00286 page_no, MLOG_4BYTES, &mtr); 00287 mlog_write_ulint(doublewrite 00288 + TRX_SYS_DOUBLEWRITE_REPEAT 00289 + TRX_SYS_DOUBLEWRITE_BLOCK1, 00290 page_no, MLOG_4BYTES, &mtr); 00291 } else if (i == FSP_EXTENT_SIZE / 2 00292 + TRX_SYS_DOUBLEWRITE_BLOCK_SIZE) { 00293 mlog_write_ulint(doublewrite 00294 + TRX_SYS_DOUBLEWRITE_BLOCK2, 00295 page_no, MLOG_4BYTES, &mtr); 00296 mlog_write_ulint(doublewrite 00297 + TRX_SYS_DOUBLEWRITE_REPEAT 00298 + TRX_SYS_DOUBLEWRITE_BLOCK2, 00299 page_no, MLOG_4BYTES, &mtr); 00300 } else if (i > FSP_EXTENT_SIZE / 2) { 00301 ut_a(page_no == prev_page_no + 1); 00302 } 00303 00304 prev_page_no = page_no; 00305 } 00306 00307 mlog_write_ulint(doublewrite + TRX_SYS_DOUBLEWRITE_MAGIC, 00308 TRX_SYS_DOUBLEWRITE_MAGIC_N, MLOG_4BYTES, &mtr); 00309 mlog_write_ulint(doublewrite + TRX_SYS_DOUBLEWRITE_MAGIC 00310 + TRX_SYS_DOUBLEWRITE_REPEAT, 00311 TRX_SYS_DOUBLEWRITE_MAGIC_N, MLOG_4BYTES, &mtr); 00312 00313 mlog_write_ulint(doublewrite 00314 + TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED, 00315 TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED_N, 00316 MLOG_4BYTES, &mtr); 00317 mtr_commit(&mtr); 00318 00319 /* Flush the modified pages to disk and make a checkpoint */ 00320 log_make_checkpoint_at(ut_dulint_max, TRUE); 00321 00322 fprintf(stderr, "InnoDB: Doublewrite buffer created\n"); 00323 00324 trx_sys_multiple_tablespace_format = TRUE; 00325 00326 goto start_again; 00327 } 00328 }
Here is the call graph for this function:

Here is the caller graph for this function:

| void trx_sys_doublewrite_init_or_restore_pages | ( | ibool | restore_corrupt_pages | ) |
Definition at line 339 of file trx0sys.c.
References trx_doublewrite_struct::block1, trx_doublewrite_struct::block2, buf, buf_page_is_corrupted(), buf_page_print(), exit, fil_check_adress_in_tablespace(), fil_flush_file_spaces(), fil_io(), FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID, FIL_PAGE_OFFSET, FIL_TABLESPACE, fil_tablespace_exists_in_mem(), mach_read_from_4(), mach_write_to_4(), NULL, OS_FILE_READ, OS_FILE_WRITE, page, read_buf(), TRUE, trx_doublewrite, trx_doublewrite_init(), trx_doublewrite_must_reset_space_ids, TRX_SYS_DOUBLEWRITE, TRX_SYS_DOUBLEWRITE_BLOCK_SIZE, TRX_SYS_DOUBLEWRITE_MAGIC, TRX_SYS_DOUBLEWRITE_MAGIC_N, TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED, TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED_N, trx_sys_multiple_tablespace_format, TRX_SYS_PAGE_NO, TRX_SYS_SPACE, UNIV_PAGE_SIZE, ut_align(), ut_free(), ut_malloc(), and trx_doublewrite_struct::write_buf.
Referenced by recv_recovery_from_checkpoint_start().
00342 { 00343 byte* buf; 00344 byte* read_buf; 00345 byte* unaligned_read_buf; 00346 ulint block1; 00347 ulint block2; 00348 ulint source_page_no; 00349 byte* page; 00350 byte* doublewrite; 00351 ulint space_id; 00352 ulint page_no; 00353 ulint i; 00354 00355 /* We do the file i/o past the buffer pool */ 00356 00357 unaligned_read_buf = ut_malloc(2 * UNIV_PAGE_SIZE); 00358 read_buf = ut_align(unaligned_read_buf, UNIV_PAGE_SIZE); 00359 00360 /* Read the trx sys header to check if we are using the doublewrite 00361 buffer */ 00362 00363 fil_io(OS_FILE_READ, TRUE, TRX_SYS_SPACE, TRX_SYS_PAGE_NO, 0, 00364 UNIV_PAGE_SIZE, read_buf, NULL); 00365 doublewrite = read_buf + TRX_SYS_DOUBLEWRITE; 00366 00367 if (mach_read_from_4(doublewrite + TRX_SYS_DOUBLEWRITE_MAGIC) 00368 == TRX_SYS_DOUBLEWRITE_MAGIC_N) { 00369 /* The doublewrite buffer has been created */ 00370 00371 trx_doublewrite_init(doublewrite); 00372 00373 block1 = trx_doublewrite->block1; 00374 block2 = trx_doublewrite->block2; 00375 00376 buf = trx_doublewrite->write_buf; 00377 } else { 00378 goto leave_func; 00379 } 00380 00381 if (mach_read_from_4(doublewrite + TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED) 00382 != TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED_N) { 00383 00384 /* We are upgrading from a version < 4.1.x to a version where 00385 multiple tablespaces are supported. We must reset the space id 00386 field in the pages in the doublewrite buffer because starting 00387 from this version the space id is stored to 00388 FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID. */ 00389 00390 trx_doublewrite_must_reset_space_ids = TRUE; 00391 00392 fprintf(stderr, 00393 "InnoDB: Resetting space id's in the doublewrite buffer\n"); 00394 } else { 00395 trx_sys_multiple_tablespace_format = TRUE; 00396 } 00397 00398 /* Read the pages from the doublewrite buffer to memory */ 00399 00400 fil_io(OS_FILE_READ, TRUE, TRX_SYS_SPACE, block1, 0, 00401 TRX_SYS_DOUBLEWRITE_BLOCK_SIZE * UNIV_PAGE_SIZE, 00402 buf, NULL); 00403 fil_io(OS_FILE_READ, TRUE, TRX_SYS_SPACE, block2, 0, 00404 TRX_SYS_DOUBLEWRITE_BLOCK_SIZE * UNIV_PAGE_SIZE, 00405 buf + TRX_SYS_DOUBLEWRITE_BLOCK_SIZE * UNIV_PAGE_SIZE, 00406 NULL); 00407 /* Check if any of these pages is half-written in data files, in the 00408 intended position */ 00409 00410 page = buf; 00411 00412 for (i = 0; i < TRX_SYS_DOUBLEWRITE_BLOCK_SIZE * 2; i++) { 00413 00414 page_no = mach_read_from_4(page + FIL_PAGE_OFFSET); 00415 00416 if (trx_doublewrite_must_reset_space_ids) { 00417 00418 space_id = 0; 00419 mach_write_to_4(page 00420 + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID, 0); 00421 /* We do not need to calculate new checksums for the 00422 pages because the field .._SPACE_ID does not affect 00423 them. Write the page back to where we read it from. */ 00424 00425 if (i < TRX_SYS_DOUBLEWRITE_BLOCK_SIZE) { 00426 source_page_no = block1 + i; 00427 } else { 00428 source_page_no = block2 00429 + i - TRX_SYS_DOUBLEWRITE_BLOCK_SIZE; 00430 } 00431 00432 fil_io(OS_FILE_WRITE, TRUE, 0, source_page_no, 0, 00433 UNIV_PAGE_SIZE, page, NULL); 00434 /* printf("Resetting space id in page %lu\n", 00435 source_page_no); */ 00436 } else { 00437 space_id = mach_read_from_4( 00438 page + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID); 00439 } 00440 00441 if (!restore_corrupt_pages) { 00442 /* The database was shut down gracefully: no need to 00443 restore pages */ 00444 00445 } else if (!fil_tablespace_exists_in_mem(space_id)) { 00446 /* Maybe we have dropped the single-table tablespace 00447 and this page once belonged to it: do nothing */ 00448 00449 } else if (!fil_check_adress_in_tablespace(space_id, 00450 page_no)) { 00451 fprintf(stderr, 00452 "InnoDB: Warning: a page in the doublewrite buffer is not within space\n" 00453 "InnoDB: bounds; space id %lu page number %lu, page %lu in doublewrite buf.\n", 00454 (ulong) space_id, (ulong) page_no, (ulong) i); 00455 00456 } else if (space_id == TRX_SYS_SPACE 00457 && ((page_no >= block1 00458 && page_no 00459 < block1 + TRX_SYS_DOUBLEWRITE_BLOCK_SIZE) 00460 || (page_no >= block2 00461 && page_no 00462 < block2 + TRX_SYS_DOUBLEWRITE_BLOCK_SIZE))) { 00463 00464 /* It is an unwritten doublewrite buffer page: 00465 do nothing */ 00466 } else { 00467 /* Read in the actual page from the data files */ 00468 00469 fil_io(OS_FILE_READ, TRUE, space_id, page_no, 0, 00470 UNIV_PAGE_SIZE, read_buf, NULL); 00471 /* Check if the page is corrupt */ 00472 00473 if (buf_page_is_corrupted(read_buf)) { 00474 00475 fprintf(stderr, 00476 "InnoDB: Warning: database page corruption or a failed\n" 00477 "InnoDB: file read of page %lu.\n", (ulong) page_no); 00478 fprintf(stderr, 00479 "InnoDB: Trying to recover it from the doublewrite buffer.\n"); 00480 00481 if (buf_page_is_corrupted(page)) { 00482 fprintf(stderr, 00483 "InnoDB: Dump of the page:\n"); 00484 buf_page_print(read_buf); 00485 fprintf(stderr, 00486 "InnoDB: Dump of corresponding page in doublewrite buffer:\n"); 00487 buf_page_print(page); 00488 00489 fprintf(stderr, 00490 "InnoDB: Also the page in the doublewrite buffer is corrupt.\n" 00491 "InnoDB: Cannot continue operation.\n" 00492 "InnoDB: You can try to recover the database with the my.cnf\n" 00493 "InnoDB: option:\n" 00494 "InnoDB: set-variable=innodb_force_recovery=6\n"); 00495 exit(1); 00496 } 00497 00498 /* Write the good page from the 00499 doublewrite buffer to the intended 00500 position */ 00501 00502 fil_io(OS_FILE_WRITE, TRUE, space_id, 00503 page_no, 0, 00504 UNIV_PAGE_SIZE, page, NULL); 00505 fprintf(stderr, 00506 "InnoDB: Recovered the page from the doublewrite buffer.\n"); 00507 } 00508 } 00509 00510 page += UNIV_PAGE_SIZE; 00511 } 00512 00513 fil_flush_file_spaces(FIL_TABLESPACE); 00514 00515 leave_func: 00516 ut_free(unaligned_read_buf); 00517 }
Here is the call graph for this function:

Here is the caller graph for this function:

| UNIV_INLINE dulint trx_sys_get_new_trx_id | ( | void | ) |
| UNIV_INLINE dulint trx_sys_get_new_trx_no | ( | void | ) |
| UNIV_INLINE trx_rseg_t* trx_sys_get_nth_rseg | ( | trx_sys_t * | sys, | |
| ulint | n | |||
| ) |
Referenced by buf_read_ahead_linear(), buf_read_ahead_random(), buf_read_page_low(), and ibuf_merge_or_delete_for_page().
Here is the caller graph for this function:

| void trx_sys_init_at_db_start | ( | void | ) |
Definition at line 853 of file trx0sys.c.
References trx_struct::conc_state, kernel_mutex, trx_sys_struct::latest_rseg, trx_sys_struct::max_trx_id, mem_alloc, mtr_read_dulint(), mtr_start(), mutex_enter, NULL, trx_lists_init_at_db_start(), TRX_PREPARED, trx_rseg_list_and_array_init(), trx_sys, TRX_SYS_TRX_ID_STORE, TRX_SYS_TRX_ID_WRITE_MARGIN, trx_sysf_get(), trx_struct::undo_no, ut_ad, ut_conv_dulint_to_longlong(), ut_dulint_add(), ut_dulint_align_up(), ut_dulint_get_high(), ut_dulint_get_low(), UT_LIST_GET_FIRST, UT_LIST_GET_LEN, UT_LIST_GET_NEXT, and UT_LIST_INIT.
Referenced by innobase_start_or_create_for_mysql(), and trx_sys_create().
00855 { 00856 trx_sysf_t* sys_header; 00857 ib_longlong rows_to_undo = 0; 00858 const char* unit = ""; 00859 trx_t* trx; 00860 mtr_t mtr; 00861 00862 mtr_start(&mtr); 00863 00864 ut_ad(trx_sys == NULL); 00865 00866 mutex_enter(&kernel_mutex); 00867 00868 trx_sys = mem_alloc(sizeof(trx_sys_t)); 00869 00870 sys_header = trx_sysf_get(&mtr); 00871 00872 trx_rseg_list_and_array_init(sys_header, &mtr); 00873 00874 trx_sys->latest_rseg = UT_LIST_GET_FIRST(trx_sys->rseg_list); 00875 00876 /* VERY important: after the database is started, max_trx_id value is 00877 divisible by TRX_SYS_TRX_ID_WRITE_MARGIN, and the 'if' in 00878 trx_sys_get_new_trx_id will evaluate to TRUE when the function 00879 is first time called, and the value for trx id will be written 00880 to the disk-based header! Thus trx id values will not overlap when 00881 the database is repeatedly started! */ 00882 00883 trx_sys->max_trx_id = ut_dulint_add( 00884 ut_dulint_align_up( 00885 mtr_read_dulint(sys_header 00886 + TRX_SYS_TRX_ID_STORE, &mtr), 00887 TRX_SYS_TRX_ID_WRITE_MARGIN), 00888 2 * TRX_SYS_TRX_ID_WRITE_MARGIN); 00889 00890 UT_LIST_INIT(trx_sys->mysql_trx_list); 00891 trx_lists_init_at_db_start(); 00892 00893 if (UT_LIST_GET_LEN(trx_sys->trx_list) > 0) { 00894 trx = UT_LIST_GET_FIRST(trx_sys->trx_list); 00895 00896 for (;;) { 00897 00898 if ( trx->conc_state != TRX_PREPARED) { 00899 rows_to_undo += 00900 ut_conv_dulint_to_longlong(trx->undo_no); 00901 } 00902 00903 trx = UT_LIST_GET_NEXT(trx_list, trx); 00904 00905 if (!trx) { 00906 break; 00907 } 00908 } 00909 00910 if (rows_to_undo > 1000000000) { 00911 unit = "M"; 00912 rows_to_undo = rows_to_undo / 1000000; 00913 } 00914 00915 fprintf(stderr, 00916 "InnoDB: %lu transaction(s) which must be rolled back or cleaned up\n" 00917 "InnoDB: in total %lu%s row operations to undo\n", 00918 (ulong) UT_LIST_GET_LEN(trx_sys->trx_list), 00919 (ulong) rows_to_undo, unit); 00920 00921 fprintf(stderr, "InnoDB: Trx id counter is %lu %lu\n", 00922 (ulong) ut_dulint_get_high(trx_sys->max_trx_id), 00923 (ulong) ut_dulint_get_low(trx_sys->max_trx_id)); 00924 } 00925 00926 UT_LIST_INIT(trx_sys->view_list); 00927 00928 trx_purge_sys_create(); 00929 00930 mutex_exit(&kernel_mutex); 00931 00932 mtr_commit(&mtr); 00933 }
Here is the call graph for this function:

Here is the caller graph for this function:

| void trx_sys_mark_upgraded_to_multiple_tablespaces | ( | void | ) |
Definition at line 132 of file trx0sys.c.
References buf_page_get, log_make_checkpoint_at(), MLOG_4BYTES, mlog_write_ulint(), mtr_commit(), mtr_start(), page, page_t, RW_X_LATCH, SYNC_NO_ORDER_CHECK, TRUE, TRX_SYS_DOUBLEWRITE, TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED, TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED_N, trx_sys_multiple_tablespace_format, TRX_SYS_PAGE_NO, TRX_SYS_SPACE, and ut_dulint_max.
Referenced by innobase_start_or_create_for_mysql().
00134 { 00135 page_t* page; 00136 byte* doublewrite; 00137 mtr_t mtr; 00138 00139 /* We upgraded to 4.1.x and reset the space id fields in the 00140 doublewrite buffer. Let us mark to the trx_sys header that the upgrade 00141 has been done. */ 00142 00143 mtr_start(&mtr); 00144 00145 page = buf_page_get(TRX_SYS_SPACE, TRX_SYS_PAGE_NO, RW_X_LATCH, &mtr); 00146 #ifdef UNIV_SYNC_DEBUG 00147 buf_page_dbg_add_level(page, SYNC_NO_ORDER_CHECK); 00148 #endif /* UNIV_SYNC_DEBUG */ 00149 00150 doublewrite = page + TRX_SYS_DOUBLEWRITE; 00151 00152 mlog_write_ulint(doublewrite + TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED, 00153 TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED_N, 00154 MLOG_4BYTES, &mtr); 00155 mtr_commit(&mtr); 00156 00157 /* Flush the modified pages to disk and make a checkpoint */ 00158 log_make_checkpoint_at(ut_dulint_max, TRUE); 00159 00160 trx_sys_multiple_tablespace_format = TRUE; 00161 }
Here is the call graph for this function:

Here is the caller graph for this function:

| void trx_sys_print_mysql_binlog_offset | ( | void | ) |
Definition at line 664 of file trx0sys.c.
References mach_read_from_4(), mtr_commit(), mtr_start(), trx_sys_mysql_bin_log_name, trx_sys_mysql_bin_log_pos, TRX_SYS_MYSQL_LOG_INFO, TRX_SYS_MYSQL_LOG_MAGIC_N, TRX_SYS_MYSQL_LOG_MAGIC_N_FLD, TRX_SYS_MYSQL_LOG_NAME, TRX_SYS_MYSQL_LOG_NAME_LEN, TRX_SYS_MYSQL_LOG_OFFSET_HIGH, TRX_SYS_MYSQL_LOG_OFFSET_LOW, trx_sysf_get(), and ut_memcpy().
Referenced by recv_recovery_from_checkpoint_finish().
00666 { 00667 trx_sysf_t* sys_header; 00668 mtr_t mtr; 00669 ulint trx_sys_mysql_bin_log_pos_high; 00670 ulint trx_sys_mysql_bin_log_pos_low; 00671 00672 mtr_start(&mtr); 00673 00674 sys_header = trx_sysf_get(&mtr); 00675 00676 if (mach_read_from_4(sys_header + TRX_SYS_MYSQL_LOG_INFO 00677 + TRX_SYS_MYSQL_LOG_MAGIC_N_FLD) 00678 != TRX_SYS_MYSQL_LOG_MAGIC_N) { 00679 00680 mtr_commit(&mtr); 00681 00682 return; 00683 } 00684 00685 trx_sys_mysql_bin_log_pos_high = mach_read_from_4(sys_header + TRX_SYS_MYSQL_LOG_INFO 00686 + TRX_SYS_MYSQL_LOG_OFFSET_HIGH); 00687 trx_sys_mysql_bin_log_pos_low = mach_read_from_4(sys_header + TRX_SYS_MYSQL_LOG_INFO 00688 + TRX_SYS_MYSQL_LOG_OFFSET_LOW); 00689 00690 trx_sys_mysql_bin_log_pos = (((ib_longlong)trx_sys_mysql_bin_log_pos_high) << 32) + 00691 (ib_longlong)trx_sys_mysql_bin_log_pos_low; 00692 00693 ut_memcpy(trx_sys_mysql_bin_log_name, sys_header + TRX_SYS_MYSQL_LOG_INFO + 00694 TRX_SYS_MYSQL_LOG_NAME, TRX_SYS_MYSQL_LOG_NAME_LEN); 00695 00696 fprintf(stderr, 00697 "InnoDB: Last MySQL binlog file position %lu %lu, file name %s\n", 00698 trx_sys_mysql_bin_log_pos_high, trx_sys_mysql_bin_log_pos_low, 00699 trx_sys_mysql_bin_log_name); 00700 00701 mtr_commit(&mtr); 00702 }
Here is the call graph for this function:

Here is the caller graph for this function:

| void trx_sys_print_mysql_master_log_pos | ( | void | ) |
Definition at line 709 of file trx0sys.c.
References mach_read_from_4(), mtr_commit(), mtr_start(), TRX_SYS_MYSQL_LOG_MAGIC_N, TRX_SYS_MYSQL_LOG_MAGIC_N_FLD, TRX_SYS_MYSQL_LOG_NAME, TRX_SYS_MYSQL_LOG_NAME_LEN, TRX_SYS_MYSQL_LOG_OFFSET_HIGH, TRX_SYS_MYSQL_LOG_OFFSET_LOW, TRX_SYS_MYSQL_MASTER_LOG_INFO, trx_sys_mysql_master_log_name, trx_sys_mysql_master_log_pos, trx_sysf_get(), and ut_memcpy().
Referenced by recv_recovery_from_checkpoint_finish().
00711 { 00712 trx_sysf_t* sys_header; 00713 mtr_t mtr; 00714 00715 mtr_start(&mtr); 00716 00717 sys_header = trx_sysf_get(&mtr); 00718 00719 if (mach_read_from_4(sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO 00720 + TRX_SYS_MYSQL_LOG_MAGIC_N_FLD) 00721 != TRX_SYS_MYSQL_LOG_MAGIC_N) { 00722 00723 mtr_commit(&mtr); 00724 00725 return; 00726 } 00727 00728 fprintf(stderr, 00729 "InnoDB: In a MySQL replication slave the last master binlog file\n" 00730 "InnoDB: position %lu %lu, file name %s\n", 00731 (ulong) mach_read_from_4(sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO 00732 + TRX_SYS_MYSQL_LOG_OFFSET_HIGH), 00733 (ulong) mach_read_from_4(sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO 00734 + TRX_SYS_MYSQL_LOG_OFFSET_LOW), 00735 sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO 00736 + TRX_SYS_MYSQL_LOG_NAME); 00737 /* Copy the master log position info to global variables we can 00738 use in ha_innobase.cc to initialize glob_mi to right values */ 00739 00740 ut_memcpy(trx_sys_mysql_master_log_name, 00741 sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO 00742 + TRX_SYS_MYSQL_LOG_NAME, 00743 TRX_SYS_MYSQL_LOG_NAME_LEN); 00744 00745 trx_sys_mysql_master_log_pos = 00746 (((ib_longlong)mach_read_from_4( 00747 sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO 00748 + TRX_SYS_MYSQL_LOG_OFFSET_HIGH)) 00749 << 32) 00750 + (ib_longlong) 00751 mach_read_from_4(sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO 00752 + TRX_SYS_MYSQL_LOG_OFFSET_LOW); 00753 mtr_commit(&mtr); 00754 }
Here is the call graph for this function:

Here is the caller graph for this function:

| UNIV_INLINE void trx_sys_set_nth_rseg | ( | trx_sys_t * | sys, | |
| ulint | n, | |||
| trx_rseg_t * | rseg | |||
| ) |
Referenced by trx_rseg_list_and_array_init(), and trx_rseg_mem_create().
Here is the caller graph for this function:

| void trx_sys_update_mysql_binlog_offset | ( | const char * | file_name, | |
| ib_longlong | offset, | |||
| ulint | field, | |||
| mtr_t * | mtr | |||
| ) |
Definition at line 579 of file trx0sys.c.
References mach_read_from_4(), MLOG_4BYTES, mlog_write_string(), mlog_write_ulint(), strcmp(), TRX_SYS_MYSQL_LOG_MAGIC_N, TRX_SYS_MYSQL_LOG_MAGIC_N_FLD, TRX_SYS_MYSQL_LOG_NAME, TRX_SYS_MYSQL_LOG_NAME_LEN, TRX_SYS_MYSQL_LOG_OFFSET_HIGH, TRX_SYS_MYSQL_LOG_OFFSET_LOW, trx_sysf_get(), and ut_strlen().
Referenced by trx_commit_off_kernel().
00581 : MySQL log file name */ 00582 ib_longlong offset, /* in: position in that log file */ 00583 ulint field, /* in: offset of the MySQL log info field in 00584 the trx sys header */ 00585 mtr_t* mtr) /* in: mtr */ 00586 { 00587 trx_sysf_t* sys_header; 00588 00589 if (ut_strlen(file_name) >= TRX_SYS_MYSQL_LOG_NAME_LEN) { 00590 00591 /* We cannot fit the name to the 512 bytes we have reserved */ 00592 00593 return; 00594 } 00595 00596 sys_header = trx_sysf_get(mtr); 00597 00598 if (mach_read_from_4(sys_header + field 00599 + TRX_SYS_MYSQL_LOG_MAGIC_N_FLD) 00600 != TRX_SYS_MYSQL_LOG_MAGIC_N) { 00601 00602 mlog_write_ulint(sys_header + field 00603 + TRX_SYS_MYSQL_LOG_MAGIC_N_FLD, 00604 TRX_SYS_MYSQL_LOG_MAGIC_N, 00605 MLOG_4BYTES, mtr); 00606 } 00607 00608 if (0 != strcmp((char*) (sys_header + field + TRX_SYS_MYSQL_LOG_NAME), file_name)) { 00609 00610 mlog_write_string(sys_header + field 00611 + TRX_SYS_MYSQL_LOG_NAME, 00612 (byte*) file_name, 1 + ut_strlen(file_name), mtr); 00613 } 00614 00615 if (mach_read_from_4(sys_header + field 00616 + TRX_SYS_MYSQL_LOG_OFFSET_HIGH) > 0 00617 || (offset >> 32) > 0) { 00618 00619 mlog_write_ulint(sys_header + field 00620 + TRX_SYS_MYSQL_LOG_OFFSET_HIGH, 00621 (ulint)(offset >> 32), 00622 MLOG_4BYTES, mtr); 00623 } 00624 00625 mlog_write_ulint(sys_header + field 00626 + TRX_SYS_MYSQL_LOG_OFFSET_LOW, 00627 (ulint)(offset & 0xFFFFFFFFUL), 00628 MLOG_4BYTES, mtr); 00629 }
Here is the call graph for this function:

Here is the caller graph for this function:

| UNIV_INLINE trx_sysf_t* trx_sysf_get | ( | mtr_t * | mtr | ) |
Referenced by trx_rseg_header_create(), trx_sys_flush_max_trx_id(), trx_sys_init_at_db_start(), trx_sys_print_mysql_binlog_offset(), trx_sys_print_mysql_master_log_pos(), trx_sys_update_mysql_binlog_offset(), trx_sysf_create(), and trx_sysf_rseg_find_free().
Here is the caller graph for this function:

Definition at line 760 of file trx0sys.c.
References FIL_NULL, kernel_mutex, TRX_SYS_N_RSEGS, trx_sysf_get(), trx_sysf_rseg_get_page_no(), and ut_ad.
Referenced by trx_rseg_header_create().
00762 : slot index or ULINT_UNDEFINED if not found */ 00763 mtr_t* mtr) /* in: mtr */ 00764 { 00765 trx_sysf_t* sys_header; 00766 ulint page_no; 00767 ulint i; 00768 00769 #ifdef UNIV_SYNC_DEBUG 00770 ut_ad(mutex_own(&(kernel_mutex))); 00771 #endif /* UNIV_SYNC_DEBUG */ 00772 00773 sys_header = trx_sysf_get(mtr); 00774 00775 for (i = 0; i < TRX_SYS_N_RSEGS; i++) { 00776 00777 page_no = trx_sysf_rseg_get_page_no(sys_header, i, mtr); 00778 00779 if (page_no == FIL_NULL) { 00780 00781 return(i); 00782 } 00783 } 00784 00785 return(ULINT_UNDEFINED); 00786 }
Here is the call graph for this function:

Here is the caller graph for this function:

| UNIV_INLINE ulint trx_sysf_rseg_get_page_no | ( | trx_sysf_t * | sys_header, | |
| ulint | i, | |||
| mtr_t * | mtr | |||
| ) |
Referenced by trx_rseg_list_and_array_init(), and trx_sysf_rseg_find_free().
Here is the caller graph for this function:

| UNIV_INLINE ulint trx_sysf_rseg_get_space | ( | trx_sysf_t * | sys_header, | |
| ulint | i, | |||
| mtr_t * | mtr | |||
| ) |
| UNIV_INLINE void trx_sysf_rseg_set_page_no | ( | trx_sysf_t * | sys_header, | |
| ulint | i, | |||
| ulint | page_no, | |||
| mtr_t * | mtr | |||
| ) |
Referenced by trx_rseg_header_create(), and trx_sysf_create().
Here is the caller graph for this function:

| UNIV_INLINE void trx_sysf_rseg_set_space | ( | trx_sysf_t * | sys_header, | |
| ulint | i, | |||
| ulint | space, | |||
| mtr_t * | mtr | |||
| ) |
Referenced by trx_rseg_header_create(), and trx_sysf_create().
Here is the caller graph for this function:

Referenced by row_ins_step(), row_set_rec_sys_field(), row_upd_index_entry_sys_field(), row_upd_rec_sys_fields_in_recovery(), and trx_undo_update_rec_get_update().
Here is the caller graph for this function:

Definition at line 27 of file trx0sys.c.
Referenced by buf_flush_buffered_writes(), buf_flush_post_to_doublewrite_buf(), buf_flush_write_block_low(), buf_read_page_low(), innobase_start_or_create_for_mysql(), trx_doublewrite_init(), trx_doublewrite_page_inside(), trx_sys_create_doublewrite_buf(), and trx_sys_doublewrite_init_or_restore_pages().
Definition at line 32 of file trx0sys.c.
Referenced by ibuf_build_entry_from_ibuf_rec(), ibuf_merge_or_delete_for_page(), ibuf_rec_get_page_no(), ibuf_rec_get_space(), ibuf_rec_get_volume(), ibuf_search_tuple_build(), innobase_start_or_create_for_mysql(), and trx_sys_doublewrite_init_or_restore_pages().
Definition at line 26 of file trx0sys.c.
Referenced by innobase_shutdown_for_mysql(), lock_check_trx_id_sanity(), lock_deadlock_occurs(), lock_print_info_all_transactions(), lock_print_info_summary(), lock_release_off_kernel(), lock_validate(), logs_empty_and_mark_files_at_shutdown(), read_cursor_view_create_for_mysql(), read_view_close(), read_view_oldest_copy_or_open_new(), read_view_open_now(), srv_printf_innodb_monitor(), trx_allocate_for_mysql(), trx_assign_rseg(), trx_cleanup_at_db_startup(), trx_commit_off_kernel(), trx_free_for_mysql(), trx_get_trx_by_xid(), trx_in_trx_list(), trx_list_insert_ordered(), trx_lists_init_at_db_start(), trx_purge(), trx_purge_add_update_undo_to_history(), trx_purge_choose_next_log(), trx_purge_free_segment(), trx_purge_rseg_get_next_history_log(), trx_purge_truncate_history(), trx_purge_truncate_rseg_history(), trx_recover_for_mysql(), trx_rollback_or_clean_all_without_sess(), trx_rseg_get_on_id(), trx_rseg_list_and_array_init(), trx_rseg_mem_create(), trx_start_low(), trx_sys_flush_max_trx_id(), and trx_sys_init_at_db_start().
Definition at line 38 of file trx0sys.c.
Referenced by ibuf_build_entry_from_ibuf_rec(), ibuf_get_volume_buffered(), ibuf_insert(), ibuf_insert_low(), ibuf_merge_or_delete_for_page(), ibuf_new_search_tuple_build(), ibuf_rec_get_page_no(), ibuf_rec_get_space(), ibuf_rec_get_volume(), ibuf_search_tuple_build(), trx_sys_create_doublewrite_buf(), trx_sys_doublewrite_init_or_restore_pages(), and trx_sys_mark_upgraded_to_multiple_tablespaces().
| char trx_sys_mysql_bin_log_name[] |
| ib_longlong trx_sys_mysql_bin_log_pos |
| ib_longlong trx_sys_mysql_master_log_pos |
1.4.7

