From: Date: July 31 2007 4:40pm Subject: bk commit into 5.0 tree (svoj:1.2487) BUG#29152 List-Archive: http://lists.mysql.com/commits/31883 X-Bug: 29152 Message-Id: <20070731144042.0EB00DF5@april.pils.ru> Below is the list of changes that have just been committed into a local 5.0 repository of svoj. When svoj does a push these changes will be propagated to the main repository and, within 24 hours after the push, to the public repository. For information on how to access the public repository see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html ChangeSet@stripped, 2007-07-31 19:40:36+05:00, svoj@stripped +1 -0 BUG#29152 - INSERT DELAYED does not use concurrent_insert on slave INSERT DELAYED on a replication slave was converted to regular INSERT, whereas it should try concurrent INSERT first. With this patch we try to convert delayed insert to concurrent insert on a replication slave. If it is impossible for some reason, we fall back to regular insert. No test case for this fix. I do not see anything indicating this is regression - we behave this way since Nov 2000. sql/sql_insert.cc@stripped, 2007-07-31 19:40:32+05:00, svoj@stripped +8 -1 If we're executing INSERT DELAYED on a replication slave, we're upgrading lock type to TL_WRITE as we need to ensure serial execution of queries on the slave. OTOH if we're executing regular INSERT on a replication slave, we're trying TL_WRITE_CONCURRENT_INSERT first, and if we may not use it, we fall back to TL_WRITE. Fixed INSERT DELAYED on a replication slave to behave the same way as regular INSERT, that is to try TL_WRITE_CONCURRENT_INSERT first. diff -Nrup a/sql/sql_insert.cc b/sql/sql_insert.cc --- a/sql/sql_insert.cc 2007-07-19 20:36:51 +05:00 +++ b/sql/sql_insert.cc 2007-07-31 19:40:32 +05:00 @@ -446,7 +446,6 @@ void upgrade_lock_type(THD *thd, thr_loc client connection and the delayed thread. */ if (specialflag & (SPECIAL_NO_NEW_FUNC | SPECIAL_SAFE_MODE) || - thd->slave_thread || thd->variables.max_insert_delayed_threads == 0 || thd->prelocked_mode || thd->lex->uses_stored_routines()) @@ -454,6 +453,14 @@ void upgrade_lock_type(THD *thd, thr_loc *lock_type= TL_WRITE; return; } + if (thd->slave_thread) + { + /* Try concurrent insert */ + *lock_type= (duplic == DUP_UPDATE || duplic == DUP_REPLACE) ? + TL_WRITE : TL_WRITE_CONCURRENT_INSERT; + return; + } + bool log_on= (thd->options & OPTION_BIN_LOG || ! (thd->security_ctx->master_access & SUPER_ACL)); if (log_on && mysql_bin_log.is_open() && is_multi_insert)