diff options
Diffstat (limited to 'storage/innobase/trx/trx0sys.cc')
-rw-r--r-- | storage/innobase/trx/trx0sys.cc | 225 |
1 files changed, 109 insertions, 116 deletions
diff --git a/storage/innobase/trx/trx0sys.cc b/storage/innobase/trx/trx0sys.cc index 7537ef2e445..a253ea72e95 100644 --- a/storage/innobase/trx/trx0sys.cc +++ b/storage/innobase/trx/trx0sys.cc @@ -186,9 +186,9 @@ trx_sys_flush_max_trx_id(void) trx_sysf_t* sys_header; #ifndef WITH_WSREP - /* wsrep_fake_trx_id violates this assert - * Copied from trx_sys_get_new_trx_id - */ + /* wsrep_fake_trx_id violates this assert + Copied from trx_sys_get_new_trx_id + */ ut_ad(trx_sys_mutex_own()); #endif /* WITH_WSREP */ @@ -217,14 +217,10 @@ trx_sys_update_mysql_binlog_offset( int64_t offset, /*!< in: position in that log file */ ulint field, /*!< in: offset of the MySQL log info field in the trx sys header */ -#ifdef WITH_WSREP trx_sysf_t* sys_header, /*!< in: trx sys header */ -#endif /* WITH_WSREP */ mtr_t* mtr) /*!< in: mtr */ { -#ifndef WITH_WSREP - trx_sysf_t* sys_header; -#endif /* !WITH_WSREP */ + DBUG_PRINT("InnoDB",("trx_mysql_binlog_offset: %lld", (longlong) offset)); if (ut_strlen(file_name) >= TRX_SYS_MYSQL_LOG_NAME_LEN) { @@ -233,9 +229,9 @@ trx_sys_update_mysql_binlog_offset( return; } -#ifndef WITH_WSREP - sys_header = trx_sysf_get(mtr); -#endif /* !WITH_WSREP */ + if (sys_header == NULL) { + sys_header = trx_sysf_get(mtr); + } if (mach_read_from_4(sys_header + field + TRX_SYS_MYSQL_LOG_MAGIC_N_FLD) @@ -322,119 +318,119 @@ static unsigned char trx_sys_cur_xid_uuid[16]; long long read_wsrep_xid_seqno(const XID* xid) { - long long seqno; - memcpy(&seqno, xid->data + 24, sizeof(long long)); - return seqno; + long long seqno; + memcpy(&seqno, xid->data + 24, sizeof(long long)); + return seqno; } void read_wsrep_xid_uuid(const XID* xid, unsigned char* buf) { - memcpy(buf, xid->data + 8, 16); + memcpy(buf, xid->data + 8, 16); } #endif /* UNIV_DEBUG */ void trx_sys_update_wsrep_checkpoint( - const XID* xid, /*!< in: transaction XID */ - trx_sysf_t* sys_header, /*!< in: sys_header */ - mtr_t* mtr) /*!< in: mtr */ +/*============================*/ + const XID* xid, /*!< in: transaction XID */ + trx_sysf_t* sys_header, /*!< in: sys_header */ + mtr_t* mtr) /*!< in: mtr */ { #ifdef UNIV_DEBUG - { - /* Check that seqno is monotonically increasing */ - unsigned char xid_uuid[16]; - long long xid_seqno = read_wsrep_xid_seqno(xid); - read_wsrep_xid_uuid(xid, xid_uuid); - if (!memcmp(xid_uuid, trx_sys_cur_xid_uuid, 16)) - { - /* - This check is a protection against the initial seqno (-1) - assigned in read_wsrep_xid_uuid(), which, if not checked, - would cause the following assertion to fail. - */ - if (xid_seqno > -1 ) - { - ut_ad(xid_seqno > trx_sys_cur_xid_seqno); - } - } - else - { - memcpy(trx_sys_cur_xid_uuid, xid_uuid, 16); - } - trx_sys_cur_xid_seqno = xid_seqno; - } + { + /* Check that seqno is monotonically increasing */ + unsigned char xid_uuid[16]; + long long xid_seqno = read_wsrep_xid_seqno(xid); + read_wsrep_xid_uuid(xid, xid_uuid); + if (!memcmp(xid_uuid, trx_sys_cur_xid_uuid, 16)) + { + /* + This check is a protection against the initial seqno (-1) + assigned in read_wsrep_xid_uuid(), which, if not checked, + would cause the following assertion to fail. + */ + if (xid_seqno > -1 ) + { + ut_ad(xid_seqno > trx_sys_cur_xid_seqno); + } + } else { + memcpy(trx_sys_cur_xid_uuid, xid_uuid, 16); + } + trx_sys_cur_xid_seqno = xid_seqno; + } #endif /* UNIV_DEBUG */ - ut_ad(xid && mtr); - ut_a(xid->formatID == -1 || wsrep_is_wsrep_xid(xid)); - - if (mach_read_from_4(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_MAGIC_N_FLD) - != TRX_SYS_WSREP_XID_MAGIC_N) { - mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_MAGIC_N_FLD, - TRX_SYS_WSREP_XID_MAGIC_N, - MLOG_4BYTES, mtr); - } - - mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_FORMAT, - (int)xid->formatID, - MLOG_4BYTES, mtr); - mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_GTRID_LEN, - (int)xid->gtrid_length, - MLOG_4BYTES, mtr); - mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_BQUAL_LEN, - (int)xid->bqual_length, - MLOG_4BYTES, mtr); - mlog_write_string(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_DATA, - (const unsigned char*) xid->data, - XIDDATASIZE, mtr); + ut_ad(xid && mtr); + ut_a(xid->formatID == -1 || wsrep_is_wsrep_xid(xid)); + + if (mach_read_from_4(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_MAGIC_N_FLD) + != TRX_SYS_WSREP_XID_MAGIC_N) { + mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_MAGIC_N_FLD, + TRX_SYS_WSREP_XID_MAGIC_N, + MLOG_4BYTES, mtr); + } + + mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_FORMAT, + (int)xid->formatID, + MLOG_4BYTES, mtr); + mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_GTRID_LEN, + (int)xid->gtrid_length, + MLOG_4BYTES, mtr); + mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_BQUAL_LEN, + (int)xid->bqual_length, + MLOG_4BYTES, mtr); + mlog_write_string(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_DATA, + (const unsigned char*) xid->data, + XIDDATASIZE, mtr); } void -trx_sys_read_wsrep_checkpoint(XID* xid) -/*===================================*/ +trx_sys_read_wsrep_checkpoint( +/*==========================*/ + XID* xid) { - trx_sysf_t* sys_header; - mtr_t mtr; - ulint magic; + trx_sysf_t* sys_header; + mtr_t mtr; + ulint magic; - ut_ad(xid); + ut_ad(xid); mtr_start(&mtr); sys_header = trx_sysf_get(&mtr); - if ((magic = mach_read_from_4(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_MAGIC_N_FLD)) - != TRX_SYS_WSREP_XID_MAGIC_N) { - memset(xid, 0, sizeof(*xid)); - long long seqno= -1; - memcpy(xid->data + 24, &seqno, sizeof(long long)); - xid->formatID = -1; - trx_sys_update_wsrep_checkpoint(xid, sys_header, &mtr); - mtr_commit(&mtr); - return; - } - - xid->formatID = (int)mach_read_from_4( - sys_header - + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_FORMAT); - xid->gtrid_length = (int)mach_read_from_4( - sys_header - + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_GTRID_LEN); - xid->bqual_length = (int)mach_read_from_4( - sys_header - + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_BQUAL_LEN); - ut_memcpy(xid->data, - sys_header + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_DATA, - XIDDATASIZE); + if ((magic = mach_read_from_4(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_MAGIC_N_FLD)) + != TRX_SYS_WSREP_XID_MAGIC_N) { + memset(xid, 0, sizeof(*xid)); + long long seqno= -1; + memcpy(xid->data + 24, &seqno, sizeof(long long)); + xid->formatID = -1; + trx_sys_update_wsrep_checkpoint(xid, sys_header, &mtr); + mtr_commit(&mtr); + return; + } + + xid->formatID = (int)mach_read_from_4( + sys_header + + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_FORMAT); + xid->gtrid_length = (int)mach_read_from_4( + sys_header + + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_GTRID_LEN); + xid->bqual_length = (int)mach_read_from_4( + sys_header + + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_BQUAL_LEN); + ut_memcpy(xid->data, + sys_header + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_DATA, + XIDDATASIZE); mtr_commit(&mtr); } @@ -595,7 +591,6 @@ purge_pq_t* trx_sys_init_at_db_start(void) /*==========================*/ { - mtr_t mtr; purge_pq_t* purge_queue; trx_sysf_t* sys_header; ib_uint64_t rows_to_undo = 0; @@ -607,12 +602,8 @@ trx_sys_init_at_db_start(void) purge_queue = UT_NEW_NOKEY(purge_pq_t()); ut_a(purge_queue != NULL); - mtr_start(&mtr); - - sys_header = trx_sysf_get(&mtr); - if (srv_force_recovery < SRV_FORCE_NO_UNDO_LOG_SCAN) { - trx_rseg_array_init(sys_header, purge_queue, &mtr); + trx_rseg_array_init(purge_queue); } /* VERY important: after the database is started, max_trx_id value is @@ -622,11 +613,17 @@ trx_sys_init_at_db_start(void) to the disk-based header! Thus trx id values will not overlap when the database is repeatedly started! */ + mtr_t mtr; + mtr.start(); + + sys_header = trx_sysf_get(&mtr); + trx_sys->max_trx_id = 2 * TRX_SYS_TRX_ID_WRITE_MARGIN + ut_uint64_align_up(mach_read_from_8(sys_header + TRX_SYS_TRX_ID_STORE), TRX_SYS_TRX_ID_WRITE_MARGIN); + mtr.commit(); ut_d(trx_sys->rw_max_trx_id = trx_sys->max_trx_id); trx_dummy_sess = sess_open(); @@ -669,8 +666,6 @@ trx_sys_init_at_db_start(void) trx_sys_mutex_exit(); - mtr_commit(&mtr); - return(purge_queue); } @@ -1101,17 +1096,15 @@ trx_sys_print_mysql_binlog_offset_from_page( + TRX_SYS_MYSQL_LOG_MAGIC_N_FLD) == TRX_SYS_MYSQL_LOG_MAGIC_N) { - fprintf(stderr, - "mysqlbackup: Last MySQL binlog file position %lu %lu," - " file name %s\n", - (ulong) mach_read_from_4( + ib::info() << "mysqlbackup: Last MySQL binlog file position " + << mach_read_from_4( sys_header + TRX_SYS_MYSQL_LOG_INFO - + TRX_SYS_MYSQL_LOG_OFFSET_HIGH), - (ulong) mach_read_from_4( + + 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); + + TRX_SYS_MYSQL_LOG_OFFSET_LOW) + << ", file name " << sys_header + + TRX_SYS_MYSQL_LOG_INFO + TRX_SYS_MYSQL_LOG_NAME; } } |