Tuuri,
Thank you for the follow-up. It's great that our efforts were not in vain and I could contribute towards resolving the issue. I will be looking forward to the next release of InnoDB/MySQL-Max. --------------------- regards, Afroze H. Zubairi (IOD) --------------------- ----- Original Message ----- From: "Heikki Tuuri" <[EMAIL PROTECTED]> Date: Tue, 1 Oct 2002 15:00:37 +0300 To: "\"iod iod\"" <[EMAIL PROTECTED]> Subject: Re: InnoDB AUTO-INC lock timeouts / deadlocks on inserts (using > IOD, > > thank you for the bug report. I was able to repeat the problem with you > scripts. The bug was that InnoDB failed to release at an SQL statement end > such AUTO-INC locks which were only granted after a lock wait. They were > only released at the transaction commit. > > Since AUTO-INC locks normally are held for a short time, AUTO-INC lock waits > are rare, and many tests fail to notice this bug. Only under a stress test > like the one you wrote this bug becomes visible. > > Below is a patch which fixes the bug. > > Best regards, > > Heikki > Innobase Oy > sql query > > ChangeSet > 1.1201 02/10/01 13:47:58 [EMAIL PROTECTED] +1 -0 > lock0lock.c: > Fix bug: the AUTO-INC lock was held to the end of trx if it was granted > after a lock wait > > innobase/lock/lock0lock.c > 1.16 02/10/01 13:47:39 [EMAIL PROTECTED] +13 -0 > Fix bug: the AUTO-INC lock was held to the end of trx if it was granted > after a lock wait > > # This is a BitKeeper patch. What follows are the unified diffs for the > # set of deltas contained in the patch. The rest of the patch, the part > # that BitKeeper cares about, is below these diffs. > # User: heikki > # Host: hundin.mysql.fi > # Root: /home/heikki/mysql > > --- 1.15/innobase/lock/lock0lock.c Sun Aug 11 18:34:57 2002 > +++ 1.16/innobase/lock/lock0lock.c Tue Oct 1 13:47:39 2002 > @@ -1863,6 +1863,19 @@ > ut_ad(mutex_own(&kernel_mutex)); > > lock_reset_lock_and_trx_wait(lock); > + > + if (lock_get_mode(lock) == LOCK_AUTO_INC) { > + > + if (lock->trx->auto_inc_lock != NULL) { > + fprintf(stderr, > + "InnoDB: Error: trx already had an AUTO-INC lock!\n"); > + } > + > + /* Store pointer to lock to trx so that we know to > + release it at the end of the SQL statement */ > + > + lock->trx->auto_inc_lock = lock; > + } > > if (lock_print_waits) { > printf("Lock wait for trx %lu ends\n", > > ----- Original Message ----- > From: ""iod iod"" <[EMAIL PROTECTED]> > Newsgroups: mailing.database.mysql > Sent: Tuesday, October 01, 2002 11:10 AM > Subject: Re: InnoDB AUTO-INC lock timeouts / deadlocks on inserts (using > > > > > > Thank you for your response. > > > > We tried your example here on shell and it looks like InnoDB locks the > table only for the first transaction after db startup and this lock is held > for the whole transaction (like you observed). > > > > But, contrary to this scenario we have experienced some strange behavior, > such that table level AUTO-INC locks are being applied REPEATEDLY (duration > of ENTIRE transaction), even though the database has undergone multiple, > commited transactions previously. This behavior is very prominent when you > have multiple processes with overlapping, concurrent transactions and you > are executing DML statements in a loop (I tried a delay after each iteration > to prevent a locks being held too long, but it did not seem to work). It so > happens that the lock is not released by the process until the transaction > is complete. > > > > I am attaching a simplified perl script (concur-test.pl) and a shell > script (go.sh) used to invoke these processes (URL: > http://www.geocities.com/yoda_pk/innodbchk.tar.gz ). Please create the table > (SQL provided), run the shell script and observe the InnoDB monitor log for > deadlocks. We have observed various AUTO-INC table level locks which are > applied every time we run the tests (without restarting the mysql database > engine) and these locks are held for the whole transaction and not just one > particular statement, EVERY time. > > > > PLATFORM: RH Linux 7.3/MySQL-Max-3.23.52-1/Perl DBI > > > > Looking forward to your observations. > > > > ------------ > > regards, > > > > IOD > > ------------ > > > > > > > > > > > > Subject: Re: InnoDB AUTO-INC lock timeouts / deadlocks on inserts > > (using > > > Iod, > > > > > > ----- Original Message ----- > > > From: ""iod iod"" <[EMAIL PROTECTED]> > > > > > Newsgroups: mailing.database.mysql > > > Sent: Thursday, September 26, 2002 8:14 AM > > > Subject: InnoDB AUTO-INC lock timeouts / deadlocks on inserts > > (using > > > > > > > > > > > > > > We have been using InnoDB with MySQL (MySQL-Max-3.23.52-1) > > for transaction > > > support in some complex situations in our application when > > maintaining > > > consistency is critical. > > > > > > > > Recently we did some stress testing by simulating 10 > > concurrent users > > > (perl/DBD) doing large number of inserts on a few tables. Note > > that these > > > tables have indexed fields which are 'INT' & 'AUTO_INCREMENT'. > > > > > > > > We are getting lock timeouts on concurrent inserts (in > > concurrent > > > TRANSACTIONS) very frequently, although it works fine for a > > single > > > non-concurrent transaction. Removing transactions eliminates the > > deadlocks > > > in concurrent runs, but we cannot guarantee the consistency of > > our data. > > > > > > > > RELEVANT 'my.cnf' SETTINGS: > > > > innodb_lock_wait_timeout = 50 > > > > innodb_thread_concurrency = 2 (to reduce thread contention) > > > > > > > > When we enabled InnoDB Monitor we saw messages like the > > following: > > > > > > > > ################ > > > > > > > > INSERT INTO BasketItems(BalQuantity, ........... > > > > ------- TRX HAS BEEN WAITING 46 SEC FOR THIS LOCK TO BE > > GRANTED: > > > > TABLE LOCK table ca3/BasketItems trx id 0 26561327 > > lock_mode AUTO-INC > > > waiting > > > > > > > > ################ > > > > > > > > At times there are around 4 to 5 such simultaneous waits in > > the log and > > > ultimately the lock times out and the process terminates. > > > > > > > > After reading the docs, it seems like InnoDB applies a > > table level lock on > > > the table and so other inserts get blocked. But, considering the > > time a > > > process has to wait ( > 50s) it looks like the locks are > > being held for a > > > very long time. According to the InnoDB documentation > > > (http://www.innodb.com/ibman.html#InnoDB_auto_inc): > > > > > > > > > > "When accessing the auto-increment counter InnoDB uses > > a special table > > > level lock AUTO-INC lock which it keeps to the end of the > > current SQL > > > statement, not to the end of the transaction." > > > > > > > > Is it possible that the locks are being held for the WHOLE > > transaction > > > instead of just THAT SQL statement? Is it because InnoDB's > > implementation of > > > AUTO-INC locks needs to be more efficient? > > > > > > > > > > the auto-inc locks are necessary because MySQL binlogging > > assumes that > > > auto-inc values for a single SQL statement are determined by the > > auto-inc > > > value of the first insert in that statement. > > > > > > If you suspect that there is a bug and the auto-inc lock is held > > longer, you > > > should look at InnoDB Lock Monitor output. > > > > > > But also look at possible other bottlenecks. Log flushes, fsync, > > etc. > > > > > > I tested this now. Note that after a table creation or a mysqld > > startup, the > > > very FIRST insert to the table acquires a next-key lock which is > > held for > > > the duration of the whole transaction. But subsequent inserts > > only acquire > > > the AUTO-INC lock, which is held only for the duration of the > > SQL statement. > > > > > > > > > User 1: > > > ........................ > > > > > > heikki@hundin:~/mysql-max-3.23.52-pc-linux-gnu-i686/bin> > > mysql test > > > Welcome to the MySQL monitor. Commands end with ; or \g. > > > Your MySQL connection id is 1 to server version: 3.23.52-max-log > > > > > > Type 'help;' or '\h' for help. Type '\c' to clear the buffer. > > > > > > mysql> set autocommit = 0; > > > Query OK, 0 rows affected (0.00 sec) > > > > > > mysql> insert into kkk(b) values (100); > > > Query OK, 1 row affected (0.00 sec) > > > > > > mysql> commit; > > > Query OK, 0 rows affected (0.00 sec) > > > > > > mysql> insert into kkk(b) values (101); > > > Query OK, 1 row affected (0.00 sec) > > > > > > mysql> insert into kkk(b) values (103); > > > Query OK, 1 row affected (0.00 sec) > > > > > > mysql> commit; > > > Query OK, 0 rows affected (0.00 sec) > > > > > > mysql> select * from kkk; > > > +---+------+ > > > | a | b | > > > +---+------+ > > > | 1 | 34 | > > > | 2 | 34 | > > > | 3 | 12 | > > > | 4 | 15 | > > > | 5 | 100 | > > > | 6 | 101 | > > > | 7 | 102 | > > > | 8 | 103 | > > > | 9 | 104 | > > > +---+------+ > > > 9 rows in set (0.00 sec) > > > > > > mysql> > > > > > > User 2: > > > .............................. > > > > > > heikki@hundin:~/mysql-max-3.23.52-pc-linux-gnu-i686/bin> > > mysql test > > > Welcome to the MySQL monitor. Commands end with ; or \g. > > > Your MySQL connection id is 2 to server version: 3.23.52-max-log > > > > > > Type 'help;' or '\h' for help. Type '\c' to clear the buffer. > > > > > > mysql> set autocommit = 0; > > > Query OK, 0 rows affected (0.00 sec) > > > > > > mysql> insert into kkk(b) values (102); > > > Query OK, 1 row affected (0.00 sec) > > > > > > mysql> insert into kkk(b) values (104); > > > Query OK, 1 row affected (0.00 sec) > > > > > > mysql> commit; > > > Query OK, 0 rows affected (0.00 sec) > > > > > > mysql> > > > > > > > > > > --------------- > > > > regards, > > > > > > > > IOD > > > > --------------- > > > > -- > > > > > > Best regards, > > > > > > Heikki Tuuri > > > Innobase Oy > > > --- > > > InnoDB - transactions, hot backup, and foreign key support for > > MySQL > > > See http://www.innodb.com, download MySQL-Max > > from http://www.mysql.com > > > > > > sql query > > > > > > > > > > > -- > > __________________________________________________________ > > Sign-up for your own FREE Personalized E-mail at Mail.com > > http://www.mail.com/?sr=signup > > > > > > --------------------------------------------------------------------- > > Before posting, please check: > > http://www.mysql.com/manual.php (the manual) > > http://lists.mysql.com/ (the list archive) > > > > To request this thread, e-mail <[EMAIL PROTECTED]> > > To unsubscribe, e-mail <mysql-unsubscribe-##L=##[EMAIL PROTECTED]> > > Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php > > > > > -- __________________________________________________________ Sign-up for your own FREE Personalized E-mail at Mail.com http://www.mail.com/?sr=signup --------------------------------------------------------------------- Before posting, please check: http://www.mysql.com/manual.php (the manual) http://lists.mysql.com/ (the list archive) To request this thread, e-mail <[EMAIL PROTECTED]> To unsubscribe, e-mail <mysql-unsubscribe-##L=##[EMAIL PROTECTED]> Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php