• Mattias Jonsson's avatar
    Bug#38804: Query deadlock causes all tables to be inaccessible. · be63f0af
    Mattias Jonsson authored
    Problem was a mutex added in bug n 27405 for solving a problem
    with auto_increment in partitioned innodb tables.
    (in ha_partition::write_row over partitions file->ha_write_row)
    
    Solution is to use the patch for bug#33479, which refines the
    usage of mutexes for auto_increment.
    
    Backport of bug-33479 from 6.0:
    
    Bug-33479: auto_increment failures in partitioning
    
    Several problems with auto_increment in partitioning
    (with MyISAM, InnoDB. Locking issues, not handling
    multi-row INSERTs properly etc.)
    
    Changed the auto_increment handling for partitioning:
    Added a ha_data variable in table_share for storage engine specific data
    such as auto_increment value handling in partitioning, also see WL 4305
    and using the ha_data->mutex to lock around read + update.
    
    The idea is this:
    Store the table's reserved auto_increment value in
    the TABLE_SHARE and use a mutex to, lock it for reading and updating it
    and unlocking it, in one block. Only accessing all partitions
    when it is not initialized.
    Also allow reservations of ranges, and if no one has done a reservation
    afterwards, lower the reservation to what was actually used after
    the statement is done (via release_auto_increment from WL 3146).
    The lock is kept from the first reservation if it is statement based
    replication and a multi-row INSERT statement where the number of
    candidate rows to insert is not known in advance (like INSERT SELECT,
    LOAD DATA, unlike INSERT VALUES (row1), (row2),,(rowN)).
    
    This should also lead to better concurrancy (no need to have a mutex
    protection around write_row in all cases)
    and work with any local storage engine.
    
    mysql-test/suite/parts/inc/partition_auto_increment.inc:
      Bug#38804: Query deadlock causes all tables to be inaccessible.
      Backporting from 6.0 of:
      Bug-33479: auto_increment failures in partitioning
      
      Test source file for testing auto_increment
    mysql-test/suite/parts/r/partition_auto_increment_archive.result:
      Bug#38804: Query deadlock causes all tables to be inaccessible.
      Backporting from 6.0 of:
      Bug-33479: auto_increment failures in partitioning
      
      result file for testing auto_increment
    mysql-test/suite/parts/r/partition_auto_increment_blackhole.result:
      Bug#38804: Query deadlock causes all tables to be inaccessible.
      Backporting from 6.0 of:
      Bug-33479: auto_increment failures in partitioning
      
      result file for testing auto_increment
    mysql-test/suite/parts/r/partition_auto_increment_innodb.result:
      Bug#38804: Query deadlock causes all tables to be inaccessible.
      Backporting from 6.0 of:
      Bug-33479: auto_increment failures in partitioning
      
      result file for testing auto_increment
    mysql-test/suite/parts/r/partition_auto_increment_memory.result:
      Bug#38804: Query deadlock causes all tables to be inaccessible.
      Backporting from 6.0 of:
      Bug-33479: auto_increment failures in partitioning
      
      result file for testing auto_increment
    mysql-test/suite/parts/r/partition_auto_increment_myisam.result:
      Bug#38804: Query deadlock causes all tables to be inaccessible.
      Backporting from 6.0 of:
      Bug-33479: auto_increment failures in partitioning
      
      result file for testing auto_increment
    mysql-test/suite/parts/r/partition_auto_increment_ndb.result:
      Bug#38804: Query deadlock causes all tables to be inaccessible.
      Backporting from 6.0 of:
      Bug-33479: auto_increment failures in partitioning
      
      result file for testing auto_increment
    mysql-test/suite/parts/t/partition_auto_increment_archive.test:
      Bug#38804: Query deadlock causes all tables to be inaccessible.
      Backporting from 6.0 of:
      Bug-33479: auto_increment failures in partitioning
      
      test file for testing auto_increment
    mysql-test/suite/parts/t/partition_auto_increment_blackhole.test:
      Bug#38804: Query deadlock causes all tables to be inaccessible.
      Backporting from 6.0 of:
      Bug-33479: auto_increment failures in partitioning
      
      test file for testing auto_increment
    mysql-test/suite/parts/t/partition_auto_increment_innodb.test:
      Bug#38804: Query deadlock causes all tables to be inaccessible.
      Backporting from 6.0 of:
      Bug-33479: auto_increment failures in partitioning
      
      test file for testing auto_increment
    mysql-test/suite/parts/t/partition_auto_increment_memory.test:
      Bug#38804: Query deadlock causes all tables to be inaccessible.
      Backporting from 6.0 of:
      Bug-33479: auto_increment failures in partitioning
      
      test file for testing auto_increment
    mysql-test/suite/parts/t/partition_auto_increment_myisam.test:
      Bug#38804: Query deadlock causes all tables to be inaccessible.
      Backporting from 6.0 of:
      Bug-33479: auto_increment failures in partitioning
      
      test file for testing auto_increment
    mysql-test/suite/parts/t/partition_auto_increment_ndb.test:
      Bug#38804: Query deadlock causes all tables to be inaccessible.
      Backporting from 6.0 of:
      Bug-33479: auto_increment failures in partitioning
      
      test file for testing auto_increment
    sql/ha_partition.cc:
      Bug#38804: Query deadlock causes all tables to be inaccessible.
      Backporting from 6.0 of:
      Bug-33479: Failures using auto_increment and partitioning
      
      Changed ha_partition::get_auto_increment from file->get_auto_increment
      to file->info(HA_AUTO_STATUS), since it is works better with InnoDB
      (InnoDB can have issues with partitioning and auto_increment,
      where get_auto_increment sometimes can return a non updated value.)
      
      Using the new table_share->ha_data for keeping the auto_increment
      value, shared by all instances of the same table.
      It is read+updated when holding a auto_increment specific mutex.
      Also added release_auto_increment to decrease gaps if possible.
      And a lock for multi-row INSERT statements where the number of candidate
      rows to insert is not known in advance (like INSERT SELECT, LOAD DATA;
      Unlike INSERT INTO (row1),(row2),,(rowN)).
      Fixed a small bug, copied++ to (*copied)++ and the same for deleted.
      Changed from current_thd, to ha_thd()
    sql/ha_partition.h:
      Bug#38804: Query deadlock causes all tables to be inaccessible.
      Backporting from 6.0 of:
      Bug-33479: Failures using auto_increment and partitioning
      
      Added a new struct HA_DATA_PARTITION to be used in table_share->ha_data
      Added a private function to set auto_increment values if needed
      Removed the restore_auto_increment (the hander version is better)
      Added lock/unlock functions for auto_increment handling.
      Changed copied/deleted to const.
    sql/handler.h:
      Bug#38804: Query deadlock causes all tables to be inaccessible.
      Backporting from 6.0 of:
      Bug-33479: auto_increment failures in partitioning
      
      Added const for changed_partitions
      Added comments about SQLCOM_TRUNCATE for delete_all_rows
    sql/table.h:
      Bug#38804: Query deadlock causes all tables to be inaccessible.
      Backporting from 6.0 of:
      Bug-33479: Failures using auto_increment and partitioning
      
      Added a variable in table_share: ha_data for storage of storage engine
      specific data (such as auto_increment handling in partitioning).
    be63f0af
ha_partition.cc 179 KB