1. 29 Aug, 2011 13 commits
    • Tor Didriksen's avatar
      local merge · 74e7990a
      Tor Didriksen authored
      74e7990a
    • Jimmy Yang's avatar
      33aab143
    • Tor Didriksen's avatar
      merge 5.1 => 5.5 · afba17f1
      Tor Didriksen authored
      afba17f1
    • Tor Didriksen's avatar
      BUG#12911710 - VALGRIND FAILURE IN ROW-DEBUG:PERFSCHEMA.SOCKET_SUMMARY_BY_INSTANCE_FUNC · 4bcf5065
      Tor Didriksen authored
      Converting the number zero to binary and back yielded the number zero,
      but with no digits, i.e. zero precision.
      This made the multiply algorithm go haywire in various ways.
      4bcf5065
    • Tor Didriksen's avatar
      local merge · dc7bc644
      Tor Didriksen authored
      dc7bc644
    • Tor Didriksen's avatar
      local merge · 2b263552
      Tor Didriksen authored
      2b263552
    • Marko Mäkelä's avatar
      Merge mysql-5.5 to working copy. · d6a467b8
      Marko Mäkelä authored
      d6a467b8
    • Jimmy Yang's avatar
      Fix Bug #12882177 - INSTRUMENTATION IN PFS_MUTEX_ENTER_NOWAIT_FUNC IS INCORRECT · 998d7d15
      Jimmy Yang authored
      Use PSI_MUTEX_TRYLOCK instead of PSI_MUTEX_LOCK when acquire mutex with
      "no_wait" option
            
      Approved by Sunny Bains
      998d7d15
    • Marko Mäkelä's avatar
      Merge mysql-5.1 to mysql-5.5. · 79a03447
      Marko Mäkelä authored
      79a03447
    • Marko Mäkelä's avatar
      Bug#12704861 Corruption after a crash during BLOB update · 41bb3537
      Marko Mäkelä authored
      The fix of Bug#12612184 broke crash recovery. When a record that
      contains off-page columns (BLOBs) is updated, we must first write redo
      log about the BLOB page writes, and only after that write the redo log
      about the B-tree changes. The buggy fix would log the B-tree changes
      first, meaning that after recovery, we could end up having a record
      that contains a null BLOB pointer.
      
      Because we will be redo logging the writes off the off-page columns
      before the B-tree changes, we must make sure that the pages chosen for
      the off-page columns are free both before and after the B-tree
      changes. In this way, the worst thing that can happen in crash
      recovery is that the BLOBs are written to free pages, but the B-tree
      changes are not applied. The BLOB pages would correctly remain free in
      this case. To achieve this, we must allocate the BLOB pages in the
      mini-transaction of the B-tree operation. A further quirk is that BLOB
      pages are allocated from the same file segment as leaf pages. Because
      of this, we must temporarily "hide" any leaf pages that were freed
      during the B-tree operation by "fake allocating" them prior to writing
      the BLOBs, and freeing them again before the mtr_commit() of the
      B-tree operation, in btr_mark_freed_leaves().
      
      btr_cur_mtr_commit_and_start(): Remove this faulty function that was
      introduced in the Bug#12612184 fix. The problem that this function was
      trying to address was that when we did mtr_commit() the BLOB writes
      before the mtr_commit() of the update, the new BLOB pages could have
      overwritten clustered index B-tree leaf pages that were freed during
      the update. If recovery applied the redo log of the BLOB writes but
      did not see the log of the record update, the index tree would be
      corrupted. The correct solution is to make the freed clustered index
      pages unavailable to the BLOB allocation. This function is also a
      likely culprit of InnoDB hangs that were observed when testing the
      Bug#12612184 fix.
      
      btr_mark_freed_leaves(): Mark all freed clustered index leaf pages of
      a mini-transaction allocated (nonfree=TRUE) before storing the BLOBs,
      or freed (nonfree=FALSE) before committing the mini-transaction.
      
      btr_freed_leaves_validate(): A debug function for checking that all
      clustered index leaf pages that have been marked free in the
      mini-transaction are consistent (have not been zeroed out).
      
      btr_page_alloc_low(): Refactored from btr_page_alloc(). Return the
      number of the allocated page, or FIL_NULL if out of space. Add the
      parameter "mtr_t* init_mtr" for specifying the mini-transaction where
      the page should be initialized, or if this is a "fake allocation"
      (init_mtr=NULL) by btr_mark_freed_leaves(nonfree=TRUE).
      
      btr_page_alloc(): Add the parameter init_mtr, allowing the page to be
      initialized and X-latched in a different mini-transaction than the one
      that is used for the allocation. Invoke btr_page_alloc_low(). If a
      clustered index leaf page was previously freed in mtr, remove it from
      the memo of previously freed pages.
      
      btr_page_free(): Assert that the page is a B-tree page and it has been
      X-latched by the mini-transaction. If the freed page was a leaf page
      of a clustered index, link it by a MTR_MEMO_FREE_CLUST_LEAF marker to
      the mini-transaction.
      
      btr_store_big_rec_extern_fields_func(): Add the parameter alloc_mtr,
      which is NULL (old behaviour in inserts) and the same as local_mtr in
      updates. If alloc_mtr!=NULL, the BLOB pages will be allocated from it
      instead of the mini-transaction that is used for writing the BLOBs.
      
      fsp_alloc_from_free_frag(): Refactored from
      fsp_alloc_free_page(). Allocate the specified page from a partially
      free extent.
      
      fseg_alloc_free_page_low(), fseg_alloc_free_page_general(): Add the
      parameter "mtr_t* init_mtr" for specifying the mini-transaction where
      the page should be initialized, or NULL if this is a "fake allocation"
      that prevents the reuse of a previously freed B-tree page for BLOB
      storage. If init_mtr==NULL, try harder to reallocate the specified page
      and assert that it succeeded.
      
      fsp_alloc_free_page(): Add the parameter "mtr_t* init_mtr" for
      specifying the mini-transaction where the page should be initialized.
      Do not allow init_mtr == NULL, because this function is never to be
      used for "fake allocations".
      
      mtr_t: Add the operation MTR_MEMO_FREE_CLUST_LEAF and the flag
      mtr->freed_clust_leaf for quickly determining if any
      MTR_MEMO_FREE_CLUST_LEAF operations have been posted.
      
      row_ins_index_entry_low(): When columns are being made off-page in
      insert-by-update, invoke btr_mark_freed_leaves(nonfree=TRUE) and pass
      the mini-transaction as the alloc_mtr to
      btr_store_big_rec_extern_fields(). Finally, invoke
      btr_mark_freed_leaves(nonfree=FALSE) to avoid leaking pages.
      
      row_build(): Correct a comment, and add a debug assertion that a
      record that contains NULL BLOB pointers must be a fresh insert.
      
      row_upd_clust_rec(): When columns are being moved off-page, invoke
      btr_mark_freed_leaves(nonfree=TRUE) and pass the mini-transaction as
      the alloc_mtr to btr_store_big_rec_extern_fields(). Finally, invoke
      btr_mark_freed_leaves(nonfree=FALSE) to avoid leaking pages.
      
      buf_reset_check_index_page_at_flush(): Remove. The function
      fsp_init_file_page_low() already sets
      bpage->check_index_page_at_flush=FALSE.
      
      There is a known issue in tablespace extension. If the request to
      allocate a BLOB page leads to the tablespace being extended, crash
      recovery could see BLOB writes to pages that are off the tablespace
      file bounds. This should trigger an assertion failure in fil_io() at
      crash recovery. The safe thing would be to write redo log about the
      tablespace extension to the mini-transaction of the BLOB write, not to
      the mini-transaction of the record update. However, there is no redo
      log record for file extension in the current redo log format.
      
      rb:693 approved by Sunny Bains
      41bb3537
    • Tor Didriksen's avatar
      980f43e8
    • Tor Didriksen's avatar
      merge 5.1 => 5.5 · 901ed42e
      Tor Didriksen authored
      901ed42e
    • Rohit Kalhans's avatar
      Null-merge from 5.1 · 10637a25
      Rohit Kalhans authored
      10637a25
  2. 26 Aug, 2011 1 commit
    • Rohit Kalhans's avatar
      BUG#11878104: FIXES OF BUG 11752963 - 44312 TO BACKPORT TO MYSQL-5.1 · 2529effa
      Rohit Kalhans authored
      Background: Backporting fix for BUG 11752963 to Mysql5.1 branch.
      Problem: Fix of bug 11752963 was only available for trunk and 5.5 branch.
      Partial fix has been pushed to 5.1 branch as well. 
      Fix: backporting the fixes of bug 11752963 to 5.1 branch. 
      1. Made all major changes to make 5.1 branch in line with 5.5 and the trunk.
      2. skipped the partial patch that was already applied to the 5.1 branch. 
      2529effa
  3. 25 Aug, 2011 1 commit
    • Tor Didriksen's avatar
      Bug#12856915 VALGRIND FAILURE IN FILESORT/CREATE_SORT_INDEX · db065d27
      Tor Didriksen authored
      Suppress the known warnings generated by filesort().
      
      The real fix belongs to worklog 1509:
      Pack values of non-sorted fields in the sort buffer
      (which is basically the same issue, but in an optimization context:
       We are writing the entire sort buffer to disk, 
       including un-used space for varchar columns.)
      db065d27
  4. 24 Aug, 2011 2 commits
  5. 22 Aug, 2011 2 commits
  6. 19 Aug, 2011 3 commits
  7. 18 Aug, 2011 1 commit
    • Sergey Vojtovich's avatar
      BUG#11763712 - 56458: KILLING A FLUSH TABLE FOR A MERGE/CHILD · 06fa1ef4
      Sergey Vojtovich authored
                            CRASHES SERVER
      
      Flushing of MERGE table or one of its child tables, which was
      locked by flushing thread using LOCK TABLES, might have caused
      crashes or assertion failures if the thread failed to reopen
      child or parent table.
      Particularly, this might have happened when another connection
      killed this FLUSH TABLE statement/connection.
      Also this problem might have occurred when we failed to reopen
      MERGE table or one of its children when executing DDL statement
      under LOCK TABLES.
      
      The problem was caused by the fact that reopen_tables() might
      have failed to reopen child table but still tried to reopen,
      reattach children for and re-lock its parent. Vice versa it
      might have failed to reopen parent but kept references from
      children to parent around. Since reopen_tables() closes table
      it has failed to reopen and therefore frees all associated
      memory such dangling references led to crashes when followed.
      
      This patch solves this problem by ensuring that we always close
      parent table and all its children if we fail to reopen this
      table or one of its children. Same happens if we fail to reattach
      children to parent.
      
      Affects 5.1 only.
      06fa1ef4
  8. 17 Aug, 2011 3 commits
  9. 16 Aug, 2011 3 commits
  10. 15 Aug, 2011 5 commits
    • Joerg Bruehe's avatar
      Null-merge, · 29222665
      Joerg Bruehe authored
      conflict on "configure.in" which is gone from 5.5.
      No change.
      29222665
    • Joerg Bruehe's avatar
      Null merge for pushing. · 80afd976
      Joerg Bruehe authored
      80afd976
    • Joerg Bruehe's avatar
      Merge bug#47337 for pushing into 5.1 · 72daf267
      Joerg Bruehe authored
      72daf267
    • Marko Mäkelä's avatar
      065f1863
    • Marko Mäkelä's avatar
      Bug #11766591 59733: Possible deadlock when buffered changes are to be · d5c36400
      Marko Mäkelä authored
      discarded in buf_page_create()
      
      This bug turned out to be a false alarm, a bug in the UNIV_SYNC_DEBUG
      diagnostic code. Because of this, the patch was not backported to the
      built-in InnoDB in MySQL 5.1. Furthermore, there is no test case for
      InnoDB Plugin in MySQL 5.1, because the delete buffering in MySQL 5.5
      makes triggering the failure much easier.
      
      When a freed page for which there exist orphaned buffered changes is
      allocated and reused for something else, buf_page_create() will discard
      the buffered changes by invoking ibuf_merge_or_delete_for_page().
      This would violate the InnoDB latching order.
      
      Tweak the latching order as follows. Move SYNC_IBUF_MUTEX below
      SYNC_FSP_PAGE, where it logically belongs, and assign new latching
      levels for the ibuf->index->lock and the insert buffer B-tree pages:
      
      #define SYNC_IBUF_MUTEX		370	/* ibuf_mutex */
      #define SYNC_IBUF_INDEX_TREE	360
      #define SYNC_IBUF_TREE_NODE_NEW	359
      #define SYNC_IBUF_TREE_NODE	358
      
      btr_block_get(), btr_page_get(): In UNIV_SYNC_DEBUG, add the parameter
      "index" for determining the appropriate latching order
      (SYNC_IBUF_TREE_NODE or SYNC_TREE_NODE).
      
      btr_page_alloc_for_ibuf(), btr_create(): Use SYNC_IBUF_TREE_NODE_NEW
      instead of SYNC_TREE_NODE_NEW for insert buffer pages.
      
      btr_cur_search_to_nth_level(), btr_pcur_restore_position_func(): Use
      SYNC_IBUF_TREE_NODE instead of SYNC_TREE_NODE for insert buffer pages.
      
      btr_search_guess_on_hash(): Assert that the index is not an insert buffer tree.
      
      dict_index_add_to_cache(): Use SYNC_IBUF_INDEX_TREE for the insert
      buffer tree (ibuf->index->lock).
      
      ibuf0ibuf.c: Use SYNC_IBUF_TREE_NODE or SYNC_IBUF_TREE_NODE_NEW for
      all B-tree pages.
      
      ibuf_merge_or_delete_for_page(): Assert that the user page is
      BUF_IO_READ fixed. Only in this way it is OK to latch it as
      SYNC_IBUF_TREE_NODE instead of the proper SYNC_TREE_NODE (which would
      violate the changed latching order).
      
      sync_thread_add_level(): Remove the special tweak for
      SYNC_IBUF_MUTEX. Add rules for the added latching levels.
      
      rb:591 approved by Jimmy Yang
      d5c36400
  11. 12 Aug, 2011 4 commits
  12. 11 Aug, 2011 2 commits
    • Dmitry Lenev's avatar
      Fix for bug #12828477 - "MDL SUBSYSTEM CREATES BIG OVERHEAD · 5a579863
      Dmitry Lenev authored
      FOR CERTAIN QUERIES TO INFORMATION_SCHEMA".
      
      The problem was that metadata locking subsystem introduced
      too much overhead for queries to I_S which were processed by
      opening only .FRM or .TRG files and had to scanned a lot of
      tables (e.g. SELECT COUNT(*) FROM I_S.TRIGGERS was affected). 
      The same effect was not observed for similar queries which 
      performed full-blown table open in order to fill I_S table.
      
      The problem stemmed from the fact that in case when I_S 
      implementation opened only .FRM or .TRG file for each table 
      processed it didn't release metadata lock it has acquired on 
      the table after finishing its processing. As result, list
      of acquired metadata locks were growing until the end of 
      statement. Since acquisition of each new lock required 
      search in the list of already acquired locks performance
      degraded.
      
      The same effect is not observed when I_S implementation
      performs full-blown table open for each table being
      processed, as in the latter cases metadata lock on the
      table is released right after table processing.
      
      This fix addressed the problem by ensuring that I_S 
      implementation releases metadata lock after processing
      the table in both cases of full-blown table open and in 
      case when only .FRM or .TRG file is read.
      5a579863
    • Tatjana Azundris Nuernberg's avatar
      auto-merge · 11ead0c5
      Tatjana Azundris Nuernberg authored
      11ead0c5