1. 18 Jun, 2009 5 commits
    • Alfranio Correia's avatar
      b71fe23b
    • Alfranio Correia's avatar
    • Alfranio Correia's avatar
    • Alfranio Correia's avatar
      BUG#43929 binlog corruption when max_binlog_cache_size is exceeded · 3cf052b7
      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.
      3cf052b7
    • Martin Hansson's avatar
      Merge · 37b2b7fa
      Martin Hansson authored
      37b2b7fa
  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 · aa8677bc
      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.
      
      
      mysql-test/r/func_set.result:
        Bug#45168: Test result
      mysql-test/t/func_set.test:
        Bug#45168: Test case
      sql/item_strfunc.cc:
        Bug#45168: Code cleanup and grammar correction in comment
      sql/sql_string.cc:
        Bug#45168: Fix
      aa8677bc
    • Georgi Kodinov's avatar
      Addendum to the fix for bug #44821: move partition dependent test · 48d911e7
      Georgi Kodinov authored
      to a test file that guarantees the presence of partition code
      48d911e7
    • Kristofer Pettersson's avatar
      Automerge · 86c03462
      Kristofer Pettersson authored
      86c03462
    • Kristofer Pettersson's avatar
      Automerge · 19d5d486
      Kristofer Pettersson authored
      19d5d486
    • Martin Hansson's avatar
      Merge · 00900db5
      Martin Hansson authored
      00900db5
    • Kristofer Pettersson's avatar
      Automerge · b9e1ee63
      Kristofer Pettersson authored
      b9e1ee63
    • Georgi Kodinov's avatar
      automerge · 84241af5
      Georgi Kodinov authored
      84241af5
    • Kristofer Pettersson's avatar
      Bug#43758 Query cache can lock up threads in 'freeing items' state · 02e5ad98
      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.
      
      mysql-test/r/query_cache_debug.result:
        * Added test case for bug43758
      mysql-test/t/query_cache_debug.test:
        * Added test case for bug43758
      sql/sql_cache.cc:
        * Replaced calls to wait_while_table_flush_is_in_progress() with
          calls to try_lock(), lock_and_suspend() and unlock().
        * Renamed enumeration Cache_status to Cache_lock_status.
        * Renamed enumeration items to UNLOCKED, LOCKED_NO_WAIT and LOCKED.
          If the LOCKED_NO_WAIT lock type is used to lock the query cache, other
          threads using try_lock() will fail to acquire the lock.
          This is useful if the query cache is temporary disabled due to 
          a full table flush.
      sql/sql_cache.h:
        * Replaced calls to wait_while_table_flush_is_in_progress() with
          calls to try_lock(), lock_and_suspend() and unlock().
        * Renamed enumeration Cache_status to Cache_lock_status.
        * Renamed enumeration items to UNLOCKED, LOCKED_NO_WAIT and LOCKED.
          If the LOCKED_NO_WAIT lock type is used to lock the query cache, other
          threads using try_lock() will fail to acquire the lock.
          This is useful if the query cache is temporary disabled due to 
          a full table flush.
      02e5ad98
    • Martin Hansson's avatar
      Merge · 5d44b2f3
      Martin Hansson authored
      5d44b2f3
    • Georgi Kodinov's avatar
      automerge · 4cd97cc7
      Georgi Kodinov authored
      4cd97cc7
  4. 15 Jun, 2009 8 commits