Skip to content

Commit

Permalink
MDEV-15059 - Misc small InnoDB scalability fixes
Browse files Browse the repository at this point in the history
Form better trx_sys API.
  • Loading branch information
Sergey Vojtovich committed Jan 26, 2018
1 parent 064bd78 commit 55277e8
Show file tree
Hide file tree
Showing 8 changed files with 43 additions and 47 deletions.
7 changes: 4 additions & 3 deletions storage/innobase/btr/btr0cur.cc
Original file line number Diff line number Diff line change
Expand Up @@ -482,10 +482,11 @@ btr_cur_instant_init_low(dict_index_t* index, mtr_t* mtr)
/* In fact, because we only ever append fields to the 'default
value' record, it is also OK to perform READ UNCOMMITTED and
then ignore any extra fields, provided that
trx_sys.rw_trx_hash.find(DB_TRX_ID). */
trx_sys.is_registered(DB_TRX_ID). */
if (rec_offs_n_fields(offsets) > index->n_fields
&& !trx_sys.rw_trx_hash.find(row_get_rec_trx_id(rec, index,
offsets))) {
&& !trx_sys.is_registered(current_trx(),
row_get_rec_trx_id(rec, index,
offsets))) {
goto inconsistent;
}

Expand Down
29 changes: 23 additions & 6 deletions storage/innobase/include/trx0sys.h
Original file line number Diff line number Diff line change
Expand Up @@ -682,12 +682,6 @@ class rw_trx_hash_t
}


trx_t *find(trx_id_t trx_id, bool do_ref_count= false)
{
return find(current_trx(), trx_id, do_ref_count);
}


/**
Inserts trx to lock-free hash.
Expand Down Expand Up @@ -974,6 +968,29 @@ struct trx_sys_t {
ulint any_active_transactions();


/** Registers read-write transaction. */
void register_rw(trx_t *trx)
{
mutex_enter(&mutex);
trx->id= get_new_trx_id();
rw_trx_ids.push_back(trx->id);
mutex_exit(&mutex);
rw_trx_hash.insert(trx);
}


bool is_registered(trx_t *caller_trx, trx_id_t id)
{
return rw_trx_hash.find(caller_trx, id);
}


trx_t *find(trx_t *caller_trx, trx_id_t id)
{
return rw_trx_hash.find(caller_trx, id, true);
}


