summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--storage/innobase/include/lock0lock.h7
-rw-r--r--storage/innobase/lock/lock0lock.cc6
-rw-r--r--storage/innobase/lock/lock0prdt.cc3
3 files changed, 12 insertions, 4 deletions
diff --git a/storage/innobase/include/lock0lock.h b/storage/innobase/include/lock0lock.h
index 9607d9b42a7..f81d7c65b84 100644
--- a/storage/innobase/include/lock0lock.h
+++ b/storage/innobase/include/lock0lock.h
@@ -898,7 +898,12 @@ struct LockMutexGuard
struct LockGuard
{
LockGuard(lock_sys_t::hash_table &hash, const page_id_t id);
- ~LockGuard() { lock_sys.rd_unlock(); latch->release(); }
+ ~LockGuard()
+ {
+ latch->release();
+ /* Must be last, to avoid a race with lock_sys_t::hash_table::resize() */
+ lock_sys.rd_unlock();
+ }
private:
/** The hash bucket */
lock_sys_t::hash_latch *latch;
diff --git a/storage/innobase/lock/lock0lock.cc b/storage/innobase/lock/lock0lock.cc
index 30ecc913cc5..2e82efe52c9 100644
--- a/storage/innobase/lock/lock0lock.cc
+++ b/storage/innobase/lock/lock0lock.cc
@@ -210,8 +210,9 @@ LockGGuard::~LockGGuard()
lock_sys.wr_unlock();
else
{
- lock_sys.rd_unlock();
latch->release();
+ /* Must be last, to avoid a race with lock_sys_t::hash_table::resize() */
+ lock_sys.rd_unlock();
}
}
#endif
@@ -233,10 +234,11 @@ LockMultiGuard::LockMultiGuard(lock_sys_t::hash_table &hash,
LockMultiGuard::~LockMultiGuard()
{
- lock_sys.rd_unlock();
latch1->release();
if (latch1 != latch2)
latch2->release();
+ /* Must be last, to avoid a race with lock_sys_t::hash_table::resize() */
+ lock_sys.rd_unlock();
}
/** Pretty-print a table lock.
diff --git a/storage/innobase/lock/lock0prdt.cc b/storage/innobase/lock/lock0prdt.cc
index 13f7b092e9d..cb6dde162ce 100644
--- a/storage/innobase/lock/lock0prdt.cc
+++ b/storage/innobase/lock/lock0prdt.cc
@@ -932,6 +932,7 @@ void lock_sys_t::prdt_page_free_from_discard(const page_id_t id, bool all)
lock_rec_discard(rec_hash, lock);
}
- rd_unlock();
latch->release();
+ /* Must be last, to avoid a race with lock_sys_t::hash_table::resize() */
+ rd_unlock();
}