summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorMichael Widenius <monty@askmonty.org>2013-01-10 23:40:18 +0200
committerMichael Widenius <monty@askmonty.org>2013-01-10 23:40:18 +0200
commit396f4d62c69335b8f7aefd43bbe099e8bb9e6905 (patch)
treea89563c90889e0e94cac96411bb51342204ec265 /sql
parentf6d22b3915dc930ef9d33cbfa33ed28fd6484b7f (diff)
downloadmariadb-git-396f4d62c69335b8f7aefd43bbe099e8bb9e6905.tar.gz
Fix for MDEV-4009: main.delayed sporadically fails with "query 'REPLACE DELAYED t1 VALUES (5)' failed: 1317: Query execution was interrupted"
- Fixed broadcast without a proper mutex - Don't break existing locks if we are just testing if we can get the lock mysql-test/r/create_delayed.result: Added test case for failures with INSERT DELAYED with CREATE and DROP TABLE mysql-test/t/create_delayed.test: Added test case for failures with INSERT DELAYED with CREATE and DROP TABLE sql/mdl.cc: Don't break existing locks for timeout=0 (ie, just check if there are conflicting locks). This fixed the bug that INSERT DELAYED didn't work properly with CREATE TABLE sql/sql_base.cc: One neads to hold the mutex before doing a mysql_cond_broadcast() This fixed the bug that INSERT DELAYED didn't work properly with DROP TABLE sql/sql_insert.cc: Protect setting of mysys_var->current_mutex.
Diffstat (limited to 'sql')
-rw-r--r--sql/mdl.cc6
-rw-r--r--sql/sql_base.cc4
-rw-r--r--sql/sql_insert.cc4
3 files changed, 13 insertions, 1 deletions
diff --git a/sql/mdl.cc b/sql/mdl.cc
index 5e297051377..a2113909116 100644
--- a/sql/mdl.cc
+++ b/sql/mdl.cc
@@ -2078,7 +2078,11 @@ MDL_context::acquire_lock(MDL_request *mdl_request, ulong lock_wait_timeout)
*/
m_wait.reset_status();
- if (lock->needs_notification(ticket))
+ /*
+ Don't break conflicting locks if timeout is 0 as 0 is used
+ To check if there is any conflicting locks...
+ */
+ if (lock->needs_notification(ticket) && lock_wait_timeout)
lock->notify_conflicting_locks(this);
mysql_prlock_unlock(&lock->m_rwlock);
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index c7f93c955f3..83ed29064b5 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -9299,7 +9299,11 @@ bool mysql_notify_thread_having_shared_lock(THD *thd, THD *in_use,
in_use->killed= KILL_SYSTEM_THREAD;
mysql_mutex_lock(&in_use->mysys_var->mutex);
if (in_use->mysys_var->current_cond)
+ {
+ mysql_mutex_lock(in_use->mysys_var->current_mutex);
mysql_cond_broadcast(in_use->mysys_var->current_cond);
+ mysql_mutex_unlock(in_use->mysys_var->current_mutex);
+ }
mysql_mutex_unlock(&in_use->mysys_var->mutex);
signalled= TRUE;
}
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index 231671d172b..f18a9548704 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -2823,8 +2823,12 @@ pthread_handler_t handle_delayed_insert(void *arg)
set_timespec(abstime, delayed_insert_timeout);
/* Information for pthread_kill */
+ mysql_mutex_unlock(&di->mutex);
+ mysql_mutex_lock(&di->thd.mysys_var->mutex);
di->thd.mysys_var->current_mutex= &di->mutex;
di->thd.mysys_var->current_cond= &di->cond;
+ mysql_mutex_unlock(&di->thd.mysys_var->mutex);
+ mysql_mutex_lock(&di->mutex);
thd_proc_info(&(di->thd), "Waiting for INSERT");
DBUG_PRINT("info",("Waiting for someone to insert rows"));