1. 18 Jun, 2009 3 commits
    • Alfranio Correia's avatar
    • Alfranio Correia's avatar
      BUG#43929 binlog corruption when max_binlog_cache_size is exceeded · ac1b464a
      Alfranio Correia authored
      Large transactions and statements may corrupt the binary log if the size of the
      cache, which is set by the max_binlog_cache_size, is not enough to store the
      the changes.
      
      In a nutshell, to fix the bug, we save the position of the next character in the
      cache before starting processing a statement. If there is a problem, we simply
      restore the position thus removing any effect of the statement from the cache.
      Unfortunately, to avoid corrupting the binary log, we may end up loosing changes
      on non-transactional tables if they do not fit in the cache. In such cases, we
      store an Incident_log_event in order to stop the slave and alert users that some
      changes were not logged.
      
      Precisely, for every non-transactional changes that do not fit into the cache,
      we do the following:
        a) the statement is *not* logged
        b) an incident event is logged after committing/rolling back the transaction,
        if any. Note that if a failure happens before writing the incident event to
        the binary log, the slave will not stop and the master will not have reported
        any error.
        c) its respective statement gives an error
      
      For transactional changes that do not fit into the cache, we do the following:
        a) the statement is *not* logged
        b) its respective statement gives an error
      
      To work properly, this patch requires two additional things. Firstly, callers to
      MYSQL_BIN_LOG::write and THD::binlog_query must handle any error returned and
      take the appropriate actions such as undoing the effects of a statement. We
      already changed some calls in the sql_insert.cc, sql_update.cc and sql_insert.cc
      modules but the remaining calls spread all over the code should be handled in
      BUG#37148. Secondly, statements must be either classified as DDL or DML because
      DDLs that do not get into the cache must generate an incident event since they
      cannot be rolled back.
      ac1b464a
    • Martin Hansson's avatar
      Merge · 0a214a42
      Martin Hansson authored
      0a214a42
  2. 17 Jun, 2009 17 commits
  3. 16 Jun, 2009 10 commits
    • Martin Hansson's avatar
      Bug#45168: assertion with convert() and empty set value · acc642c8
      Martin Hansson authored
            
      The assertion in String::copy was added in order to avoid
      valgrind errors when the destination was the same as the source.
      Eased restriction to allow for the case when str == NULL.
      acc642c8
    • Georgi Kodinov's avatar
      Addendum to the fix for bug #44821: move partition dependent test · de713f7e
      Georgi Kodinov authored
      to a test file that guarantees the presence of partition code
      de713f7e
    • Kristofer Pettersson's avatar
      Automerge · 7d98d240
      Kristofer Pettersson authored
      7d98d240
    • Kristofer Pettersson's avatar
      Automerge · 5f205e1a
      Kristofer Pettersson authored
      5f205e1a
    • Martin Hansson's avatar
      Merge · 94723b49
      Martin Hansson authored
      94723b49
    • Kristofer Pettersson's avatar
      Automerge · ccfd18de
      Kristofer Pettersson authored
      ccfd18de
    • Georgi Kodinov's avatar
      automerge · 3e56e6b7
      Georgi Kodinov authored
      3e56e6b7
    • Kristofer Pettersson's avatar
      Bug#43758 Query cache can lock up threads in 'freeing items' state · b22d02ad
      Kristofer Pettersson authored
      Early patch submitted for discussion.
      
      It is possible for more than one thread to enter the condition
      in query_cache_insert(), but the condition predicate is to
      signal one thread each time the cache status changes between
      the following states: {NO_FLUSH_IN_PROGRESS,FLUSH_IN_PROGRESS,
      TABLE_FLUSH_IN_PROGRESS}
      
      Consider three threads THD1, THD2, THD3
      
         THD2: select ... => Got a writer in ::store_query
         THD3: select ... => Got a writer in ::store_query
         THD1: flush tables => qc status= FLUSH_IN_PROGRESS;
                            new writers are blocked.
         THD2: select ... => Still got a writer and enters cond in
                             query_cache_insert
         THD3: select ... => Still got a writer and enters cond in
                             query_cache_insert
         THD1: flush tables => finished and signal status change.
         THD2: select ... => Wakes up and completes the insert.
         THD3: select ... => Happily waiting for better times. Why hurry?
      
      This patch is a refactoring of this lock system. It introduces four new methods:
         Query_cache::try_lock()
         Query_cache::lock()
         Query_cache::lock_and_suspend()
         Query_cache::unlock()
      
      This change also deprecates wait_while_table_flush_is_in_progress(). All threads are
      queued and put on a conditional wait. On each unlock the queue is signalled. This resolve
      the issues with left over threads. To assure that no threads are spending unnecessary
      time waiting a signal broadcast is issued every time a lock is taken before a full
      cache flush.
      b22d02ad
    • Martin Hansson's avatar
      Merge · 4c4c7ccc
      Martin Hansson authored
      4c4c7ccc
    • Georgi Kodinov's avatar
      automerge · 47ca83f2
      Georgi Kodinov authored
      47ca83f2
  4. 15 Jun, 2009 10 commits