• unknown's avatar
    Fix for bug #12423 "Deadlock when doing FLUSH PRIVILEGES and GRANT in · 2a64e9a2
    unknown authored
    multi-threaded environment".
    
    To avoid deadlocks between several simultaneously run account management 
    commands (particularly between FLUSH PRIVILEGES/SET PASSWORD and GRANT
    commands) we should always take table and internal locks during their
    execution in the same order. In other words we should first open and lock
    privilege tables and only then obtain acl_cache::lock/LOCK_grant locks.
    
    
    mysql-test/r/grant2.result:
      Added test for bug #12423 "Deadlock when doing FLUSH PRIVILEGES and GRANT in 
      multi-threaded environment".
    mysql-test/t/grant2.test:
      Added test for bug #12423 "Deadlock when doing FLUSH PRIVILEGES and GRANT in 
      multi-threaded environment".
    sql/mysqld.cc:
      acl_init/grant_init() are now used only at server start up so they always
      allocate temporary THD object and don't need argument for passing pointer
      to it.
    sql/sql_acl.cc:
      To avoid deadlocks between several simultaneously run account management 
      commands (particularly between FLUSH PRIVILEGES/SET PASSWORD and GRANT
      commands) we should always take table and internal locks during their
      execution in the same order. In other words we should first open and lock
      privilege tables and only then obtain acl_cache::lock/LOCK_grant locks.
      
      Changed acl_reload()/grant_reload() and change_password()/update_user_table()
      in such way that they obey this principle. Now in acl_reload()/grant_reload()/
      change_password() we open and lock privilege tables, then obtain internal
      locks and then call acl_load()/grant_load()/update_user_table() functions to
      do actual loading or updating.
    sql/sql_acl.h:
      acl_init/grant_init() are now used only at server start up so they always
      allocate temporary THD object and don't need argument for passing pointer
      to it. acl_reload()/grant_reload() now are able to report about their
      success or failure through return value.
    sql/sql_parse.cc:
      If reload_acl_and_cache() is called from SIGHUP handler we have to
      allocate temporary THD for execution of acl_reload()/grant_reload().
    2a64e9a2
sql_acl.cc 112 KB