Bug #69576 | Wasted work in method lock_rec_other_has_expl_req() | ||
---|---|---|---|
Submitted: | 25 Jun 2013 21:23 | Modified: | 8 Jan 2014 18:59 |
Reporter: | Po-Chun Chang (OCA) | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | MySQL Server: InnoDB storage engine | Severity: | S5 (Performance) |
Version: | 5.6, 5.7 | OS: | Any |
Assigned to: | CPU Architecture: | Any | |
Tags: | patch, performance |
[25 Jun 2013 21:23]
Po-Chun Chang
[25 Jun 2013 21:23]
Po-Chun Chang
Suggested patch (*) I confirm the code being submitted is offered under the terms of the OCA, and that I am authorized to contribute it.
Contribution: patch.diff (text/plain), 1.09 KiB.
[26 Jun 2013 11:16]
MySQL Verification Team
Thank you for the report and contribution.
[26 Jun 2013 23:05]
Sunny Bains
gap is always passed in as 0 by all the callers of lock_rec_other_has_expl_req(). We can simply remove gap. This is debug code and therefore not important as such for performance. A more complete fix would look like: === modified file 'storage/innobase/lock/lock0lock.cc' --- storage/innobase/lock/lock0lock.cc revid:vasil.dimov@oracle.com-20130618141427-ceqchpd34zgaheao +++ storage/innobase/lock/lock0lock.cc 2013-06-26 22:58:26 +0000 @@ -1528,9 +1528,6 @@ const lock_t* lock_rec_other_has_expl_req( /*========================*/ enum lock_mode mode, /*!< in: LOCK_S or LOCK_X */ - ulint gap, /*!< in: LOCK_GAP if also gap - locks are taken into account, - or 0 if not */ ulint wait, /*!< in: LOCK_WAIT if also waiting locks are taken into account, or 0 if not */ @@ -1541,21 +1538,20 @@ lock_rec_other_has_expl_req( requests by all transactions are taken into account */ { - const lock_t* lock; - ut_ad(lock_mutex_own()); ut_ad(mode == LOCK_X || mode == LOCK_S); - ut_ad(gap == 0 || gap == LOCK_GAP); ut_ad(wait == 0 || wait == LOCK_WAIT); - for (lock = lock_rec_get_first(block, heap_no); + if (heap_no == PAGE_HEAP_NO_SUPREMUM) { + return(NULL); + } + + for (const lock_t* lock = lock_rec_get_first(block, heap_no); lock != NULL; lock = lock_rec_get_next_const(heap_no, lock)) { if (lock->trx != trx - && (gap - || !(lock_rec_get_gap(lock) - || heap_no == PAGE_HEAP_NO_SUPREMUM)) + && !lock_rec_get_gap(lock) && (wait || !lock_get_wait(lock)) && lock_mode_stronger_or_eq(lock_get_mode(lock), mode)) { @@ -2006,7 +2002,7 @@ lock_rec_add_to_queue( ? LOCK_X : LOCK_S; const lock_t* other_lock - = lock_rec_other_has_expl_req(mode, 0, LOCK_WAIT, + = lock_rec_other_has_expl_req(mode, LOCK_WAIT, block, heap_no, trx); ut_a(!other_lock); } @@ -5565,7 +5561,7 @@ lock_rec_queue_validate( because lock_trx_release_locks() acquires lock_sys->mutex */ if (impl_trx != NULL - && lock_rec_other_has_expl_req(LOCK_S, 0, LOCK_WAIT, + && lock_rec_other_has_expl_req(LOCK_S, LOCK_WAIT, block, heap_no, impl_trx)) { ut_a(lock_rec_has_expl(LOCK_X | LOCK_REC_NOT_GAP, @@ -5593,7 +5589,7 @@ lock_rec_queue_validate( mode = LOCK_S; } ut_a(!lock_rec_other_has_expl_req( - mode, 0, 0, block, heap_no, lock->trx)); + mode, 0, block, heap_no, lock->trx)); } else if (lock_get_wait(lock) && !lock_rec_get_gap(lock)) {
[8 Jan 2014 18:59]
Daniel Price
Fixed as of 5.7.4, and here's the changelog entry: The "lock_rec_other_has_expl_req" function in "lock0lock.cc" would perform unnecessary work. Thank you for the bug report.