From: Kristofer Pettersson Date: November 20 2009 12:49pm Subject: bzr commit into mysql-5.1-bugteam branch (kristofer.pettersson:3191) Bug#21074 Bug#39253 List-Archive: http://lists.mysql.com/commits/91071 X-Bug: 21074,39253 Message-Id: <0KTE00LX8RM57N90@fe-emea-09.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_WiIT8YZ0hb0RCdlE2iCNmQ)" --Boundary_(ID_WiIT8YZ0hb0RCdlE2iCNmQ) MIME-version: 1.0 Content-type: text/plain; CHARSET=US-ASCII Content-transfer-encoding: 7BIT Content-disposition: inline #At file:///Users/thek/Development/mysql-5.1-qc/ based on revid:kristofer.pettersson@stripped 3191 Kristofer Pettersson 2009-11-20 Bug#39253 Large query cache still freezes server after fix for bug #21074 This patch introduce a limit on the time the query cache can block with a lock on SELECTs. Other operations which causes a change in the table data will still be blocked. @ sql/sql_cache.cc * Introduced a timeout value for the qc lock when entering send_result_to_client() and store_query() methods. @ sql/sql_cache.h * New signature for Query_cache::try_lock() modified: sql/sql_cache.cc sql/sql_cache.h === modified file 'sql/sql_cache.cc' --- a/sql/sql_cache.cc 2009-10-16 10:29:42 +0000 +++ b/sql/sql_cache.cc 2009-11-20 12:49:06 +0000 @@ -421,12 +421,16 @@ TYPELIB query_cache_type_typelib= effect by another thread. This enables a quick path in execution to skip waits when the outcome is known. + @param use_timeout TRUE if the lock can abort because of a timeout. + + @note use_timeout is optional and default value is FALSE. + @return @retval FALSE An exclusive lock was taken @retval TRUE The locking attempt failed */ -bool Query_cache::try_lock(void) +bool Query_cache::try_lock(bool use_timeout) { bool interrupt= FALSE; DBUG_ENTER("Query_cache::try_lock"); @@ -456,7 +460,26 @@ bool Query_cache::try_lock(void) else { DBUG_ASSERT(m_cache_lock_status == Query_cache::LOCKED); - pthread_cond_wait(&COND_cache_status_changed, &structure_guard_mutex); + /* + To prevent send_result_to_client() and query_cache_insert() from + blocking execution for too long a timeout is put on the lock. + */ + if (use_timeout) + { + struct timespec waittime; + set_timespec_nsec(waittime,(ulong)(50000000L)); /* Wait for 50 msec */ + int res= pthread_cond_timedwait(&COND_cache_status_changed, + &structure_guard_mutex,&waittime); + if (res == ETIMEDOUT) + { + interrupt= TRUE; + break; + } + } + else + { + pthread_cond_wait(&COND_cache_status_changed, &structure_guard_mutex); + } } } pthread_mutex_unlock(&structure_guard_mutex); @@ -1190,8 +1213,14 @@ def_week_frmt: %lu, in_trans: %d, autoco A table- or a full flush operation can potentially take a long time to finish. We choose not to wait for them and skip caching statements instead. + + In case the wait time can't be determined there is an upper limit which + causes try_lock() to abort with a time out. + + The 'TRUE' parameter indicate that the lock is allowed to timeout + */ - if (try_lock()) + if (try_lock(TRUE)) DBUG_VOID_RETURN; if (query_cache_size == 0) { @@ -1385,8 +1414,10 @@ Query_cache::send_result_to_client(THD * Try to obtain an exclusive lock on the query cache. If the cache is disabled or if a full cache flush is in progress, the attempt to get the lock is aborted. + + The 'TRUE' parameter indicate that the lock is allowed to timeout */ - if (try_lock()) + if (try_lock(TRUE)) goto err; if (query_cache_size == 0) === modified file 'sql/sql_cache.h' --- a/sql/sql_cache.h 2009-06-16 08:34:47 +0000 +++ b/sql/sql_cache.h 2009-11-20 12:49:06 +0000 @@ -485,7 +485,7 @@ protected: const char *name); my_bool in_blocks(Query_cache_block * point); - bool try_lock(void); + bool try_lock(bool use_timeout= FALSE); void lock(void); void lock_and_suspend(void); void unlock(void); --Boundary_(ID_WiIT8YZ0hb0RCdlE2iCNmQ) MIME-version: 1.0 Content-type: text/bzr-bundle; CHARSET=US-ASCII; name*0="bzr/kristofer.pettersson@stripped"; name*1=0124906-7t2agae16bblw9dg.bundle Content-transfer-encoding: 7BIT Content-disposition: inline; filename*0="bzr/kristofer.pettersson@stripped"; filename*1=0124906-7t2agae16bblw9dg.bundle # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: kristofer.pettersson@stripped\ # 7t2agae16bblw9dg # target_branch: file:///Users/thek/Development/mysql-5.1-qc/ # testament_sha1: 43156708a1602c6db42ad43fe1662871e2a8d52a # timestamp: 2009-11-20 13:49:16 +0100 # base_revision_id: kristofer.pettersson@stripped\ # xvwgsdqiyuve6frt # # Begin bundle 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 Zm7GVgA= --Boundary_(ID_WiIT8YZ0hb0RCdlE2iCNmQ)--