1
0
mirror of https://github.com/MariaDB/server.git synced 2026-01-06 05:22:24 +03:00
Files
mariadb/sql
Alfranio Correia a0946fa3d1 BUG#50038 Deadlock on flush logs with concurrent DML and RBR
In auto-commit mode, updating both trx and non-trx tables (i.e. issuing a mixed
statement) causes the following sequence of events:

1 - "Flush trx changes" (MYSQL_BIN_LOG::write) - T1:
  1.1 - mutex_lock (&LOCK_log)
  1.2 - mutex_lock (&LOCK_prep_xids)
  1.3 - increase prepared_xids
  1.4 - mutex_unlock (&LOCK_prep_xids)
  1.5 - mutex_unlock (&LOCK_log)

2 - "Flush non-trx changes" (MYSQL_BIN_LOG::write) - T1:
  2.1 - mutex_lock (&LOCK_log)
  2.2 - mutex_unlock (&LOCK_log)

3. "unlog" - T1
  3.1 - mutex_lock (&LOCK_prep_xids)
  3.2 - decrease prepared xids
  3.3 - pthread_cond_signal(&COND_prep_xids);
  3.4 - mutex_unlock (&LOCK_prep_xids)

The "FLUSH logs" command produces the following sequence of events:

1 - "FLUSH logs" command (MYSQL_BIN_LOG::new_file_impl) - user thread:
  1.1 - mutex_lock (&LOCK_log)
  1.2 - mutex_lock (&LOCK_prep_xids)
  1.3 - while (prepared_xids)  pthread_cond_wait(..., &LOCK_prep_xids);
  1.4 - mutex_unlock (&LOCK_prep_xids)
  1.5 - mutex_unlock (&LOCK_log)

A deadlock will arise if T1 flushes the trx changes and thus increases
prepared_xids but before it is able to continue the execution and flush the
non-trx changes, an user thread calls the "FLUSH logs" command and wait that
the prepared_xids is decreased and gets to zero. However, T1 cannot proceed
with the call to "Flush non-trx changes" because it will block in the mutex
"LOCK_log" and by consequence cannot complete the execution and call the
unlog to decrease the prepared_xids.

To fix the problem, we ensure that the non-trx changes are always flushed
before the trx changes.

Note that if you call "Flush non-trx changes" and a concurrent "FLUSH logs" is
issued, the "Flush non-trx changes" may block, but a deadlock will never happen
because the prepared_xids will eventually get to zero. Bottom line, there will
not be any transaction able to increase the prepared_xids because they will
block in the mutex "LOCK_log" (MYSQL_BIN_LOG::write) and those that increased
the prepared_xids will eventually commit and decrease the prepared_xids.
2010-01-05 16:55:23 +00:00
..
2009-09-29 17:38:40 +02:00
2009-10-24 09:57:31 +03:00
2009-09-10 15:30:03 +05:00
2009-11-03 20:45:52 +03:00
2009-08-28 18:21:54 +02:00
2008-11-27 12:33:04 +01:00
2009-07-28 22:44:28 +04:00
2008-11-22 01:10:38 +01:00
2008-08-25 21:18:22 +04:00
2009-06-01 16:00:38 +04:00
2009-11-03 20:45:52 +03:00
2009-09-26 12:49:49 +08:00
2009-09-26 12:49:49 +08:00
2008-07-03 23:41:22 +04:00
2008-07-03 23:41:22 +04:00
2009-04-29 07:59:10 +05:00
2009-04-29 07:59:10 +05:00
2008-01-23 13:26:41 -07:00
2009-08-28 18:21:54 +02:00
2009-06-17 16:56:44 +02:00
2009-06-17 16:56:44 +02:00
2008-12-10 18:16:21 +04:00
2009-09-17 17:25:52 +02:00
2009-06-17 16:56:44 +02:00
2009-11-03 19:02:56 +00:00
2009-09-26 12:49:49 +08:00
2009-11-03 20:45:52 +03:00
2009-05-15 12:11:07 +05:00
2009-06-29 16:00:47 +02:00
2009-06-17 16:56:44 +02:00
2009-09-17 17:25:52 +02:00
2009-06-17 16:56:44 +02:00