#At file:///home/marty/MySQL/mysql-5.1-telco-6.2/
2968 Martin Skold 2009-08-31
Bug #46712 Auto_increment work incorrectly when using triggers and NDB Cluster, changed prefetch cache to only use thd->variables.ndb_autoincrement_prefetch_sz, added test case
modified:
mysql-test/suite/ndb/r/ndb_auto_increment.result
mysql-test/suite/ndb/t/ndb_auto_increment.test
sql/ha_ndbcluster.cc
=== modified file 'mysql-test/suite/ndb/r/ndb_auto_increment.result'
--- a/mysql-test/suite/ndb/r/ndb_auto_increment.result 2008-01-25 09:43:30 +0000
+++ b/mysql-test/suite/ndb/r/ndb_auto_increment.result 2009-08-31 09:47:30 +0000
@@ -3,6 +3,9 @@ DROP TABLE IF EXISTS t1;
set @old_auto_increment_offset = @@session.auto_increment_offset;
set @old_auto_increment_increment = @@session.auto_increment_increment;
set @old_ndb_autoincrement_prefetch_sz = @@session.ndb_autoincrement_prefetch_sz;
+set @old_auto_increment_offset = @@session.auto_increment_offset;
+set @old_auto_increment_increment = @@session.auto_increment_increment;
+set @old_ndb_autoincrement_prefetch_sz = @@session.ndb_autoincrement_prefetch_sz;
flush status;
create table t1 (a int not null auto_increment primary key) engine ndb;
insert into t1 values (NULL);
@@ -443,3 +446,56 @@ set auto_increment_offset = @old_auto_in
set auto_increment_increment = @old_auto_increment_increment;
set ndb_autoincrement_prefetch_sz = @old_ndb_autoincrement_prefetch_sz;
drop table t1;
+set auto_increment_offset = @old_auto_increment_offset;
+set auto_increment_increment = @old_auto_increment_increment;
+set ndb_autoincrement_prefetch_sz = @old_ndb_autoincrement_prefetch_sz;
+CREATE TABLE `t1` (
+`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+`k` int(10) unsigned NOT NULL DEFAULT '0',
+`c` char(120) NOT NULL DEFAULT '',
+`pad` char(60) NOT NULL DEFAULT '',
+PRIMARY KEY (`id`),
+KEY `k` (`k`)
+) ENGINE=ndbcluster;
+CREATE TABLE `t2` (
+`evend_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+`timestamp` int(11) NOT NULL,
+`server_id` int(11) NOT NULL,
+PRIMARY KEY (`evend_id`)
+) ENGINE=ndbcluster;
+insert into t1 values (null,1,'',''),(null,2,'','');
+CREATE TRIGGER tr1
+AFTER UPDATE ON t1
+FOR EACH ROW
+BEGIN
+insert into t2(timestamp, server_id) values(UNIX_TIMESTAMP(),@@global.server_id);
+end;
+|
+CREATE TRIGGER tr1
+AFTER UPDATE ON t1
+FOR EACH ROW
+BEGIN
+insert into t2(timestamp, server_id) values(UNIX_TIMESTAMP(),@@global.server_id);
+end;
+|
+update t1 set c='foobar' where id=1;
+update t1 set c='foobar' where id=1;
+update t1 set c='foobar' where id=1;
+update t1 set c='foobar' where id=1;
+update t1 set c='foobar' where id=1;
+update t1 set c='foobar' where id=1;
+update t1 set c='foobar' where id=1;
+update t1 set c='foobar' where id=1;
+select evend_id,server_id from t2 order by evend_id;
+evend_id server_id
+1 1
+2 2
+3 1
+4 2
+5 1
+6 2
+7 1
+8 2
+drop trigger tr1;
+drop table t1, t2;
+drop trigger if exists tr1;
=== modified file 'mysql-test/suite/ndb/t/ndb_auto_increment.test'
--- a/mysql-test/suite/ndb/t/ndb_auto_increment.test 2007-11-06 09:57:49 +0000
+++ b/mysql-test/suite/ndb/t/ndb_auto_increment.test 2009-08-31 09:47:30 +0000
@@ -6,6 +6,9 @@ connection server1;
DROP TABLE IF EXISTS t1,t2;
connection server2;
DROP TABLE IF EXISTS t1;
+set @old_auto_increment_offset = @@session.auto_increment_offset;
+set @old_auto_increment_increment = @@session.auto_increment_increment;
+set @old_ndb_autoincrement_prefetch_sz = @@session.ndb_autoincrement_prefetch_sz;
connection server1;
--enable_warnings
@@ -291,3 +294,83 @@ set auto_increment_increment = @old_auto
set ndb_autoincrement_prefetch_sz = @old_ndb_autoincrement_prefetch_sz;
drop table t1;
+
+connection server2;
+set auto_increment_offset = @old_auto_increment_offset;
+set auto_increment_increment = @old_auto_increment_increment;
+set ndb_autoincrement_prefetch_sz = @old_ndb_autoincrement_prefetch_sz;
+
+# bug#46712
+connection server1;
+
+CREATE TABLE `t1` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `k` int(10) unsigned NOT NULL DEFAULT '0',
+ `c` char(120) NOT NULL DEFAULT '',
+ `pad` char(60) NOT NULL DEFAULT '',
+ PRIMARY KEY (`id`),
+ KEY `k` (`k`)
+) ENGINE=ndbcluster;
+
+CREATE TABLE `t2` (
+ `evend_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+ `timestamp` int(11) NOT NULL,
+ `server_id` int(11) NOT NULL,
+ PRIMARY KEY (`evend_id`)
+) ENGINE=ndbcluster;
+
+
+insert into t1 values (null,1,'',''),(null,2,'','');
+
+DELIMITER |;
+
+CREATE TRIGGER tr1
+ AFTER UPDATE ON t1
+ FOR EACH ROW
+ BEGIN
+ insert into t2(timestamp, server_id) values(UNIX_TIMESTAMP(),@@global.server_id);
+ end;
+|
+
+DELIMITER ;|
+
+connection server2;
+
+DELIMITER |;
+
+CREATE TRIGGER tr1
+ AFTER UPDATE ON t1
+ FOR EACH ROW
+ BEGIN
+ insert into t2(timestamp, server_id) values(UNIX_TIMESTAMP(),@@global.server_id);
+ end;
+|
+
+DELIMITER ;|
+
+connection server1;
+update t1 set c='foobar' where id=1;
+connection server2;
+update t1 set c='foobar' where id=1;
+connection server1;
+update t1 set c='foobar' where id=1;
+connection server2;
+update t1 set c='foobar' where id=1;
+connection server1;
+update t1 set c='foobar' where id=1;
+connection server2;
+update t1 set c='foobar' where id=1;
+connection server1;
+update t1 set c='foobar' where id=1;
+connection server2;
+update t1 set c='foobar' where id=1;
+connection server1;
+select evend_id,server_id from t2 order by evend_id;
+
+drop trigger tr1;
+drop table t1, t2;
+
+connection server2;
+--disable_warnings
+drop trigger if exists tr1;
+--enable_warnings
=== modified file 'sql/ha_ndbcluster.cc'
--- a/sql/ha_ndbcluster.cc 2009-08-28 12:37:02 +0000
+++ b/sql/ha_ndbcluster.cc 2009-08-31 09:47:30 +0000
@@ -4230,7 +4230,8 @@ int ha_ndbcluster::reset()
m_ignore_dup_key= FALSE;
m_use_write= FALSE;
m_ignore_no_key= FALSE;
- m_rows_to_insert= 1;
+ m_rows_inserted= (ha_rows) 0;
+ m_rows_to_insert= (ha_rows) 1;
m_delete_cannot_batch= FALSE;
m_update_cannot_batch= FALSE;
@@ -4300,7 +4301,10 @@ void ha_ndbcluster::start_bulk_insert(ha
if (rows == (ha_rows) 0)
{
/* We don't know how many will be inserted, guess */
- m_rows_to_insert= m_autoincrement_prefetch;
+ m_rows_to_insert=
+ (m_autoincrement_prefetch > NDB_DEFAULT_AUTO_PREFETCH)
+ ? m_autoincrement_prefetch
+ : NDB_DEFAULT_AUTO_PREFETCH;
}
else
m_rows_to_insert= rows;
@@ -4581,11 +4585,7 @@ int ha_ndbcluster::init_handler_for_stat
DBUG_ENTER("ha_ndbcluster::init_handler_for_statement");
// store thread specific data first to set the right context
m_force_send= thd->variables.ndb_force_send;
- m_autoincrement_prefetch=
- (thd->variables.ndb_autoincrement_prefetch_sz >
- NDB_DEFAULT_AUTO_PREFETCH) ?
- (ha_rows) thd->variables.ndb_autoincrement_prefetch_sz
- : (ha_rows) NDB_DEFAULT_AUTO_PREFETCH;
+ m_autoincrement_prefetch= thd->variables.ndb_autoincrement_prefetch_sz;
m_thd_ndb= thd_ndb;
DBUG_ASSERT(m_thd_ndb->trans);
// Start of transaction
@@ -6530,38 +6530,20 @@ void ha_ndbcluster::get_auto_increment(u
ulonglong *first_value,
ulonglong *nb_reserved_values)
{
- uint rows_to_insert= m_rows_to_insert;
- uint cache_size;
Uint64 auto_value;
THD *thd= current_thd;
DBUG_ENTER("get_auto_increment");
DBUG_PRINT("enter", ("m_tabname: %s", m_tabname));
Ndb *ndb= get_ndb(table->in_use);
-
- if (!m_skip_auto_increment)
- {
- if (m_rows_inserted > rows_to_insert)
- {
- /* We guessed too low */
- rows_to_insert+= m_autoincrement_prefetch;
- }
- uint remaining= rows_to_insert - m_rows_inserted;
- uint min_prefetch=
- (remaining < thd->variables.ndb_autoincrement_prefetch_sz) ?
- thd->variables.ndb_autoincrement_prefetch_sz
- : remaining;
- cache_size= ((remaining < m_autoincrement_prefetch) ?
- min_prefetch
- : remaining);
- }
uint retries= NDB_AUTO_INCREMENT_RETRIES;
int retry_sleep= 30; /* 30 milliseconds, transaction */
+
for (;;)
{
Ndb_tuple_id_range_guard g(m_share);
if (m_skip_auto_increment &&
ndb->readAutoIncrementValue(m_table, g.range, auto_value) ||
- ndb->getAutoIncrementValue(m_table, g.range, auto_value, cache_size, increment, offset))
+ ndb->getAutoIncrementValue(m_table, g.range, auto_value, m_autoincrement_prefetch, increment, offset))
{
if (--retries && !thd->killed &&
ndb->getNdbError().status == NdbError::TemporaryError)
| Thread |
|---|
| • bzr commit into mysql-5.1-telco-6.2 branch (Martin.Skold:2968) Bug#46712 | Martin Skold | 31 Aug |