Commit 15951892 authored by Marko Mäkelä's avatar Marko Mäkelä

MDEV-23897 SIGSEGV on commit with innodb_lock_schedule_algorithm=VATS

This regression for debug builds was introduced by
MDEV-23101 (commit 224c9504).

Due to MDEV-16664, the parameter
innodb_lock_schedule_algorithm=VATS
is not enabled by default.

The purpose of the added assertions was to enforce the invariant that
Galera replication cannot be enabled together with VATS due to MDEV-12837.
However, upon closer inspection, it is obvious that the variable 'lock'
may be assigned to the null pointer if no match is found in the
previous->hash list.

lock_grant_and_move_on_page(), lock_grant_and_move_on_rec():
Assert !lock->trx->is_wsrep() only after ensuring that lock
is not a null pointer.
parent 2b832151
[FCFS]
--innodb-lock-schedule-algorithm=FCFS
[VATS]
--innodb-lock-schedule-algorithm=VATS
...@@ -2306,12 +2306,12 @@ lock_grant_and_move_on_page(ulint rec_fold, ulint space, ulint page_no) ...@@ -2306,12 +2306,12 @@ lock_grant_and_move_on_page(ulint rec_fold, ulint space, ulint page_no)
lock = previous->hash; lock = previous->hash;
} }
ut_ad(!lock->trx->is_wsrep());
ut_ad(previous->hash == lock || previous == lock); ut_ad(previous->hash == lock || previous == lock);
/* Grant locks if there are no conflicting locks ahead. /* Grant locks if there are no conflicting locks ahead.
Move granted locks to the head of the list. */ Move granted locks to the head of the list. */
while (lock) { while (lock) {
/* If the lock is a wait lock on this page, and it does not need to wait. */ /* If the lock is a wait lock on this page, and it does not need to wait. */
ut_ad(!lock->trx->is_wsrep());
if (lock_get_wait(lock) if (lock_get_wait(lock)
&& lock->un_member.rec_lock.space == space && lock->un_member.rec_lock.space == space
&& lock->un_member.rec_lock.page_no == page_no && lock->un_member.rec_lock.page_no == page_no
...@@ -4211,11 +4211,10 @@ lock_grant_and_move_on_rec( ...@@ -4211,11 +4211,10 @@ lock_grant_and_move_on_rec(
} }
lock = previous->hash; lock = previous->hash;
} }
ut_ad(!lock->trx->is_wsrep());
/* Grant locks if there are no conflicting locks ahead. /* Grant locks if there are no conflicting locks ahead.
Move granted locks to the head of the list. */ Move granted locks to the head of the list. */
for (;lock != NULL;) { while (lock) {
ut_ad(!lock->trx->is_wsrep());
/* If the lock is a wait lock on this page, and it does not need to wait. */ /* If the lock is a wait lock on this page, and it does not need to wait. */
if (lock->un_member.rec_lock.space == space if (lock->un_member.rec_lock.space == space
&& lock->un_member.rec_lock.page_no == page_no && lock->un_member.rec_lock.page_no == page_no
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment