Browse Source

MDEV-15059 - Misc small InnoDB scalability fixes

Form better trx_sys API.
pull/478/merge
Sergey Vojtovich 8 years ago
parent
commit
55277e8840
  1. 7
      storage/innobase/btr/btr0cur.cc
  2. 29
      storage/innobase/include/trx0sys.h
  3. 4
      storage/innobase/lock/lock0lock.cc
  4. 4
      storage/innobase/read/read0read.cc
  5. 5
      storage/innobase/row/row0row.cc
  6. 2
      storage/innobase/row/row0sel.cc
  7. 6
      storage/innobase/row/row0vers.cc
  8. 33
      storage/innobase/trx/trx0trx.cc

7
storage/innobase/btr/btr0cur.cc

@ -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,
offsets))) {
&& !trx_sys.is_registered(current_trx(),
row_get_rec_trx_id(rec, index,
offsets))) {
goto inconsistent; goto inconsistent;
} }

29
storage/innobase/include/trx0sys.h

@ -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)

4
storage/innobase/lock/lock0lock.cc

@ -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));

4
storage/innobase/read/read0read.cc

@ -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();

5
storage/innobase/row/row0row.cc

@ -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,
offsets)));
|| trx_sys.is_registered(current_trx(),
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) {

2
storage/innobase/row/row0sel.cc

@ -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. */

6
storage/innobase/row/row0vers.cc

@ -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. */

33
storage/innobase/trx/trx0trx.cc

@ -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);
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()); 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->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 { } 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->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 { } 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->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. */ /* So that we can see our own changes. */
if (trx->read_view.is_open()) { if (trx->read_view.is_open()) {

Loading…
Cancel
Save