MDEV-15059 - Misc small InnoDB scalability fixes
Form better trx_sys API.
This commit is contained in:
parent
064bd78038
commit
55277e8840
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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));
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
@ -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) {
|
||||||
|
@ -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. */
|
||||||
|
@ -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. */
|
||||||
|
@ -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()) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user