diff options
author | unknown <holyfoot/hf@hfmain.(none)> | 2007-08-04 00:00:25 +0500 |
---|---|---|
committer | unknown <holyfoot/hf@hfmain.(none)> | 2007-08-04 00:00:25 +0500 |
commit | 5b61c87afd21e0c90fcde39cd727c7a32b460053 (patch) | |
tree | 71b16248a5705e95fbadf11554b88be429284c6e /sql/ha_partition.cc | |
parent | 4b8ecfce5ec0b664a335b471429ec7623c2849cc (diff) | |
parent | 32d280ba3202c416ecf3ad15f5d2a6316c7dd128 (diff) | |
download | mariadb-git-5b61c87afd21e0c90fcde39cd727c7a32b460053.tar.gz |
Merge bk@192.168.21.1:mysql-5.1-opt
into mysql.com:/home/hf/work/27405/my51-27405
sql/ha_partition.cc:
Auto merged
Diffstat (limited to 'sql/ha_partition.cc')
-rw-r--r-- | sql/ha_partition.cc | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index d46b3a3bb08..2c28d5087d4 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -2676,6 +2676,7 @@ int ha_partition::write_row(uchar * buf) uint32 part_id; int error; longlong func_value; + bool autoincrement_lock= false; #ifdef NOT_NEEDED uchar *rec0= m_rec0; #endif @@ -2691,7 +2692,21 @@ int ha_partition::write_row(uchar * buf) or a new row, then update the auto_increment value in the record. */ if (table->next_number_field && buf == table->record[0]) + { + /* + Some engines (InnoDB for example) can change autoincrement + counter only after 'table->write_row' operation. + So if another thread gets inside the ha_partition::write_row + before it is complete, it gets same auto_increment value, + which means DUP_KEY error (bug #27405) + Here we separate the access using table_share->mutex, and + use autoincrement_lock variable to avoid unnecessary locks. + Probably not an ideal solution. + */ + autoincrement_lock= true; + pthread_mutex_lock(&table_share->mutex); update_auto_increment(); + } my_bitmap_map *old_map= dbug_tmp_use_all_columns(table, table->read_set); #ifdef NOT_NEEDED @@ -2712,11 +2727,15 @@ int ha_partition::write_row(uchar * buf) if (unlikely(error)) { m_part_info->err_value= func_value; - DBUG_RETURN(error); + goto exit; } m_last_part= part_id; DBUG_PRINT("info", ("Insert in partition %d", part_id)); - DBUG_RETURN(m_file[part_id]->write_row(buf)); + error= m_file[part_id]->write_row(buf); +exit: + if (autoincrement_lock) + pthread_mutex_unlock(&table_share->mutex); + DBUG_RETURN(error); } |