• unknown's avatar
    Patch changing how ALTER TABLE implementation handles table locking · 1a60685c
    unknown authored
    and invalidation in the most general case (non-temporary table and
    not simple RENAME or ENABLE/DISABLE KEYS or partitioning command).
    
    See comment for sql/sql_table.cc for more information.
    
    These changes are prerequisite for 5.1 version of fix for bug #23667
    "CREATE TABLE LIKE is not isolated from alteration by other connections"
    
    
    mysql-test/include/mix1.inc:
      Extended coverage for behavior of ALTER TABLE statement under LOCK TABLES,
      which should be consistent across all platforms and for all engines.
    mysql-test/r/alter_table-big.result:
      Changed test for bug #25044 to use @@debug and injected sleeps
      infrastructure. Extended test coverage for ALTER TABLE's behavior
      under concurrency.
    mysql-test/r/alter_table.result:
      Extended coverage for behavior of ALTER TABLE statement under LOCK TABLES,
      which should be consistent across all platforms and for all engines.
    mysql-test/r/innodb_mysql.result:
      Extended coverage for behavior of ALTER TABLE statement under LOCK TABLES,
      which should be consistent across all platforms and for all engines.
    mysql-test/t/alter_table-big.test:
      Changed test for bug #25044 to use @@debug and injected sleeps
      infrastructure. Extended test coverage for ALTER TABLE's behavior
      under concurrency.
    mysql-test/t/alter_table.test:
      Extended coverage for behavior of ALTER TABLE statement under LOCK TABLES,
      which should be consistent across all platforms and for all engines.
    sql/mysql_priv.h:
      Made functions reopen_table() and close_handle_and_leave_table_as_lock()
      available outside of sql_base.cc file.
      Changed close_data_tables() in such way that after closing handler
      for the table it leaves TABLE object for it in table cache not as
      placeholder for ordinary name-lock but as placeholder for an exclusive
      name-lock. Renamed this routine to close_data_files_and_morph_locks().
    sql/sql_base.cc:
      Made functions reopen_table() and close_handle_and_leave_table_as_lock()
      available outside of sql_base.cc file.
      Changed close_data_tables() in such way that after closing handler
      for the table it leaves TABLE object for it in table cache not as
      placeholder for ordinary name-lock but as placeholder for an exclusive
      name-lock. Renamed this routine to close_data_files_and_morph_locks().
      Also adjusted it so it can work properly not only in LOCK TABLES mode.
    sql/sql_table.cc:
      Changed the way in which ALTER TABLE implementation handles table
      locking and invalidation in the most general case (non-temporary table
      and not simple RENAME or ENABLE/DISABLE KEYS or partitioning command)
      
      Now after preparing new version of the table we:
      1) Wait until all other threads close old version of table.
      2) Close instances of table open by this thread and replace them
         with exclusive name-locks.
      3) Rename the old table to a temp name, rename the new one to the
         old name.
      4) If we are under LOCK TABLES and don't do ALTER TABLE ... RENAME
         we reopen new version of table.
      5) Write statement to the binary log.
      6) If we are under LOCK TABLES and do ALTER TABLE ... RENAME we
         remove name-locks from list of open tables and table cache.
      7) If we are not not under LOCK TABLES we rely on close_thread_tables()
         call to remove name-locks from table cache and list of open table. 
      
      Such approach:
      a) Eliminates possibility for concurrent statement to sneak in and get
         access to the new version of the table before ALTER TABLE gets logged
         into binary log.
      b) Ensures that ALTER TABLE behaves under LOCK TABLES in the same way
         on all platforms and for all engines (in 5.0 this was not true) 
      c) Preserves nice invariant that if table is open in some connection
         there is a guarantee that .FRM file for this table exists and is
         properly named.
    1a60685c
alter_table.test 22.4 KB