• Konstantin Osipov's avatar
    Apply and review: · 3b311f39
    Konstantin Osipov authored
    3655 Jon Olav Hauglid   2009-10-19
    Bug #30977 Concurrent statement using stored function and DROP FUNCTION 
               breaks SBR
    Bug #48246 assert in close_thread_table
    
    Implement a fix for:
    Bug #41804 purge stored procedure cache causes mysterious hang for many
               minutes
    Bug #49972 Crash in prepared statements
    
    The problem was that concurrent execution of DML statements that
    use stored functions and DDL statements that drop/modify the same
    function might result in incorrect binary log in statement (and
    mixed) mode and therefore break replication.
    
    This patch fixes the problem by introducing metadata locking for
    stored procedures and functions. This is similar to what is done
    in Bug#25144 for views. Procedures and functions now are
    locked using metadata locks until the transaction is either
    committed or rolled back. This prevents other statements from
    modifying the procedure/function while it is being executed. This
    provides commit ordering - guaranteeing serializability across
    multiple transactions and thus fixes the reported binlog problem.
    
    Note that we do not take locks for top-level CALLs. This means
    that procedures called directly are not protected from changes by
    simultaneous DDL operations so they are executed at the state they
    had at the time of the CALL. By not taking locks for top-level
    CALLs, we still allow transactions to be started inside
    procedures.
    
    This patch also changes stored procedure cache invalidation.
    Upon a change of cache version, we no longer invalidate the entire
    cache, but only those routines which we use, only when a statement
    is executed that uses them.
    
    This patch also changes the logic of prepared statement validation.
    A stored procedure used by a prepared statement is now validated
    only once a metadata lock has been acquired. A version mismatch
    causes a flush of the obsolete routine from the cache and
    statement reprepare.
    Incompatible changes:
    1) ER_LOCK_DEADLOCK is reported for a transaction trying to access
       a procedure/function that is locked by a DDL operation in
       another connection.
    
    2) Procedure/function DDL operations are now prohibited in LOCK
       TABLES mode as exclusive locks must be taken all at once and
       LOCK TABLES provides no way to specifiy procedures/functions to
       be locked.
    
    Test cases have been added to sp-lock.test and rpl_sp.test.
    
    Work on this bug has very much been a team effort and this patch
    includes and is based on contributions from Davi Arnaut, Dmitry
    Lenev, Magne Mæhre and Konstantin Osipov.
    3b311f39
sql_update.cc 65.5 KB