MDEV-15059 - Misc small InnoDB scalability fixes

Form better trx_sys API.
This commit is contained in:
Sergey Vojtovich 2018-01-25 18:29:59 +04:00
parent 064bd78038
commit 55277e8840
8 changed files with 43 additions and 47 deletions

View File

@ -482,10 +482,11 @@ inconsistent:
/* In fact, because we only ever append fields to the 'default /* In fact, because we only ever append fields to the 'default
value' record, it is also OK to perform READ UNCOMMITTED and value' record, it is also OK to perform READ UNCOMMITTED and
then ignore any extra fields, provided that 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 if (rec_offs_n_fields(offsets) > index->n_fields
&& !trx_sys.rw_trx_hash.find(row_get_rec_trx_id(rec, index, && !trx_sys.is_registered(current_trx(),
offsets))) { row_get_rec_trx_id(rec, index,
offsets))) {
goto inconsistent; goto inconsistent;
} }

View File

@ -682,12 +682,6 @@ public:
} }
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. Inserts trx to lock-free hash.
@ -974,6 +968,29 @@ public:
ulint any_active_transactions(); 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: private:
static my_bool get_min_trx_id_callback(rw_trx_hash_element_t *element, static my_bool get_min_trx_id_callback(rw_trx_hash_element_t *element,
trx_id_t *id) trx_id_t *id)

View File

@ -5742,7 +5742,7 @@ lock_rec_queue_validate(
/* Unlike the non-debug code, this invariant can only succeed /* Unlike the non-debug code, this invariant can only succeed
if the check and assertion are covered by the lock mutex. */ 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)); lock_clust_rec_some_has_impl(rec, index, offsets));
ut_ad(lock_mutex_own()); ut_ad(lock_mutex_own());
@ -6387,7 +6387,7 @@ lock_rec_convert_impl_to_expl(
trx_id = lock_clust_rec_some_has_impl(rec, index, offsets); 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 { } else {
ut_ad(!dict_index_is_online_ddl(index)); ut_ad(!dict_index_is_online_ddl(index));

View File

@ -222,7 +222,7 @@ void ReadView::clone()
rw_trx_hash are in sync and they hold either ACTIVE or PREPARED rw_trx_hash are in sync and they hold either ACTIVE or PREPARED
transaction. transaction.
Now rw_trx_hash.find() does Now rw_trx_hash_t::find() does
ut_ad(trx_state_eq(trx, TRX_STATE_ACTIVE) || ut_ad(trx_state_eq(trx, TRX_STATE_ACTIVE) ||
trx_state_eq(trx, TRX_STATE_PREPARED)). trx_state_eq(trx, TRX_STATE_PREPARED)).
No need to repeat it here. We even can't repeat it here: it'll be race No need to repeat it here. We even can't repeat it here: it'll be race
@ -235,7 +235,7 @@ void ReadView::clone()
protection. Thus we need repeat this lookup. */ protection. Thus we need repeat this lookup. */
for (trx_ids_t::const_iterator it = trx_sys.rw_trx_ids.begin(); for (trx_ids_t::const_iterator it = trx_sys.rw_trx_ids.begin();
it != trx_sys.rw_trx_ids.end(); ++it) { 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 */ #endif /* UNIV_DEBUG */
m_up_limit_id = m_ids.empty() ? m_low_limit_id : m_ids.front(); m_up_limit_id = m_ids.empty() ? m_low_limit_id : m_ids.front();

View File

@ -415,8 +415,9 @@ row_build_low(
times, and the cursor restore can happen multiple times for single times, and the cursor restore can happen multiple times for single
insert or update statement. */ insert or update statement. */
ut_a(!rec_offs_any_null_extern(rec, offsets) ut_a(!rec_offs_any_null_extern(rec, offsets)
|| trx_sys.rw_trx_hash.find(row_get_rec_trx_id(rec, index, || trx_sys.is_registered(current_trx(),
offsets))); row_get_rec_trx_id(rec, index,
offsets)));
#endif /* UNIV_DEBUG || UNIV_BLOB_LIGHT_DEBUG */ #endif /* UNIV_DEBUG || UNIV_BLOB_LIGHT_DEBUG */
if (type != ROW_COPY_POINTERS) { if (type != ROW_COPY_POINTERS) {

View File

@ -4870,7 +4870,7 @@ wrong_offs:
/* In delete-marked records, DB_TRX_ID must /* In delete-marked records, DB_TRX_ID must
always refer to an existing undo log record. */ always refer to an existing undo log record. */
ut_ad(trx_id); 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 /* The clustered index record
was delete-marked in a committed was delete-marked in a committed
transaction. Ignore the record. */ transaction. Ignore the record. */

View File

@ -121,7 +121,7 @@ row_vers_impl_x_locked_low(
DBUG_RETURN(0); 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) { if (trx == 0) {
/* The transaction that modified or inserted clust_rec is no /* The transaction that modified or inserted clust_rec is no
@ -186,7 +186,7 @@ row_vers_impl_x_locked_low(
inserting a delete-marked record. */ inserting a delete-marked record. */
ut_ad(prev_version ut_ad(prev_version
|| !rec_get_deleted_flag(version, comp) || !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. */ /* Free version and clust_offsets. */
mem_heap_free(old_heap); mem_heap_free(old_heap);
@ -1280,7 +1280,7 @@ row_vers_build_for_semi_consistent_read(
rec_trx_id = version_trx_id; 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: committed_version_trx:
/* We found a version that belongs to a /* We found a version that belongs to a
committed transaction: return it. */ committed transaction: return it. */

View File

@ -937,7 +937,7 @@ trx_lists_init_at_db_start()
for (undo = UT_LIST_GET_FIRST(rseg->undo_list); for (undo = UT_LIST_GET_FIRST(rseg->undo_list);
undo != NULL; undo != NULL;
undo = UT_LIST_GET_NEXT(undo_list, undo)) { 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) { if (!trx) {
trx_resurrect(undo, rseg, start_time, trx_resurrect(undo, rseg, start_time,
&rows_to_undo, false); &rows_to_undo, false);
@ -1094,11 +1094,7 @@ trx_t::assign_temp_rseg()
rsegs.m_noredo.rseg = rseg; rsegs.m_noredo.rseg = rseg;
if (id == 0) { if (id == 0) {
mutex_enter(&trx_sys.mutex); trx_sys.register_rw(this);
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);
} }
ut_ad(!rseg->is_persistent()); ut_ad(!rseg->is_persistent());
@ -1186,12 +1182,7 @@ trx_start_low(
|| srv_read_only_mode || srv_read_only_mode
|| srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO); || srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO);
mutex_enter(&trx_sys.mutex); trx_sys.register_rw(trx);
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);
} else { } else {
trx->id = 0; trx->id = 0;
@ -1202,17 +1193,8 @@ trx_start_low(
to write to the temporary table. */ to write to the temporary table. */
if (read_write) { if (read_write) {
mutex_enter(&trx_sys.mutex);
ut_ad(!srv_read_only_mode); ut_ad(!srv_read_only_mode);
trx_sys.register_rw(trx);
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);
} }
} else { } else {
ut_ad(!read_write); ut_ad(!read_write);
@ -2721,14 +2703,9 @@ trx_set_rw_mode(
based on in-consistent view formed during promotion. */ based on in-consistent view formed during promotion. */
trx->rsegs.m_redo.rseg = trx_assign_rseg_low(); trx->rsegs.m_redo.rseg = trx_assign_rseg_low();
ut_ad(trx->rsegs.m_redo.rseg != 0); ut_ad(trx->rsegs.m_redo.rseg != 0);
mutex_enter(&trx_sys.mutex); trx_sys.register_rw(trx);
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);
/* So that we can see our own changes. */ /* So that we can see our own changes. */
if (trx->read_view.is_open()) { if (trx->read_view.is_open()) {