summaryrefslogtreecommitdiff
path: root/innobase/trx
diff options
context:
space:
mode:
authormonty@hundin.mysql.fi <>2002-01-30 16:37:47 +0200
committermonty@hundin.mysql.fi <>2002-01-30 16:37:47 +0200
commit79796e989f13c98df32e13d404571b76b1ae6dab (patch)
tree3ca7f6fddbb9bdc0b635f243af69c6606924c3c2 /innobase/trx
parentc396824b2a733651acbe5a23a40a0e59ce628678 (diff)
parent3457b6fde0ee4c08a45a2a1584522b260c444768 (diff)
downloadmariadb-git-79796e989f13c98df32e13d404571b76b1ae6dab.tar.gz
Merge from 3.23.48 tree
Diffstat (limited to 'innobase/trx')
-rw-r--r--innobase/trx/trx0sys.c111
-rw-r--r--innobase/trx/trx0trx.c13
-rw-r--r--innobase/trx/trx0undo.c19
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);
}