From: Mattias Jonsson Date: October 1 2010 7:35pm Subject: bzr push into mysql-5.1-bugteam branch (mattias.jonsson:3520 to 3521) List-Archive: http://lists.mysql.com/commits/119747 Message-Id: <201010011937.o91JbMWu013022@acsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============8373730628599792929==" --===============8373730628599792929== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3521 Mattias Jonsson 2010-10-01 [merge] merge added: mysql-test/r/partition_binlog_stmt.result mysql-test/t/partition_binlog_stmt.test modified: mysql-test/r/partition.result mysql-test/t/partition.test sql/ha_partition.cc sql/ha_partition.h sql/table.cc sql/table.h 3520 Vasil Dimov 2010-10-01 [merge] Merge mysql-5.1-innodb -> mysql-5.1-bugteam added: mysql-test/suite/innodb_plugin/r/innodb_bug53756.result mysql-test/suite/innodb_plugin/t/innodb_bug53756-master.opt mysql-test/suite/innodb_plugin/t/innodb_bug53756.test modified: storage/innobase/btr/btr0btr.c storage/innobase/btr/btr0cur.c storage/innobase/btr/btr0pcur.c storage/innobase/btr/btr0sea.c storage/innobase/buf/buf0flu.c storage/innobase/eval/eval0eval.c storage/innobase/handler/ha_innodb.cc storage/innobase/include/ut0rnd.ic storage/innobase/lock/lock0lock.c storage/innobase/log/log0recv.c storage/innobase/os/os0file.c storage/innobase/que/que0que.c storage/innobase/row/row0mysql.c storage/innobase/row/row0purge.c storage/innobase/row/row0umod.c storage/innobase/row/row0upd.c storage/innobase/row/row0vers.c storage/innobase/trx/trx0purge.c storage/innobase/trx/trx0roll.c storage/innobase/trx/trx0sys.c storage/innobase/trx/trx0trx.c storage/innobase/trx/trx0undo.c storage/innodb_plugin/ChangeLog storage/innodb_plugin/btr/btr0btr.c storage/innodb_plugin/btr/btr0cur.c storage/innodb_plugin/btr/btr0pcur.c storage/innodb_plugin/btr/btr0sea.c storage/innodb_plugin/buf/buf0flu.c storage/innodb_plugin/dict/dict0crea.c storage/innodb_plugin/dict/dict0dict.c storage/innodb_plugin/dict/dict0load.c storage/innodb_plugin/eval/eval0eval.c storage/innodb_plugin/handler/ha_innodb.cc storage/innodb_plugin/handler/i_s.cc storage/innodb_plugin/include/os0sync.h storage/innodb_plugin/include/univ.i storage/innodb_plugin/include/ut0rnd.ic storage/innodb_plugin/log/log0recv.c storage/innodb_plugin/os/os0file.c storage/innodb_plugin/que/que0que.c storage/innodb_plugin/row/row0mysql.c storage/innodb_plugin/row/row0purge.c storage/innodb_plugin/row/row0umod.c storage/innodb_plugin/row/row0vers.c storage/innodb_plugin/trx/trx0purge.c storage/innodb_plugin/trx/trx0roll.c storage/innodb_plugin/trx/trx0sys.c storage/innodb_plugin/trx/trx0trx.c storage/innodb_plugin/trx/trx0undo.c === modified file 'mysql-test/r/partition.result' --- a/mysql-test/r/partition.result 2010-09-10 09:52:35 +0000 +++ b/mysql-test/r/partition.result 2010-10-01 13:41:27 +0000 @@ -1,5 +1,20 @@ drop table if exists t1, t2; # +# Bug#57113: ha_partition::extra(ha_extra_function): +# Assertion `m_extra_cache' failed +CREATE TABLE t1 +(id INT NOT NULL PRIMARY KEY, +name VARCHAR(16) NOT NULL, +year YEAR, +INDEX name (name(8)) +) +PARTITION BY HASH(id) PARTITIONS 2; +INSERT INTO t1 VALUES ( 1, 'FooBar', '1924' ); +CREATE TABLE t2 (id INT); +INSERT INTO t2 VALUES (1),(2); +UPDATE t1, t2 SET t1.year = '1955' WHERE t1.name = 'FooBar'; +DROP TABLE t1, t2; +# # Bug#55458: Partitioned MyISAM table gets crashed by multi-table update # CREATE TABLE t1 ( === 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-10-01 11:39:04 +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; === modified file 'mysql-test/t/partition.test' --- a/mysql-test/t/partition.test 2010-08-10 08:43:12 +0000 +++ b/mysql-test/t/partition.test 2010-09-30 13:57:33 +0000 @@ -15,6 +15,28 @@ drop table if exists t1, t2; --enable_warnings --echo # +--echo # Bug#57113: ha_partition::extra(ha_extra_function): +--echo # Assertion `m_extra_cache' failed +CREATE TABLE t1 +(id INT NOT NULL PRIMARY KEY, + name VARCHAR(16) NOT NULL, + year YEAR, + INDEX name (name(8)) +) +PARTITION BY HASH(id) PARTITIONS 2; + +INSERT INTO t1 VALUES ( 1, 'FooBar', '1924' ); + +CREATE TABLE t2 (id INT); + +INSERT INTO t2 VALUES (1),(2); + +UPDATE t1, t2 SET t1.year = '1955' WHERE t1.name = 'FooBar'; + +DROP TABLE t1, t2; + + +--echo # --echo # Bug#55458: Partitioned MyISAM table gets crashed by multi-table update --echo # CREATE 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-10-01 11:39:04 +0000 @@ -0,0 +1,26 @@ +--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 +--write_file init_file.txt +abcd +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-09-10 09:52:35 +0000 +++ b/sql/ha_partition.cc 2010-10-01 13:41:27 +0000 @@ -2451,6 +2451,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 @@ -2607,6 +2622,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); @@ -5555,7 +5572,6 @@ int ha_partition::extra(enum ha_extra_fu DBUG_RETURN(prepare_for_rename()); break; case HA_EXTRA_PREPARE_FOR_UPDATE: - DBUG_ASSERT(m_extra_cache); /* Needs to be run on the first partition in the range now, and later in late_extra_cache, when switching to a new partition to scan. @@ -5563,6 +5579,8 @@ int ha_partition::extra(enum ha_extra_fu m_extra_prepare_for_update= TRUE; if (m_part_spec.start_part != NO_CURRENT_PART_ID) { + if (!m_extra_cache) + m_extra_cache_part_id= m_part_spec.start_part; DBUG_ASSERT(m_extra_cache_part_id == m_part_spec.start_part); VOID(m_file[m_part_spec.start_part]->extra(HA_EXTRA_PREPARE_FOR_UPDATE)); } @@ -5825,19 +5843,22 @@ void ha_partition::late_extra_cache(uint { handler *file; DBUG_ENTER("ha_partition::late_extra_cache"); - DBUG_PRINT("info", ("extra_cache %u partid %u size %u", m_extra_cache, + DBUG_PRINT("info", ("extra_cache %u prepare %u partid %u size %u", + m_extra_cache, m_extra_prepare_for_update, partition_id, m_extra_cache_size)); if (!m_extra_cache && !m_extra_prepare_for_update) DBUG_VOID_RETURN; file= m_file[partition_id]; - if (m_extra_cache_size == 0) - VOID(file->extra(HA_EXTRA_CACHE)); - else - VOID(file->extra_opt(HA_EXTRA_CACHE, m_extra_cache_size)); + if (m_extra_cache) + { + if (m_extra_cache_size == 0) + VOID(file->extra(HA_EXTRA_CACHE)); + else + VOID(file->extra_opt(HA_EXTRA_CACHE, m_extra_cache_size)); + } if (m_extra_prepare_for_update) { - DBUG_ASSERT(m_extra_cache); VOID(file->extra(HA_EXTRA_PREPARE_FOR_UPDATE)); } m_extra_cache_part_id= partition_id; === modified file 'sql/ha_partition.h' --- a/sql/ha_partition.h 2010-09-07 15:56:43 +0000 +++ b/sql/ha_partition.h 2010-10-01 11:39:49 +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; @@ -948,8 +949,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() @@ -962,7 +964,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-10-01 11:39:04 +0000 @@ -425,6 +425,11 @@ void free_table_share(TABLE_SHARE *share key_info->flags= 0; } } + if (share->ha_data_destroy) + { + share->ha_data_destroy(share->ha_data); + share->ha_data_destroy= NULL; + } /* We must copy mem_root from share because share is allocated through it */ memcpy((char*) &mem_root, (char*) &share->mem_root, sizeof(mem_root)); free_root(&mem_root, MYF(0)); // Free's share @@ -1616,6 +1621,11 @@ 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); + share->ha_data_destroy= NULL; + } 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-10-01 11:39:04 +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. */ /* --===============8373730628599792929== 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\ # d8n2vl9s8l7wy1bo # target_branch: file:///Users/mattiasj/mysql-bzr/topush-51-bugteam_2/ # testament_sha1: 57c720b9f866756e5106978b5ec130199d861ae3 # timestamp: 2010-10-01 21:36:56 +0200 # source_branch: file:///Users/mattiasj/mysql-bzr/topush-51-bugteam/ # base_revision_id: vasil.dimov@stripped\ # emaku4hmbckn7eoq # # Begin bundle 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 --===============8373730628599792929==--