@ -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, autocommit: %d",
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 *thd, char *sql, uint query_length)
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 )