private:
static my_bool get_min_trx_id_callback(rw_trx_hash_element_t *element,
trx_id_t *id)
Expand Down
4 changes: 2 additions & 2 deletions storage/innobase/lock/lock0lock.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5742,7 +5742,7 @@ lock_rec_queue_validate(
/* Unlike the non-debug code, this invariant can only succeed
if the check and assertion are covered by the lock mutex. */

const trx_t *impl_trx = trx_sys.rw_trx_hash.find(
const trx_t *impl_trx = trx_sys.rw_trx_hash.find(current_trx(),
lock_clust_rec_some_has_impl(rec, index, offsets));

ut_ad(lock_mutex_own());
Expand Down Expand Up @@ -6387,7 +6387,7 @@ lock_rec_convert_impl_to_expl(

trx_id = lock_clust_rec_some_has_impl(rec, index, offsets);

trx = trx_sys.rw_trx_hash.find(caller_trx, trx_id, true);
trx = trx_sys.find(caller_trx, trx_id);
} else {
ut_ad(!dict_index_is_online_ddl(index));

Expand Down
4 changes: 2 additions & 2 deletions storage/innobase/read/read0read.cc
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ void ReadView::clone()
rw_trx_hash are in sync and they hold either ACTIVE or PREPARED
transaction.
Now rw_trx_hash.find() does
Now rw_trx_hash_t::find() does
ut_ad(trx_state_eq(trx, TRX_STATE_ACTIVE) ||
trx_state_eq(trx, TRX_STATE_PREPARED)).
No need to repeat it here. We even can't repeat it here: it'll be race
Expand All @@ -235,7 +235,7 @@ void ReadView::clone()
protection. Thus we need repeat this lookup. */
for (trx_ids_t::const_iterator it = trx_sys.rw_trx_ids.begin();
it != trx_sys.rw_trx_ids.end(); ++it) {
while (!trx_sys.rw_trx_hash.find(*it));
while (!trx_sys.is_registered(current_trx(), *it));
}
#endif /* UNIV_DEBUG */
m_up_limit_id = m_ids.empty() ? m_low_limit_id : m_ids.front();
Expand Down
5 changes: 3 additions & 2 deletions storage/innobase/row/row0row.cc
Original file line number Diff line number Diff line change
Expand Up @@ -415,8 +415,9 @@ row_build_low(
times, and the cursor restore can happen multiple times for single
insert or update statement. */
ut_a(!rec_offs_any_null_extern(rec, offsets)
|| trx_sys.rw_trx_hash.find(row_get_rec_trx_id(rec, index,
offsets)));
|| trx_sys.is_registered(current_trx(),
row_get_rec_trx_id(rec, index,
offsets)));
#endif /* UNIV_DEBUG || UNIV_BLOB_LIGHT_DEBUG */

if (type != ROW_COPY_POINTERS) {
Expand Down
2 changes: 1 addition & 1 deletion storage/innobase/row/row0sel.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4870,7 +4870,7 @@ row_search_mvcc(
/* In delete-marked records, DB_TRX_ID must
always refer to an existing undo log record. */
ut_ad(trx_id);
if (!trx_sys.rw_trx_hash.find(trx, trx_id)) {
if (!trx_sys.is_registered(trx, trx_id)) {
/* The clustered index record
was delete-marked in a committed
transaction. Ignore the record. */
Expand Down
6 changes: 3 additions & 3 deletions storage/innobase/row/row0vers.cc
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ row_vers_impl_x_locked_low(
DBUG_RETURN(0);
}

trx_t* trx = trx_sys.rw_trx_hash.find(caller_trx, trx_id, true);
trx_t* trx = trx_sys.find(caller_trx, trx_id);

if (trx == 0) {
/* The transaction that modified or inserted clust_rec is no
Expand Down Expand Up @@ -186,7 +186,7 @@ row_vers_impl_x_locked_low(
inserting a delete-marked record. */
ut_ad(prev_version
|| !rec_get_deleted_flag(version, comp)
|| !trx_sys.rw_trx_hash.find(caller_trx, trx_id));
|| !trx_sys.is_registered(caller_trx, trx_id));

/* Free version and clust_offsets. */
mem_heap_free(old_heap);
Expand Down Expand Up @@ -1280,7 +1280,7 @@ row_vers_build_for_semi_consistent_read(
rec_trx_id = version_trx_id;
}

if (!trx_sys.rw_trx_hash.find(caller_trx, version_trx_id)) {
if (!trx_sys.is_registered(caller_trx, version_trx_id)) {
committed_version_trx:
/* We found a version that belongs to a
committed transaction: return it. */
Expand Down
33 changes: 5 additions & 28 deletions storage/innobase/trx/trx0trx.cc
Original file line number Diff line number Diff line change
Expand Up @@ -937,7 +937,7 @@ trx_lists_init_at_db_start()
for (undo = UT_LIST_GET_FIRST(rseg->undo_list);
undo != NULL;
undo = UT_LIST_GET_NEXT(undo_list, undo)) {
trx_t *trx = trx_sys.rw_trx_hash.find(undo->trx_id);
trx_t *trx = trx_sys.rw_trx_hash.find(0, undo->trx_id);
if (!trx) {
trx_resurrect(undo, rseg, start_time,
&rows_to_undo, false);
Expand Down Expand Up @@ -1094,11 +1094,7 @@ trx_t::assign_temp_rseg()
rsegs.m_noredo.rseg = rseg;

if (id == 0) {
mutex_enter(&trx_sys.mutex);
id = trx_sys.get_new_trx_id();
trx_sys.rw_trx_ids.push_back(id);
mutex_exit(&trx_sys.mutex);
trx_sys.rw_trx_hash.insert(this);
trx_sys.register_rw(this);
}

ut_ad(!rseg->is_persistent());
Expand Down Expand Up @@ -1186,12 +1182,7 @@ trx_start_low(
|| srv_read_only_mode
|| srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO);

mutex_enter(&trx_sys.mutex);
trx->id = trx_sys.get_new_trx_id();
trx_sys.rw_trx_ids.push_back(trx->id);
mutex_exit(&trx_sys.mutex);
trx_sys.rw_trx_hash.insert(trx);

trx_sys.register_rw(trx);
} else {
trx->id = 0;

Expand All @@ -1202,17 +1193,8 @@ trx_start_low(
to write to the temporary table. */

if (read_write) {

mutex_enter(&trx_sys.mutex);

ut_ad(!srv_read_only_mode);

trx->id = trx_sys.get_new_trx_id();

trx_sys.rw_trx_ids.push_back(trx->id);

mutex_exit(&trx_sys.mutex);
trx_sys.rw_trx_hash.insert(trx);
trx_sys.register_rw(trx);
}
} else {
ut_ad(!read_write);
Expand Down Expand Up @@ -2721,14 +2703,9 @@ trx_set_rw_mode(
based on in-consistent view formed during promotion. */

trx->rsegs.m_redo.rseg = trx_assign_rseg_low();

ut_ad(trx->rsegs.m_redo.rseg != 0);

mutex_enter(&trx_sys.mutex);
trx->id = trx_sys.get_new_trx_id();
trx_sys.rw_trx_ids.push_back(trx->id);
mutex_exit(&trx_sys.mutex);
trx_sys.rw_trx_hash.insert(trx);
trx_sys.register_rw(trx);

/* So that we can see our own changes. */
if (trx->read_view.is_open()) {
Expand Down

0 comments on commit 55277e8

Please sign in to comment.