summaryrefslogtreecommitdiff
path: root/storage/innobase/lock/lock0prdt.cc
diff options
context:
space:
mode:
Diffstat (limited to 'storage/innobase/lock/lock0prdt.cc')
-rw-r--r--storage/innobase/lock/lock0prdt.cc68
1 files changed, 25 insertions, 43 deletions
diff --git a/storage/innobase/lock/lock0prdt.cc b/storage/innobase/lock/lock0prdt.cc
index 5a12d97411f..acf0a4be574 100644
--- a/storage/innobase/lock/lock0prdt.cc
+++ b/storage/innobase/lock/lock0prdt.cc
@@ -530,11 +530,13 @@ lock_prdt_insert_check_and_lock(
if (c_lock)
{
rtr_mbr_t *mbr= prdt_get_mbr_from_prdt(prdt);
+ prdt->op= 0;
trx->mutex_lock();
- /* Allocate MBR on the lock heap */
- lock_init_prdt_from_mbr(prdt, mbr, 0, trx->lock.lock_heap);
- err= lock_rec_enqueue_waiting(c_lock, mode, id, block->page.frame,
- PRDT_HEAPNO, index, thr, prdt);
+ prdt->data= mem_heap_dup(trx->lock.lock_heap, mbr, sizeof *mbr);
+ err= UNIV_UNLIKELY(!prdt->data)
+ ? DB_LOCK_TABLE_FULL
+ : lock_rec_enqueue_waiting(c_lock, mode, id, block->page.frame,
+ PRDT_HEAPNO, index, thr, prdt);
trx->mutex_unlock();
}
}
@@ -669,27 +671,6 @@ lock_prdt_update_split(
}
/*********************************************************************//**
-Initiate a Predicate Lock from a MBR */
-void
-lock_init_prdt_from_mbr(
-/*====================*/
- lock_prdt_t* prdt, /*!< in/out: predicate to initialized */
- rtr_mbr_t* mbr, /*!< in: Minimum Bounding Rectangle */
- ulint mode, /*!< in: Search mode */
- mem_heap_t* heap) /*!< in: heap for allocating memory */
-{
- memset(prdt, 0, sizeof(*prdt));
-
- if (heap != NULL) {
- prdt->data = mem_heap_dup(heap, mbr, sizeof *mbr);
- } else {
- prdt->data = static_cast<void*>(mbr);
- }
-
- prdt->op = static_cast<uint16>(mode);
-}
-
-/*********************************************************************//**
Acquire a predicate lock on a block
@return DB_SUCCESS, DB_LOCK_WAIT, or DB_DEADLOCK */
dberr_t
@@ -850,32 +831,33 @@ bool lock_test_prdt_page_lock(const trx_t *trx, const page_id_t page_id)
/*************************************************************//**
Moves the locks of a page to another page and resets the lock bits of
the donating records. */
-void
+dberr_t
lock_prdt_rec_move(
/*===============*/
const buf_block_t* receiver, /*!< in: buffer block containing
the receiving record */
const page_id_t donator) /*!< in: target page */
{
- LockMultiGuard g{lock_sys.prdt_hash, receiver->page.id(), donator};
-
- for (lock_t *lock = lock_sys_t::get_first(g.cell2(), donator,
- PRDT_HEAPNO);
- lock;
- lock = lock_rec_get_next(PRDT_HEAPNO, lock)) {
+ dberr_t err= DB_SUCCESS;
+ LockMultiGuard g{lock_sys.prdt_hash, receiver->page.id(), donator};
- const auto type_mode = lock->type_mode;
- lock_prdt_t* lock_prdt = lock_get_prdt_from_lock(lock);
+ for (lock_t *lock= lock_sys_t::get_first(g.cell2(), donator, PRDT_HEAPNO);
+ lock; lock= lock_rec_get_next(PRDT_HEAPNO, lock))
+ {
+ const auto type_mode= lock->type_mode;
+ lock_prdt_t *lock_prdt= lock_get_prdt_from_lock(lock);
- lock_rec_reset_nth_bit(lock, PRDT_HEAPNO);
- if (type_mode & LOCK_WAIT) {
- ut_ad(lock->trx->lock.wait_lock == lock);
- lock->type_mode &= ~LOCK_WAIT;
- }
- lock_prdt_add_to_queue(
- type_mode, receiver, lock->index, lock->trx,
- lock_prdt, false);
- }
+ lock_rec_reset_nth_bit(lock, PRDT_HEAPNO);
+ if (type_mode & LOCK_WAIT)
+ {
+ ut_ad(lock->trx->lock.wait_lock == lock);
+ lock->type_mode&= ~LOCK_WAIT;
+ }
+ if (!lock_prdt_add_to_queue(type_mode, receiver, lock->index, lock->trx,
+ lock_prdt, false))
+ err= DB_LOCK_TABLE_FULL;
+ }
+ return err;
}
/** Remove locks on a discarded SPATIAL INDEX page.