diff options
author | Konstantin Osipov <kostja@sun.com> | 2009-12-03 23:08:27 +0300 |
---|---|---|
committer | Konstantin Osipov <kostja@sun.com> | 2009-12-03 23:08:27 +0300 |
commit | cd155be564a6e42c3a08781ba0d30458e241cdf0 (patch) | |
tree | 6434d16875915e179a140a010c01bc095562ddc8 /mysys/thr_lock.c | |
parent | f9f2bd193f934c8e2904688335f5103472391b1b (diff) | |
download | mariadb-git-cd155be564a6e42c3a08781ba0d30458e241cdf0.tar.gz |
Backport of:
------------------------------------------------------------
revno: 3035.4.1
committer: Davi Arnaut <Davi.Arnaut@Sun.COM>
branch nick: 39897-6.0
timestamp: Thu 2009-01-15 12:17:57 -0200
message:
Bug#39897: lock_multi fails in pushbuild: timeout waiting for processlist
The problem is that relying on the "Table lock" thread state in
its current position to detect that a thread is waiting on a lock
is race prone. The "Table lock" state change happens before the
thread actually tries to grab a lock on a table.
The solution is to move the "Table lock" state so that its set
only when a thread is actually going to wait for a lock. The state
change happens after the thread fails to grab the lock (because it
is owned by other thread) and proceeds to wait on a condition.
This is considered part of work related to WL#4284 "Transactional
DDL locking"
Warning: this patch contains an incompatible change.
When waiting on a lock in thr_lock.c, the server used to display "Locked"
processlist state. After this patch, the state is "Table lock".
The new state was actually intended to be display since year 2002,
when Monty added it. But up until removal of thd->locked boolean
member, this state was ignored by SHOW PROCESSLIST code.
mysql-test/r/lock_multi.result:
A style fix.
mysql-test/r/sp-threads.result:
Changed output of SHOW PROCESSLIST (new wait state).
mysql-test/t/lock_multi.test:
Use a more accurate state description when waiting inside thr_lock.c.
mysql-test/t/lock_sync.test:
Use a more accurate state description when waiting inside thr_lock.c.
mysql-test/t/multi_update.test:
Use a more accurate state description when waiting inside thr_lock.c.
mysql-test/t/query_cache_28249.test:
Use a more accurate state description when waiting inside thr_lock.c.
mysql-test/t/sp_notembedded.test:
Use a more accurate state description when waiting inside thr_lock.c.
mysql-test/t/status.test:
Use a more accurate state description when waiting inside thr_lock.c.
mysys/thr_lock.c:
Update thread state while waiting for a table lock.
sql/lock.cc:
State change was moved inside thr_lock.c.
Diffstat (limited to 'mysys/thr_lock.c')
-rw-r--r-- | mysys/thr_lock.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/mysys/thr_lock.c b/mysys/thr_lock.c index e92f68965d8..6433c04a96f 100644 --- a/mysys/thr_lock.c +++ b/mysys/thr_lock.c @@ -396,6 +396,7 @@ wait_for_lock(struct st_lock_list *wait, THR_LOCK_DATA *data, struct timespec wait_timeout; enum enum_thr_lock_result result= THR_LOCK_ABORTED; my_bool can_deadlock= test(data->owner->info->n_cursors); + const char *old_proc_info; DBUG_ENTER("wait_for_lock"); /* @@ -434,6 +435,9 @@ wait_for_lock(struct st_lock_list *wait, THR_LOCK_DATA *data, thread_var->current_cond= cond; data->cond= cond; + old_proc_info= proc_info_hook(NULL, "Table lock", + __func__, __FILE__, __LINE__); + if (can_deadlock) set_timespec(wait_timeout, table_lock_wait_timeout); while (!thread_var->abort || in_wait_list) @@ -504,6 +508,9 @@ wait_for_lock(struct st_lock_list *wait, THR_LOCK_DATA *data, thread_var->current_mutex= 0; thread_var->current_cond= 0; pthread_mutex_unlock(&thread_var->mutex); + + proc_info_hook(NULL, old_proc_info, __func__, __FILE__, __LINE__); + DBUG_RETURN(result); } |