1. 22 Dec, 2011 2 commits
    • Vasil Dimov's avatar
      dfc75197
    • Vasil Dimov's avatar
      Fix Bug#13510739 63775: SERVER CRASH ON HANDLER READ NEXT AFTER DELETE RECORD. · 86505c3c
      Vasil Dimov authored
      CREATE TABLE bug13510739 (c INTEGER NOT NULL, PRIMARY KEY (c)) ENGINE=INNODB;
      INSERT INTO bug13510739 VALUES (1), (2), (3), (4);
      DELETE FROM bug13510739 WHERE c=2;
      HANDLER bug13510739 OPEN;
      HANDLER bug13510739 READ `primary` = (2);
      HANDLER bug13510739 READ `primary` NEXT;  <-- crash
      
      The bug is that in the particular testcase row_search_for_mysql() picked up
      a delete-marked record and quit, leaving the cursor non-positioned state and
      on the subsequent 'get next' call the code crashed because of the
      non-positioned cursor.
      
      In row0sel.cc (line numbers from mysql-trunk):
      
      4653         if (rec_get_deleted_flag(rec, comp)) {
      ...
      4679                 if (index == clust_index && unique_search) {
      4680 
      4681                         err = DB_RECORD_NOT_FOUND;
      4682                         
      4683                         goto normal_return;
      4684                 }       
      
      it quit from here, not storing the cursor position.
      
      In contrast, if the record=2 is not found at all (e.g. sleep(1) after DELETE
      to let the purge wipe it away completely) then 'get = 2' does find record=3
      and quits from here:
      
      4366                 if (0 != cmp_dtuple_rec(search_tuple, rec, offsets)) {
      ...
      4394                         btr_pcur_store_position(pcur, &mtr);
      4395 
      4396                         err = DB_RECORD_NOT_FOUND;
      4397 #if 0
      4398                         ut_print_name(stderr, trx, FALSE, index->name);
      4399                         fputs(" record not found 3\n", stderr);
      4400 #endif
      4401 
      4402                         goto normal_return;
      
      Another fix could be to extend the condition on line 4366 to hold only if
      seach_tuple matches rec AND if rec is not delete marked.
      
      Notice that in the above test case if we wait about 1 second somewhere after
      DELETE and before 'get = 2', then the testcase does not crash and returns 4
      instead. Not sure if this is the correct behavior, but this bugfix removes
      the crash and makes the code return what it also returns in the non-crashing
      case (if rec=2 is not found during 'get = 2', e.g. we have sleep(1) there).
      
      Approved by:	Marko (http://bur03.no.oracle.com/rb/r/863/)
      86505c3c
  2. 16 Dec, 2011 13 commits
  3. 15 Dec, 2011 7 commits
  4. 14 Dec, 2011 6 commits
    • Andrei Elkin's avatar
      · be7fc143
      Andrei Elkin authored
      bug#13437900
      post-push changes to please solaris compiler.
      be7fc143
    • Mattias Jonsson's avatar
      merged bug#12361113. · 7e63c8ac
      Mattias Jonsson authored
      Also added tests for partitions key caches.
      7e63c8ac
    • Mattias Jonsson's avatar
      merge · 52076824
      Mattias Jonsson authored
      52076824
    • Andrei Elkin's avatar
      Bug#13437900 - VALGRIND REPORTS A LEAK FOR REPL_IGNORE_SERVER_IDS · ed3e19ac
      Andrei Elkin authored
      There was memory leak when running some tests on PB2.
      The reason of the failure is an early return from change_master()
      that was supposed to deallocate a dyn-array.
      
      Actually the same bug58915 was fixed in trunk with relocating the dyn-array
      destruction into THD::cleanup_after_query() which can't be bypassed.
      The current patch backports magne.mahre@oracle.com-20110203101306-q8auashb3d7icxho
      and adds two optimizations: were done: the static buffer for the dyn-array to base on,
      and the array initialization is called precisely when it's necessary rather than
      per each CHANGE-MASTER as before.
      
      
      mysql-test/suite/rpl/t/rpl_empty_master_host.test:
        the test is binlog-format insensitive so it will be run with MIXED mode only.
      mysql-test/suite/rpl/t/rpl_server_id_ignore.test:
        the test is binlog-format insensitive so it will be run with MIXED mode only.
      sql/sql_class.cc:
        relocating the dyn-array
        destruction into THD::cleanup_after_query().
      sql/sql_lex.cc:
        LEX.mi zero initialization is done in LEX().
      sql/sql_lex.h:
        Optimization for repl_ignore_server_ids to base on a static buffer
        which size is chosen to fit to most common use cases.
      sql/sql_repl.cc:
        dyn-array destruction is relocated to THD::cleanup_after_query().
      sql/sql_yacc.yy:
        Refining logics of Lex->mi.repl_ignore_server_ids initialization.
        The array is initialized once a corresponding option in CHANGE MASTER token sequence
        is found.
      ed3e19ac
    • Mattias Jonsson's avatar
      merge · 3ea35d31
      Mattias Jonsson authored
      3ea35d31
    • Georgi Kodinov's avatar
      Addendum to the fix for bug #11754011: fixed a testcase result to include · 2b05ef11
      Georgi Kodinov authored
      the new --slow-start-timeout option's help output
      2b05ef11
  5. 13 Dec, 2011 3 commits
    • Georgi Kodinov's avatar
      Bug#11754011: 45546: START WINDOWS SERVICE, THEN EXECUTE WHAT IS NEEDED. · a64a25ba
      Georgi Kodinov authored
      Added a global read-only option slow-start-timeout to control the
      Windows service control manager's service start timeout, that was
      currently hard-coded to be 15 seconds.
      The default of the new option is 15 seconds.
      The timeout can also be set to 0 (to mean no timeout applicable).
      a64a25ba
    • Annamalai Gurusami's avatar
      76383243
    • Annamalai Gurusami's avatar
      Bug #13117023: Innodb increments handler_read_key when it should not · ad84fb5c
      Annamalai Gurusami authored
      The counter handler_read_key (SSV::ha_read_key_count) is incremented 
      incorrectly.
      
      The mysql server maintains a per thread system_status_var (SSV)
      object.  This object contains among other things the counter
      SSV::ha_read_key_count. The purpose of this counter is to measure the
      number of requests to read a row based on a key (or the number of
      index lookups).
      
      This counter was wrongly incremented in the
      ha_innobase::innobase_get_index(). The fix removes
      this increment statement (for both innodb and innodb_plugin).
      
      The various callers of the innobase_get_index() was checked to
      determine if anybody must increment this counter (if they first call
      innobase_get_index() and then perform an index lookup).  It was found
      that no caller of innobase_get_index() needs to worry about the
      SSV::ha_read_key_count counter.
      ad84fb5c
  6. 12 Dec, 2011 6 commits
  7. 08 Dec, 2011 2 commits
    • unknown's avatar
      Bug #13116225 LIVE DOWNGRADE CRASHES WITH INNODB_PAGE_SIZE=4K · 7532976d
      unknown authored
      This bug ensures that a live downgrade from an InnoDB 5.6 with WL5756 and
      a database created with innodb-page-size=8k or 4k will make a version 5.5
      installation politely refuse to start. Instead of crashing or giving some
      indication about a corrupted database, it will indicate the page size
      difference. 
      
      This patch takes only that part of the Wl5756 patch that is needed to
      protect against opening a tablespace that is stamped with a different
      page size.
      
      It also contains the change in dict_index_find_on_id_low() just in case
      a database with another page size is created by recompiling a pre-WL5756
      InnoDB.
      7532976d
    • Jimmy Yang's avatar
      Fix Bug #13083023 - 60229: BROKEN COMPATIBILITY: ERROR WHILE CREATE TABLE · 8bb893f5
      Jimmy Yang authored
      WITH FOREIGN KEY CONSTRAI
      
      rb://844 approved by marko
      8bb893f5
  8. 07 Dec, 2011 1 commit
    • Inaam Rana's avatar
      Bug#11759044 - 51325: DROPPING AN EMPTY INNODB TABLE TAKES A LONG TIME · 358a31df
      Inaam Rana authored
      WITH LARGE BUFFER POOL
      
      (Note: this a backport of revno:3472 from mysql-trunk)
      
      rb://845
      approved by: Marko
      
        When dropping a table (with an .ibd file i.e.: with
        innodb_file_per_table set) we scan entire LRU to invalidate pages from
        that table. This can be painful in case of large buffer pools as we hold
        the buf_pool->mutex for the scan. Note that gravity of the problem does
        not depend on the size of the table. Even with an empty table but a
        large and filled up buffer pool we'll end up scanning a very long LRU
        list.
        
        The fix is to scan flush_list and just remove the blocks belonging to
        the table from the flush_list, marking them as non-dirty. The blocks
        are left in the LRU list for eventual eviction due to aging. The
        flush_list is typically much smaller than the LRU list but for cases
        where it is very long we have the solution of releasing the
        buf_pool->mutex after scanning 1K pages.
        
        buf_page_[set|unset]_sticky(): Use new IO-state BUF_IO_PIN to ensure
        that a block stays in the flush_list and LRU list when we release
        buf_pool->mutex. Previously we have been abusing BUF_IO_READ to achieve
        this.
      358a31df