• Alexander Nozdrin's avatar
    Patch for Bug#52356: query_cache_debug fails on Linux. · c784ee27
    Alexander Nozdrin authored
    There were two problems here:
      1. misleading error message
      2. abusing KILL QUERY in the test case
    
    1. The server reported "'DELETE FROM t1' failed: 1689: Wait on a lock was
    aborted due to a pending exclusive lock", while the proper error message
    should be "'DELETE FROM t1' failed: 1317: Query execution was interrupted".
    
    The problem is that the server has two different flags for
    signalling that a query is being killed: THD::killed and
    mysys_var::abort. The test case triggers a race: sometimes
    mysys_var::abort is set earlier than THD::killed. That leads
    to the following situation:
    
      - thr_lock() checks mysys_var::abort and returns error status,
        since mysys_var::abort is set;
    
      - the caller (mysql_lock_tables()) gets an error from thr_lock(),
        but THD::killed is not set, so it decides that thr_lock() couldn't
        get a lock due to a pending exclusive lock.
    
    This is a known issue with the server and it's not going to be fixed soon.
    
    5.5 differs from 5.1 here as follows: when thr_lock() returns an error:
      - 5.1 continues trying thr_lock() until success;
      - 5.5 propagates the error
    
    2. The test case uses KILL QUERY is a highly concurent environment.
    
    The fix is to wait for the dying statement to rest in peace before
    executing another DELETE FROM t1.
    c784ee27
query_cache_debug.test 9.71 KB