diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2018-03-11 23:34:23 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2018-03-16 15:50:04 +0200 |
commit | bd7ed1b923e8ddd896103d73461c4313a175cca6 (patch) | |
tree | f7309f0a96715fe8582949820360bfc0dbb21b56 /storage/innobase/lock/lock0prdt.cc | |
parent | e15e879fae949a05de549a6676ae66d4f7f8c566 (diff) | |
download | mariadb-git-bd7ed1b923e8ddd896103d73461c4313a175cca6.tar.gz |
MDEV-13935 INSERT stuck at state Unlocking tables
Revert the dead code for MySQL 5.7 multi-master replication (GCS),
also known as
WL#6835: InnoDB: GCS Replication: Deterministic Deadlock Handling
(High Prio Transactions in InnoDB).
Also, make innodb_lock_schedule_algorithm=vats skip SPATIAL INDEX,
because the code does not seem to be compatible with them.
Add FIXME comments to some SPATIAL INDEX locking code. It looks
like Galera write-set replication might not work with SPATIAL INDEX.
Diffstat (limited to 'storage/innobase/lock/lock0prdt.cc')
-rw-r--r-- | storage/innobase/lock/lock0prdt.cc | 62 |
1 files changed, 39 insertions, 23 deletions
diff --git a/storage/innobase/lock/lock0prdt.cc b/storage/innobase/lock/lock0prdt.cc index f6859b70297..23a46a002be 100644 --- a/storage/innobase/lock/lock0prdt.cc +++ b/storage/innobase/lock/lock0prdt.cc @@ -38,6 +38,7 @@ Created 9/7/2013 Jimmy Yang #include "ut0vec.h" #include "btr0btr.h" #include "dict0boot.h" +#include "que0que.h" #include <set> /*********************************************************************//** @@ -495,9 +496,18 @@ lock_prdt_add_to_queue( } } - RecLock rec_lock(index, block, PRDT_HEAPNO, type_mode); + lock = lock_rec_create( +#ifdef WITH_WSREP + NULL, NULL, /* FIXME: replicate SPATIAL INDEX locks */ +#endif + type_mode, block, PRDT_HEAPNO, index, trx, + caller_owns_trx_mutex); - return(rec_lock.create(trx, caller_owns_trx_mutex, true, prdt)); + if (lock->type_mode & LOCK_PREDICATE) { + lock_prdt_set_prdt(lock, prdt); + } + + return lock; } /*********************************************************************//** @@ -565,7 +575,7 @@ lock_prdt_insert_check_and_lock( const ulint mode = LOCK_X | LOCK_PREDICATE | LOCK_INSERT_INTENTION; - lock_t* wait_for = lock_prdt_other_has_conflicting( + const lock_t* wait_for = lock_prdt_other_has_conflicting( mode, block, prdt, trx); if (wait_for != NULL) { @@ -574,16 +584,17 @@ lock_prdt_insert_check_and_lock( /* Allocate MBR on the lock heap */ lock_init_prdt_from_mbr(prdt, mbr, 0, trx->lock.lock_heap); - RecLock rec_lock(thr, index, block, PRDT_HEAPNO, mode); - /* Note that we may get DB_SUCCESS also here! */ - trx_mutex_enter(trx); - err = rec_lock.add_to_waitq(wait_for, prdt); + err = lock_rec_enqueue_waiting( +#ifdef WITH_WSREP + NULL, /* FIXME: replicate SPATIAL INDEX locks */ +#endif + LOCK_X | LOCK_PREDICATE | LOCK_INSERT_INTENTION, + block, PRDT_HEAPNO, index, thr, prdt); trx_mutex_exit(trx); - } else { err = DB_SUCCESS; } @@ -831,13 +842,14 @@ lock_prdt_lock( lock_t* lock = lock_rec_get_first_on_page(hash, block); if (lock == NULL) { - - RecLock rec_lock(index, block, PRDT_HEAPNO, prdt_mode); - - lock = rec_lock.create(trx, false, true); + lock = lock_rec_create( +#ifdef WITH_WSREP + NULL, NULL, /* FIXME: replicate SPATIAL INDEX locks */ +#endif + mode | type_mode, block, PRDT_HEAPNO, + index, trx, FALSE); status = LOCK_REC_SUCCESS_CREATED; - } else { trx_mutex_enter(trx); @@ -861,12 +873,14 @@ lock_prdt_lock( if (wait_for != NULL) { - RecLock rec_lock( - thr, index, block, PRDT_HEAPNO, - prdt_mode, prdt); - - err = rec_lock.add_to_waitq(wait_for); - + err = lock_rec_enqueue_waiting( +#ifdef WITH_WSREP + NULL, /* FIXME: replicate + SPATIAL INDEX locks */ +#endif + mode | type_mode, + block, PRDT_HEAPNO, + index, thr, prdt); } else { lock_prdt_add_to_queue( @@ -947,10 +961,12 @@ lock_place_prdt_page_lock( } if (lock == NULL) { - RecID rec_id(space, page_no, PRDT_HEAPNO); - RecLock rec_lock(index, rec_id, mode); - - rec_lock.create(trx, false, true); + lock = lock_rec_create_low( +#ifdef WITH_WSREP + NULL, NULL, /* FIXME: replicate SPATIAL INDEX locks */ +#endif + mode, space, page_no, NULL, PRDT_HEAPNO, + index, trx, FALSE); #ifdef PRDT_DIAG printf("GIS_DIAGNOSTIC: page lock %d\n", (int) page_no); |