• Konstantin Osipov's avatar
    A fix for Bug#41158 "DROP TABLE holds LOCK_open during unlink()". · 52306698
    Konstantin Osipov authored
    Remove acquisition of LOCK_open around file system operations,
    since such operations are now protected by metadata locks.
    Rework table discovery algorithm to not require LOCK_open.
    
    No new tests added since all MDL locking operations are covered
    in lock.test and mdl_sync.test, and as long as these tests
    pass despite the increased concurrency, consistency must be
    unaffected.
    
    mysql-test/t/disabled.def:
      Disable NDB tests due to Bug#55799.
    sql/datadict.cc:
      No longer necessary to protect ha_create_table() with
      LOCK_open. Serial execution is now ensured by metadata
      locks.
    sql/ha_ndbcluster.cc:
      Do not manipulate with LOCK_open in cluster code.
    sql/ha_ndbcluster_binlog.cc:
      Do not manipulate with LOCK_open in cluster code.
    sql/ha_ndbcluster_binlog.h:
      Update function signature.
    sql/handler.cc:
      Implement ha_check_if_table_exists().
      @todo: some engines provide ha_table_exists_in_engine()
      handlerton call, for those we perhaps shouldn't
      call ha_discover(), to be more efficient.
      Since currently it's only NDB, postpone till
      integration with NDB.
    sql/handler.h:
      Declare ha_check_if_table_exists() function.
    sql/mdl.cc:
      Remove an obsolete comment.
    sql/sql_base.cc:
      Update to a new signature of close_cached_tables():
      from now on we always call it without LOCK_open.
      Update comments.
      Remove get_table_share_with_create(), we should
      not attempt to create a table under LOCK_open.
      Introduce get_table_share_with_discover() instead,
      which would request a back off action if the table
      exists in engine.
      Remove acquisition of LOCK_open for 
      data dictionary operations, such as check_if_table_exists().
      Do not use get_table_share_with_create/discover for views,
      where it's not needed.
      Make tdc_remove_table() optionally acquire LOCK_open
      to simplify usage of this function.
      Use the right mutex in the partitioning code when
      manipulating with thd->open_tables.
    sql/sql_base.h:
      Update signatures of changes functions.
    sql/sql_insert.cc:
      Do not wrap quick_rm_table() with LOCK_open acquisition, 
      this is unnecessary.
    sql/sql_parse.cc:
      Update to the new calling convention of tdc_remove_table().
      Update to the new signature of close_cached_tables().
      Update comments.
    sql/sql_rename.cc:
      Update to the new calling convention of tdc_remove_table().
      Remove acquisition of LOCK_open around filesystem
      operations.
    sql/sql_show.cc:
      Remove get_trigger_table_impl().
      Do not acquire LOCK_open for a dirty read of the trigger
      file.
    sql/sql_table.cc:
      Do not acquire LOCK_open for filesystem operations.
    sql/sql_trigger.cc:
      Do not require LOCK_open for trigger file I/O.
    sql/sql_truncate.cc:
      Update to the new signature of tdc_remove_table().
    sql/sql_view.cc:
      Do not require LOCK_open for view I/O.
      Use tdc_remove_table() to expel view share.
      Update comments.
    sql/sys_vars.cc:
      Update to the new signature of close_cached_tables().
    52306698
sql_parse.cc 243 KB