summaryrefslogtreecommitdiff
path: root/storage/innobase/lock/lock0prdt.cc
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2018-03-11 23:34:23 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2018-03-16 15:50:04 +0200
commitbd7ed1b923e8ddd896103d73461c4313a175cca6 (patch)
treef7309f0a96715fe8582949820360bfc0dbb21b56 /storage/innobase/lock/lock0prdt.cc
parente15e879fae949a05de549a6676ae66d4f7f8c566 (diff)
downloadmariadb-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.cc62
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);