• Konstantin Osipov's avatar
    Backport of: · 1b34d593
    Konstantin Osipov authored
    ------------------------------------------------------------
    revno: 2476.784.3
    committer: davi@moksha.local
    timestamp: Tue 2007-10-02 21:27:31 -0300
    message:
    Bug#25858 Some DROP TABLE under LOCK TABLES can cause deadlocks
            
    When a client (connection) holds a lock on a table and attempts to
    drop (obtain a exclusive lock) on a second table that is already
    held by a second client and the second client then attempts to
    drop the table that is held by the first client, leads to a
    circular wait deadlock. This scenario is very similar to trying to
    drop (or rename) a table while holding read locks and are
    correctly forbidden.
            
    The solution is to allow a drop table operation to continue only
    if the table being dropped is write (exclusively) locked, or if
    the table is temporary, or if the client is not holding any
    locks. Using this scheme prevents the creation of a circular
    chain in which each client is waiting for one table that the
    next client in the chain is holding.
                
    This is incompatible change, as can be seen by number of tests
    cases that needed to be fixed, but is consistent with respect to
    behavior of the different scenarios in which the circular wait
    might happen.
    
    mysql-test/r/drop.result:
      Test case result for Bug#25858
    mysql-test/r/group_by.result:
      Fix test case result wrt drop table under lock tables -- unlock tables
      before dropping table.
    mysql-test/r/insert_notembedded.result:
      Fix test case result wrt drop table under lock tables -- unlock tables
      before dropping table
    mysql-test/r/lock.result:
      Fix test case result wrt drop table under lock tables -- unlock tables
      before dropping table.
    mysql-test/r/lock_multi.result:
      Fix test case result wrt drop table under lock tables -- unlock tables
      before dropping table.
    mysql-test/r/myisam.result:
      Fix test case result wrt drop table under lock tables -- unlock tables
      before dropping table.
    mysql-test/r/view.result:
      Fix test case result wrt drop table under lock tables -- unlock tables
      before dropping table.
    mysql-test/t/drop.test:
      Add test case for Bug#25858
    mysql-test/t/group_by.test:
      Fix test case: unlock tables in preparation for a drop table. In some
      circumstances, dropping tables while holding locks leads to a deadlock.
    mysql-test/t/insert_notembedded.test:
      Fix test case: unlock tables in preparation for a drop table. In some
      circumstances, dropping tables while holding locks leads to a deadlock.
    mysql-test/t/lock.test:
      Fix test case: unlock tables in preparation for a drop table. In some
      circumstances, dropping tables while holding locks leads to a deadlock.
    mysql-test/t/lock_multi.test:
      Fix test case: unlock tables in preparation for a drop table. In some
      circumstances, dropping tables while holding locks leads to a deadlock.
    mysql-test/t/myisam.test:
      Fix test case: unlock tables in preparation for a drop table. In some
      circumstances, dropping tables while holding locks leads to a deadlock.
    mysql-test/t/query_cache_notembedded.test:
      Fix test case: unlock tables in preparation for a drop table. In some
      circumstances, dropping tables while holding locks leads to a deadlock.
    mysql-test/t/view.test:
      Fix test case: unlock tables in preparation for a drop table. In some
      circumstances, dropping tables while holding locks leads to a deadlock.
    sql/lock.cc:
      When trying to obtain a name lock under lock tables, ensure that the table is properly exclusively locked and fail otherwise.
    1b34d593
insert_notembedded.test 6.4 KB