From: Mattias Jonsson Date: September 2 2010 3:54pm Subject: bzr commit into mysql-5.1-bugteam branch (mattias.jonsson:3498) Bug#51851 List-Archive: http://lists.mysql.com/commits/117437 X-Bug: 51851 Message-Id: <201009021554.o82EYsdu032737@rcsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============7224070160240376321==" --===============7224070160240376321== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///Users/mattiasj/mysql-bzr/b51851-51-bt_small/ based on revid:davi.arnaut@stripped 3498 Mattias Jonsson 2010-09-02 Bug#51851: Server with SBR locks mutex twice on LOAD DATA into partitioned MyISAM table Problem was that both partitioning and myisam used the same table_share->mutex for different protections (auto inc and repair). Solved by adding a specific mutex for the partitioning auto_increment. This is a 5.1 ONLY patch, already fixed in 5.5+. added: mysql-test/r/partition_binlog_stmt.result mysql-test/t/partition_binlog_stmt.test modified: sql/ha_partition.cc sql/ha_partition.h sql/table.cc sql/table.h === added file 'mysql-test/r/partition_binlog_stmt.result' --- a/mysql-test/r/partition_binlog_stmt.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/r/partition_binlog_stmt.result 2010-09-02 15:53:51 +0000 @@ -0,0 +1,13 @@ +DROP TABLE IF EXISTS t1; +# +# Bug#51851: Server with SBR locks mutex twice on LOAD DATA into +# partitioned MyISAM table +CREATE TABLE t1 +(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +name TINYBLOB NOT NULL, +modified TIMESTAMP DEFAULT '0000-00-00 00:00:00', +INDEX namelocs (name(255))) ENGINE = MyISAM +PARTITION BY HASH(id) PARTITIONS 2; +LOAD DATA LOCAL INFILE 'init_file.txt' +INTO TABLE t1 (name); +DROP TABLE t1; === added file 'mysql-test/t/partition_binlog_stmt.test' --- a/mysql-test/t/partition_binlog_stmt.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/t/partition_binlog_stmt.test 2010-09-02 15:53:51 +0000 @@ -0,0 +1,28 @@ +--source include/have_partition.inc +--source include/have_binlog_format_statement.inc + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +--echo # +--echo # Bug#51851: Server with SBR locks mutex twice on LOAD DATA into +--echo # partitioned MyISAM table +perl; +open( INIT, ">init_file.txt"); +print INIT "abcd\n"; +close( INIT ); +EOF + +CREATE TABLE t1 +(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + name TINYBLOB NOT NULL, + modified TIMESTAMP DEFAULT '0000-00-00 00:00:00', + INDEX namelocs (name(255))) ENGINE = MyISAM +PARTITION BY HASH(id) PARTITIONS 2; + +LOAD DATA LOCAL INFILE 'init_file.txt' +INTO TABLE t1 (name); + +--remove_file init_file.txt +DROP TABLE t1; === modified file 'sql/ha_partition.cc' --- a/sql/ha_partition.cc 2010-08-19 07:20:17 +0000 +++ b/sql/ha_partition.cc 2010-09-02 15:53:51 +0000 @@ -2449,6 +2449,21 @@ err1: /**************************************************************************** MODULE open/close object ****************************************************************************/ + + +/** + A destructor for partition-specific TABLE_SHARE data. +*/ + +void ha_data_partition_destroy(void *ha_data) +{ + if (ha_data) + { + HA_DATA_PARTITION *ha_part_data= (HA_DATA_PARTITION*) ha_data; + pthread_mutex_destroy(&ha_part_data->LOCK_auto_inc); + } +} + /* Open handler object @@ -2605,6 +2620,8 @@ int ha_partition::open(const char *name, } DBUG_PRINT("info", ("table_share->ha_data 0x%p", ha_data)); bzero(ha_data, sizeof(HA_DATA_PARTITION)); + table_share->ha_data_destroy= ha_data_partition_destroy; + VOID(pthread_mutex_init(&ha_data->LOCK_auto_inc, MY_MUTEX_INIT_FAST)); } if (is_not_tmp_table) pthread_mutex_unlock(&table_share->mutex); === modified file 'sql/ha_partition.h' --- a/sql/ha_partition.h 2010-07-09 13:00:33 +0000 +++ b/sql/ha_partition.h 2010-09-02 15:53:51 +0000 @@ -44,6 +44,7 @@ typedef struct st_partition_share typedef struct st_ha_data_partition { ulonglong next_auto_inc_val; /**< first non reserved value */ + pthread_mutex_t LOCK_auto_inc; bool auto_inc_initialized; } HA_DATA_PARTITION; @@ -944,8 +945,9 @@ private: DBUG_ASSERT(table_share->ha_data && !auto_increment_lock); if(table_share->tmp_table == NO_TMP_TABLE) { + HA_DATA_PARTITION *ha_data= (HA_DATA_PARTITION*) table_share->ha_data; auto_increment_lock= TRUE; - pthread_mutex_lock(&table_share->mutex); + pthread_mutex_lock(&ha_data->LOCK_auto_inc); } } virtual void unlock_auto_increment() @@ -958,7 +960,8 @@ private: */ if(auto_increment_lock && !auto_increment_safe_stmt_log_lock) { - pthread_mutex_unlock(&table_share->mutex); + HA_DATA_PARTITION *ha_data= (HA_DATA_PARTITION*) table_share->ha_data; + pthread_mutex_unlock(&ha_data->LOCK_auto_inc); auto_increment_lock= FALSE; } } === modified file 'sql/table.cc' --- a/sql/table.cc 2010-07-20 18:07:36 +0000 +++ b/sql/table.cc 2010-09-02 15:53:51 +0000 @@ -1616,6 +1616,8 @@ static int open_binary_frm(THD *thd, TAB delete crypted; delete handler_file; hash_free(&share->name_hash); + if (share->ha_data_destroy) + share->ha_data_destroy(share->ha_data); open_table_error(share, error, share->open_errno, errarg); DBUG_RETURN(error); === modified file 'sql/table.h' --- a/sql/table.h 2010-08-02 07:50:15 +0000 +++ b/sql/table.h 2010-09-02 15:53:51 +0000 @@ -463,6 +463,7 @@ typedef struct st_table_share /** place to store storage engine specific data */ void *ha_data; + void (*ha_data_destroy)(void *); /* An optional destructor for ha_data. */ /* --===============7224070160240376321== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/mattias.jonsson@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: mattias.jonsson@stripped\ # wwxdivvqdgpo2a32 # target_branch: file:///Users/mattiasj/mysql-bzr/b51851-51-bt_small/ # testament_sha1: 12822f3fc498c4f14af136b9915965a7ff04105a # timestamp: 2010-09-02 17:54:10 +0200 # base_revision_id: davi.arnaut@stripped\ # h459kwlylg6h745v # # Begin bundle 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 --===============7224070160240376321==--