1. 05 Jan, 2010 2 commits
    • Alfranio Correia's avatar
      merge 5.1-rep+3 --> 5.1-rep+2-delivery1 · 2e35289e
      Alfranio Correia authored
      2e35289e
    • Alfranio Correia's avatar
      BUG#50038 Deadlock on flush logs with concurrent DML and RBR · a0946fa3
      Alfranio Correia authored
      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.
      a0946fa3
  2. 28 Dec, 2009 1 commit
  3. 27 Dec, 2009 1 commit
  4. 24 Dec, 2009 2 commits
  5. 23 Dec, 2009 3 commits
  6. 22 Dec, 2009 2 commits
  7. 21 Dec, 2009 5 commits
  8. 18 Dec, 2009 5 commits
    • Mats Kindahl's avatar
      Merging with mysql.5.1-rep+2 · d78e5ff0
      Mats Kindahl authored
      d78e5ff0
    • Mats Kindahl's avatar
      Merging with mysql-5.1-rep+2 · 3f607c47
      Mats Kindahl authored
      3f607c47
    • Mats Kindahl's avatar
      WL#5151: Conversion between different types · f28ac80b
      Mats Kindahl authored
               when replicating
      
      Post-merge fixes. Updating result files.
      f28ac80b
    • Mats Kindahl's avatar
      WL#5151: Conversion between different types · b524f272
      Mats Kindahl authored
               when replicating
      
      The function create_virtual_tmp_table does not
      set db_low_byte_first in the same way as
      create_tmp_table does, causing copying from
      the virtual table to a real table to get strange
      values for SET types on big-endian machines.
      b524f272
    • Luis Soares's avatar
      BUG#49259: Slave I/O thread could not register on master · 845d7e1e
      Luis Soares authored
      The slave thread changed the format of the information it used to
      connect to the master after patch for BUG 13963.  This resulted
      in old master getting confused, thence rejecting the slave
      connection attempt.
      
      In particular, patch for BUG 13963 removed the rpl_recovery_rank
      variable which was, at that time, packed together with the rest
      of the information which the slave would use to register itself
      on the master. Based on this data, the master would then assert
      that the number of bytes received in the connection command was
      consistent to what it was expecting. 
      
      Therefore, given that a slave, patched with the aforementioned
      patch, would not pack the four bytes related to the
      rpl_recovery_rank variable, the old master would reject the
      connection attempt. It would assume that the data was
      inconsistent (fewer bytes than it was expecting) and return 
      an error.
      
      We fix this by faking an rpl_recovery_rank variable when
      registering the slave on the master. In practice this reverts a
      small part of patch for BUG 13963, the one related to the slave
      connecting to the master.
      845d7e1e
  9. 17 Dec, 2009 3 commits
  10. 16 Dec, 2009 5 commits
  11. 15 Dec, 2009 8 commits
  12. 14 Dec, 2009 3 commits
    • Mats Kindahl's avatar
      WL#5151: Conversion between different types when replicating · c701fe6a
      Mats Kindahl authored
      Fixing minor error when printing SQL types from master and cleaning some code.
      
      Updating result files.
      c701fe6a
    • Sven Sandberg's avatar
      Post-push fixes after wrong merge from 5.1->rep+2->rep+3. · 0758893a
      Sven Sandberg authored
      Problem: The test was written before BUG#45827 was fixed.
      The test contained code that assumed the wrong behavior,
      pre-BUG#45827. Then, the fix for BUG#45827 was merged
      from 5.1-rep+2 to 5.1-rep+3. Since the test case assumed
      the wrong behavior, it failed. This should have been fixed
      by making the test assume the correct behavior, but was
      fixed by updating the result file to assert failure.
      Fix 1: fix the test to assume correct behavior
      (post-BUG#45827), update result file.
      Fix 2: make test fail with 'die' instead of 'exit' when
      wrong behavior is detected. Thus, the test cannot be
      silenced with a wrong result file in case the behavior
      will change again.
      0758893a
    • Mats Kindahl's avatar
      WL#5151: Conversion between different types when replicating · c63df11f
      Mats Kindahl authored
      Row-based replication requires the types of columns on the
      master and slave to be approximately the same (some safe
      conversions between strings are allowed), but does not
      allow safe conversions between fields of similar types such
      as TINYINT and INT.
      
      This patch implement type conversions between similar fields
      on the master and slave.
      
      The conversions are controlled using a new variable
      SLAVE_TYPE_CONVERSIONS of type SET('ALL_LOSSY','ALL_NON_LOSSY').
      
      Non-lossy conversions are any conversions that do not run the
      risk of losing any information, while lossy conversions can
      potentially truncate the value. The column definitions are
      checked to decide if the conversion is acceptable.
      
      If neither conversion is enabled, it is required that the
      definitions of the columns are identical on master and slave.
      
      Conversion is done by creating an internal conversion table,
      unpacking the master data into it, and then copy the data to
      the real table on the slave.
      c63df11f