diff options
author | Jan Lindström <jan.lindstrom@mariadb.com> | 2016-08-12 11:17:45 +0300 |
---|---|---|
committer | Jan Lindström <jan.lindstrom@mariadb.com> | 2016-09-02 13:22:28 +0300 |
commit | 2e814d4702d71a04388386a9f591d14a35980bfe (patch) | |
tree | f3f9b48d116a3738c5e71f3a360ca61f16cfb632 /storage/innobase/include/trx0rseg.ic | |
parent | 848d211c5c4df00b819cd84d7530cf7d29bb0524 (diff) | |
download | mariadb-git-2e814d4702d71a04388386a9f591d14a35980bfe.tar.gz |
Merge InnoDB 5.7 from mysql-5.7.9.
Contains also
MDEV-10547: Test multi_update_innodb fails with InnoDB 5.7
The failure happened because 5.7 has changed the signature of
the bool handler::primary_key_is_clustered() const
virtual function ("const" was added). InnoDB was using the old
signature which caused the function not to be used.
MDEV-10550: Parallel replication lock waits/deadlock handling does not work with InnoDB 5.7
Fixed mutexing problem on lock_trx_handle_wait. Note that
rpl_parallel and rpl_optimistic_parallel tests still
fail.
MDEV-10156 : Group commit tests fail on 10.2 InnoDB (branch bb-10.2-jan)
Reason: incorrect merge
MDEV-10550: Parallel replication can't sync with master in InnoDB 5.7 (branch bb-10.2-jan)
Reason: incorrect merge
Diffstat (limited to 'storage/innobase/include/trx0rseg.ic')
-rw-r--r-- | storage/innobase/include/trx0rseg.ic | 94 |
1 files changed, 50 insertions, 44 deletions
diff --git a/storage/innobase/include/trx0rseg.ic b/storage/innobase/include/trx0rseg.ic index 30743da9b8c..9574be67ff8 100644 --- a/storage/innobase/include/trx0rseg.ic +++ b/storage/innobase/include/trx0rseg.ic @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1996, 2009, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1996, 2013, Oracle and/or its affiliates. All Rights Reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -27,23 +27,26 @@ Created 3/26/1996 Heikki Tuuri #include "mtr0log.h" #include "trx0sys.h" -/******************************************************************//** -Gets a rollback segment header. -@return rollback segment header, page x-latched */ +/** Gets a rollback segment header. +@param[in] space space where placed +@param[in] page_no page number of the header +@param[in] page_size page size +@param[in,out] mtr mini-transaction +@return rollback segment header, page x-latched */ UNIV_INLINE trx_rsegf_t* trx_rsegf_get( -/*==========*/ - ulint space, /*!< in: space where placed */ - ulint zip_size, /*!< in: compressed page size in bytes - or 0 for uncompressed pages */ - ulint page_no, /*!< in: page number of the header */ - mtr_t* mtr) /*!< in: mtr */ + ulint space, + ulint page_no, + const page_size_t& page_size, + mtr_t* mtr) { buf_block_t* block; trx_rsegf_t* header; - block = buf_page_get(space, zip_size, page_no, RW_X_LATCH, mtr); + block = buf_page_get( + page_id_t(space, page_no), page_size, RW_X_LATCH, mtr); + buf_block_dbg_add_level(block, SYNC_RSEG_HEADER); header = TRX_RSEG + buf_block_get_frame(block); @@ -51,23 +54,26 @@ trx_rsegf_get( return(header); } -/******************************************************************//** -Gets a newly created rollback segment header. -@return rollback segment header, page x-latched */ +/** Gets a newly created rollback segment header. +@param[in] space space where placed +@param[in] page_no page number of the header +@param[in] page_size page size +@param[in,out] mtr mini-transaction +@return rollback segment header, page x-latched */ UNIV_INLINE trx_rsegf_t* trx_rsegf_get_new( -/*==============*/ - ulint space, /*!< in: space where placed */ - ulint zip_size, /*!< in: compressed page size in bytes - or 0 for uncompressed pages */ - ulint page_no, /*!< in: page number of the header */ - mtr_t* mtr) /*!< in: mtr */ + ulint space, + ulint page_no, + const page_size_t& page_size, + mtr_t* mtr) { buf_block_t* block; trx_rsegf_t* header; - block = buf_page_get(space, zip_size, page_no, RW_X_LATCH, mtr); + block = buf_page_get( + page_id_t(space, page_no), page_size, RW_X_LATCH, mtr); + buf_block_dbg_add_level(block, SYNC_RSEG_HEADER_NEW); header = TRX_RSEG + buf_block_get_frame(block); @@ -77,7 +83,7 @@ trx_rsegf_get_new( /***************************************************************//** Gets the file page number of the nth undo log slot. -@return page number of the undo log segment */ +@return page number of the undo log segment */ UNIV_INLINE ulint trx_rsegf_get_nth_undo( @@ -86,12 +92,7 @@ trx_rsegf_get_nth_undo( ulint n, /*!< in: index of slot */ mtr_t* mtr) /*!< in: mtr */ { - if (n >= TRX_RSEG_N_SLOTS) { - fprintf(stderr, - "InnoDB: Error: trying to get slot %lu of rseg\n", - (ulong) n); - ut_error; - } + ut_a(n < TRX_RSEG_N_SLOTS); return(mtr_read_ulint(rsegf + TRX_RSEG_UNDO_SLOTS + n * TRX_RSEG_SLOT_SIZE, MLOG_4BYTES, mtr)); @@ -108,12 +109,7 @@ trx_rsegf_set_nth_undo( ulint page_no,/*!< in: page number of the undo log segment */ mtr_t* mtr) /*!< in: mtr */ { - if (n >= TRX_RSEG_N_SLOTS) { - fprintf(stderr, - "InnoDB: Error: trying to set slot %lu of rseg\n", - (ulong) n); - ut_error; - } + ut_a(n < TRX_RSEG_N_SLOTS); mlog_write_ulint(rsegf + TRX_RSEG_UNDO_SLOTS + n * TRX_RSEG_SLOT_SIZE, page_no, MLOG_4BYTES, mtr); @@ -121,7 +117,7 @@ trx_rsegf_set_nth_undo( /****************************************************************//** Looks for a free slot for an undo log segment. -@return slot index or ULINT_UNDEFINED if not found */ +@return slot index or ULINT_UNDEFINED if not found */ UNIV_INLINE ulint trx_rsegf_undo_find_free( @@ -131,19 +127,19 @@ trx_rsegf_undo_find_free( { ulint i; ulint page_no; + ulint max_slots = TRX_RSEG_N_SLOTS; - for (i = 0; -#ifndef UNIV_DEBUG - i < TRX_RSEG_N_SLOTS; -#else - i < (trx_rseg_n_slots_debug ? trx_rseg_n_slots_debug : TRX_RSEG_N_SLOTS); +#ifdef UNIV_DEBUG + if (trx_rseg_n_slots_debug) { + max_slots = ut_min(static_cast<ulint>(trx_rseg_n_slots_debug), + static_cast<ulint>(TRX_RSEG_N_SLOTS)); + } #endif - i++) { + for (i = 0; i < max_slots; i++) { page_no = trx_rsegf_get_nth_undo(rsegf, i, mtr); if (page_no == FIL_NULL) { - return(i); } } @@ -153,15 +149,25 @@ trx_rsegf_undo_find_free( /******************************************************************//** Looks for a rollback segment, based on the rollback segment id. -@return rollback segment */ +@return rollback segment */ UNIV_INLINE trx_rseg_t* trx_rseg_get_on_id( /*===============*/ - ulint id) /*!< in: rollback segment id */ + ulint id, /*!< in: rollback segment id */ + bool is_redo_rseg) /*!< in: true if redo rseg else false. */ { ut_a(id < TRX_SYS_N_RSEGS); + /* If redo rseg is being requested and id falls in range of + non-redo rseg that is from slot-1....slot-srv_tmp_undo_logs then + server is being upgraded from pre-5.7.2. In such case return + rseg from pending_purge_rseg_array array. */ + if (is_redo_rseg && trx_sys_is_noredo_rseg_slot(id)) { + ut_ad(trx_sys->pending_purge_rseg_array[id] != NULL); + return(trx_sys->pending_purge_rseg_array[id]); + } + return(trx_sys->rseg_array[id]); } |