summaryrefslogtreecommitdiff
path: root/sql/mdl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/mdl.cc')
-rw-r--r--sql/mdl.cc34
1 files changed, 19 insertions, 15 deletions
diff --git a/sql/mdl.cc b/sql/mdl.cc
index 9eeb82eeffd..8d6780671d1 100644
--- a/sql/mdl.cc
+++ b/sql/mdl.cc
@@ -14,6 +14,7 @@
51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
+#include "mariadb.h"
#include "sql_class.h"
#include "debug_sync.h"
#include "sql_array.h"
@@ -84,6 +85,7 @@ PSI_stage_info MDL_key::m_namespace_to_wait_state_name[NAMESPACE_END]=
{0, "Waiting for table metadata lock", 0},
{0, "Waiting for stored function metadata lock", 0},
{0, "Waiting for stored procedure metadata lock", 0},
+ {0, "Waiting for stored package body metadata lock", 0},
{0, "Waiting for trigger metadata lock", 0},
{0, "Waiting for event metadata lock", 0},
{0, "Waiting for commit lock", 0},
@@ -2086,6 +2088,14 @@ MDL_context::acquire_lock(MDL_request *mdl_request, double lock_wait_timeout)
*/
lock= ticket->m_lock;
+ if (lock_wait_timeout == 0)
+ {
+ mysql_prlock_unlock(&lock->m_rwlock);
+ MDL_ticket::destroy(ticket);
+ my_error(ER_LOCK_WAIT_TIMEOUT, MYF(0));
+ DBUG_RETURN(TRUE);
+ }
+
lock->m_waiting.add_ticket(ticket);
/*
@@ -2110,11 +2120,11 @@ MDL_context::acquire_lock(MDL_request *mdl_request, double lock_wait_timeout)
the parallel replication scheduler should never schedule a DDL while
DML's are still running.
*/
- DBUG_ASSERT((mdl_request->type != MDL_INTENTION_EXCLUSIVE &&
- mdl_request->type != MDL_EXCLUSIVE) ||
- !(get_thd()->rgi_slave &&
- get_thd()->rgi_slave->is_parallel_exec &&
- lock->check_if_conflicting_replication_locks(this)));
+ DBUG_SLOW_ASSERT((mdl_request->type != MDL_INTENTION_EXCLUSIVE &&
+ mdl_request->type != MDL_EXCLUSIVE) ||
+ !(get_thd()->rgi_slave &&
+ get_thd()->rgi_slave->is_parallel_exec &&
+ lock->check_if_conflicting_replication_locks(this)));
mysql_prlock_unlock(&lock->m_rwlock);
@@ -2320,13 +2330,6 @@ MDL_context::upgrade_shared_lock(MDL_ticket *mdl_ticket,
if (mdl_ticket->has_stronger_or_equal_type(new_type))
DBUG_RETURN(FALSE);
- /* Only allow upgrades from UPGRADABLE/NO_WRITE/NO_READ_WRITE/READ/WRITE */
- DBUG_ASSERT(mdl_ticket->m_type == MDL_SHARED_UPGRADABLE ||
- mdl_ticket->m_type == MDL_SHARED_NO_WRITE ||
- mdl_ticket->m_type == MDL_SHARED_NO_READ_WRITE ||
- mdl_ticket->m_type == MDL_SHARED_READ ||
- mdl_ticket->m_type == MDL_SHARED_WRITE);
-
mdl_xlock_request.init(&mdl_ticket->m_lock->key, new_type,
MDL_TRANSACTION);
@@ -2642,7 +2645,7 @@ void MDL_context::release_lock(enum_mdl_duration duration, MDL_ticket *ticket)
void MDL_context::release_lock(MDL_ticket *ticket)
{
- DBUG_ASSERT(ticket->m_duration == MDL_EXPLICIT);
+ DBUG_SLOW_ASSERT(ticket->m_duration == MDL_EXPLICIT);
release_lock(MDL_EXPLICIT, ticket);
}
@@ -2902,8 +2905,8 @@ bool MDL_context::has_lock(const MDL_savepoint &mdl_savepoint,
void MDL_context::set_lock_duration(MDL_ticket *mdl_ticket,
enum_mdl_duration duration)
{
- DBUG_ASSERT(mdl_ticket->m_duration == MDL_TRANSACTION &&
- duration != MDL_TRANSACTION);
+ DBUG_SLOW_ASSERT(mdl_ticket->m_duration == MDL_TRANSACTION &&
+ duration != MDL_TRANSACTION);
m_tickets[MDL_TRANSACTION].remove(mdl_ticket);
m_tickets[duration].push_front(mdl_ticket);
@@ -3041,6 +3044,7 @@ const char *wsrep_get_mdl_namespace_name(MDL_key::enum_mdl_namespace ns)
case MDL_key::TABLE : return "TABLE";
case MDL_key::FUNCTION : return "FUNCTION";
case MDL_key::PROCEDURE : return "PROCEDURE";
+ case MDL_key::PACKAGE_BODY: return "PACKAGE BODY";
case MDL_key::TRIGGER : return "TRIGGER";
case MDL_key::EVENT : return "EVENT";
case MDL_key::COMMIT : return "COMMIT";