diff options
author | monty@hundin.mysql.fi <> | 2002-01-30 16:37:47 +0200 |
---|---|---|
committer | monty@hundin.mysql.fi <> | 2002-01-30 16:37:47 +0200 |
commit | 79796e989f13c98df32e13d404571b76b1ae6dab (patch) | |
tree | 3ca7f6fddbb9bdc0b635f243af69c6606924c3c2 /innobase/trx | |
parent | c396824b2a733651acbe5a23a40a0e59ce628678 (diff) | |
parent | 3457b6fde0ee4c08a45a2a1584522b260c444768 (diff) | |
download | mariadb-git-79796e989f13c98df32e13d404571b76b1ae6dab.tar.gz |
Merge from 3.23.48 tree
Diffstat (limited to 'innobase/trx')
-rw-r--r-- | innobase/trx/trx0sys.c | 111 | ||||
-rw-r--r-- | innobase/trx/trx0trx.c | 13 | ||||
-rw-r--r-- | innobase/trx/trx0undo.c | 19 |
3 files changed, 136 insertions, 7 deletions
diff --git a/innobase/trx/trx0sys.c b/innobase/trx/trx0sys.c index e79e4594637..b29ffb4b3bf 100644 --- a/innobase/trx/trx0sys.c +++ b/innobase/trx/trx0sys.c @@ -389,6 +389,115 @@ trx_sys_flush_max_trx_id(void) mtr_commit(&mtr); } +/********************************************************************* +Updates the offset information about the end of the MySQL binlog entry +which corresponds to the transaction just being committed. */ + +void +trx_sys_update_mysql_binlog_offset( +/*===============================*/ + trx_t* trx, /* in: transaction being committed */ + mtr_t* mtr) /* in: mtr */ +{ + trx_sysf_t* sys_header; + char namebuf[TRX_SYS_MYSQL_LOG_NAME_LEN]; + + ut_ad(mutex_own(&kernel_mutex)); + ut_ad(trx->mysql_log_file_name); + + memset(namebuf, ' ', TRX_SYS_MYSQL_LOG_NAME_LEN - 1); + namebuf[TRX_SYS_MYSQL_LOG_NAME_LEN - 1] = '\0'; + + /* Copy the whole MySQL log file name to the buffer, or only the + last characters, if it does not fit */ + + if (ut_strlen(trx->mysql_log_file_name) + > TRX_SYS_MYSQL_LOG_NAME_LEN - 1) { + ut_memcpy(namebuf, trx->mysql_log_file_name + + ut_strlen(trx->mysql_log_file_name) + - (TRX_SYS_MYSQL_LOG_NAME_LEN - 1), + TRX_SYS_MYSQL_LOG_NAME_LEN - 1); + } else { + ut_memcpy(namebuf, trx->mysql_log_file_name, + 1 + ut_strlen(trx->mysql_log_file_name)); + } + + namebuf[TRX_SYS_MYSQL_LOG_NAME_LEN - 1] = '\0'; + + sys_header = trx_sysf_get(mtr); + + if (mach_read_from_4(sys_header + TRX_SYS_MYSQL_LOG_INFO + + TRX_SYS_MYSQL_LOG_MAGIC_N_FLD) + != TRX_SYS_MYSQL_LOG_MAGIC_N) { + + mlog_write_ulint(sys_header + TRX_SYS_MYSQL_LOG_INFO + + TRX_SYS_MYSQL_LOG_MAGIC_N_FLD, + TRX_SYS_MYSQL_LOG_MAGIC_N, + MLOG_4BYTES, mtr); + } + + if (0 != ut_memcmp(sys_header + TRX_SYS_MYSQL_LOG_INFO + + TRX_SYS_MYSQL_LOG_NAME, + namebuf, TRX_SYS_MYSQL_LOG_NAME_LEN)) { + + mlog_write_string(sys_header + TRX_SYS_MYSQL_LOG_INFO + + TRX_SYS_MYSQL_LOG_NAME, + namebuf, TRX_SYS_MYSQL_LOG_NAME_LEN, mtr); + } + + if (mach_read_from_4(sys_header + TRX_SYS_MYSQL_LOG_INFO + + TRX_SYS_MYSQL_LOG_OFFSET_HIGH) > 0 + || (trx->mysql_log_offset >> 32) > 0) { + + mlog_write_ulint(sys_header + TRX_SYS_MYSQL_LOG_INFO + + TRX_SYS_MYSQL_LOG_OFFSET_HIGH, + (ulint)(trx->mysql_log_offset >> 32), + MLOG_4BYTES, mtr); + } + + mlog_write_ulint(sys_header + TRX_SYS_MYSQL_LOG_INFO + + TRX_SYS_MYSQL_LOG_OFFSET_LOW, + (ulint)(trx->mysql_log_offset & 0xFFFFFFFF), + MLOG_4BYTES, mtr); + + trx->mysql_log_file_name = NULL; +} + +/********************************************************************* +Prints to stderr the MySQL binlog offset info in the trx system header if +the magic number shows it valid. */ + +void +trx_sys_print_mysql_binlog_offset(void) +/*===================================*/ +{ + trx_sysf_t* sys_header; + mtr_t mtr; + + mtr_start(&mtr); + + sys_header = trx_sysf_get(&mtr); + + if (mach_read_from_4(sys_header + TRX_SYS_MYSQL_LOG_INFO + + TRX_SYS_MYSQL_LOG_MAGIC_N_FLD) + != TRX_SYS_MYSQL_LOG_MAGIC_N) { + + mtr_commit(&mtr); + + return; + } + + fprintf(stderr, + "InnoDB: Last MySQL binlog file offset %lu %lu, file name %s\n", + mach_read_from_4(sys_header + TRX_SYS_MYSQL_LOG_INFO + + TRX_SYS_MYSQL_LOG_OFFSET_HIGH), + mach_read_from_4(sys_header + TRX_SYS_MYSQL_LOG_INFO + + TRX_SYS_MYSQL_LOG_OFFSET_LOW), + sys_header + TRX_SYS_MYSQL_LOG_INFO + TRX_SYS_MYSQL_LOG_NAME); + + mtr_commit(&mtr); +} + /******************************************************************** Looks for a free slot for a rollback segment in the trx system file copy. */ @@ -519,7 +628,7 @@ trx_sys_init_at_db_start(void) "InnoDB: %lu uncommitted transaction(s) which must be rolled back\n", UT_LIST_GET_LEN(trx_sys->trx_list)); - fprintf(stderr, "Trx id counter is %lu %lu\n", + fprintf(stderr, "InnoDB: Trx id counter is %lu %lu\n", ut_dulint_get_high(trx_sys->max_trx_id), ut_dulint_get_low(trx_sys->max_trx_id)); } diff --git a/innobase/trx/trx0trx.c b/innobase/trx/trx0trx.c index 5f696d9c01a..315bb7030ee 100644 --- a/innobase/trx/trx0trx.c +++ b/innobase/trx/trx0trx.c @@ -76,6 +76,9 @@ trx_create( trx->n_mysql_tables_in_use = 0; trx->mysql_n_tables_locked = 0; + trx->mysql_log_file_name = NULL; + trx->mysql_log_offset = 0; + trx->ignore_duplicates_in_insert = FALSE; mutex_create(&(trx->undo_mutex)); @@ -111,6 +114,9 @@ trx_create( trx->has_search_latch = FALSE; trx->search_latch_timeout = BTR_SEA_TIMEOUT; + trx->declared_to_be_inside_innodb = FALSE; + trx->n_tickets_to_enter_innodb = 0; + trx->auto_inc_lock = NULL; trx->read_view_heap = mem_heap_create(256); @@ -568,6 +574,13 @@ trx_commit_off_kernel( mutex_exit(&(rseg->mutex)); + /* Update the latest MySQL binlog name and offset info + in trx sys header if MySQL binlogging is on */ + + if (trx->mysql_log_file_name) { + trx_sys_update_mysql_binlog_offset(trx, &mtr); + } + /* If we did not take the shortcut, the following call commits the mini-transaction, making the whole transaction committed in the file-based world at this log sequence number; diff --git a/innobase/trx/trx0undo.c b/innobase/trx/trx0undo.c index d53f8bd73de..aae31f3726b 100644 --- a/innobase/trx/trx0undo.c +++ b/innobase/trx/trx0undo.c @@ -1310,9 +1310,10 @@ trx_undo_mem_init_for_reuse( { ut_ad(mutex_own(&((undo->rseg)->mutex))); - if (undo->id >= TRX_RSEG_N_SLOTS) { - fprintf(stderr, - "InnoDB: Error: undo->id is %lu\n", undo->id); + if (undo->id >= TRX_RSEG_N_SLOTS) { + fprintf(stderr, "InnoDB: Error: undo->id is %lu\n", undo->id); + + mem_analyze_corruption((byte*)undo); ut_a(0); } @@ -1399,7 +1400,7 @@ trx_undo_create( /************************************************************************ Reuses a cached undo log. */ -UNIV_INLINE +static trx_undo_t* trx_undo_reuse_cached( /*==================*/ @@ -1442,6 +1443,12 @@ trx_undo_reuse_cached( ut_ad(undo->size == 1); ut_ad(undo->hdr_page_no == undo->top_page_no); + if (undo->id >= TRX_RSEG_N_SLOTS) { + fprintf(stderr, "InnoDB: Error: undo->id is %lu\n", undo->id); + mem_analyze_corruption((byte*)undo); + ut_a(0); + } + undo_page = trx_undo_page_get(undo->space, undo->hdr_page_no, mtr); if (type == TRX_UNDO_INSERT) { @@ -1572,8 +1579,8 @@ trx_undo_set_state_at_finish( ut_ad(trx && undo && mtr); if (undo->id >= TRX_RSEG_N_SLOTS) { - fprintf(stderr, - "InnoDB: Error: undo->id is %lu\n", undo->id); + fprintf(stderr, "InnoDB: Error: undo->id is %lu\n", undo->id); + mem_analyze_corruption((byte*)undo); ut_a(0); } |