An error occurred fetching the project authors.
  1. 26 Jan, 2012 1 commit
    • Marko Mäkelä's avatar
      Bug #13413535 61104: INNODB: FAILING ASSERTION: PAGE_GET_N_RECS(PAGE) > 1 · d84c9557
      Marko Mäkelä authored
      This fix does not remove the underlying cause of the assertion
      failure. It just works around the problem, allowing a corrupted
      secondary index to be fixed by DROP INDEX and CREATE INDEX (or in the
      worst case, by re-creating the table).
      
      ibuf_delete(): If the record to be purged is the last one in the page
      or it is not delete-marked, refuse to purge it. Instead, write an
      error message to the error log and let a debug assertion fail.
      
      ibuf_set_del_mark(): If the record to be delete-marked is not found,
      display some more information in the error log and let a debug
      assertion fail.
      
      row_undo_mod_del_unmark_sec_and_undo_update(),
      row_upd_sec_index_entry(): Let a debug assertion fail when the record
      to be delete-marked is not found.
      
      buf_page_print(): Add ut_ad(0) so that corruption will be more
      prominent in stress testing with debug binaries. Add ut_ad(0) here and
      there where corruption is noticed.
      
      btr_corruption_report(): Display some data on page_is_comp() mismatch.
      
      btr_assert_not_corrupted(): A wrapper around btr_corruption_report().
      Assert that page_is_comp() agrees with the table flags.
      
      rb:911 approved by Inaam Rana
      d84c9557
  2. 26 Oct, 2011 2 commits
  3. 30 Sep, 2011 2 commits
  4. 29 Aug, 2011 1 commit
    • Marko Mäkelä's avatar
      Bug#12704861 Corruption after a crash during BLOB update · 41f229cd
      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
      41f229cd
  5. 16 Jun, 2011 1 commit
    • Marko Mäkelä's avatar
      Bug#12612184 Race condition after btr_cur_pessimistic_update() · 5b4ceba5
      Marko Mäkelä authored
      btr_cur_compress_if_useful(), btr_compress(): Add the parameter ibool
      adjust. If adjust=TRUE, adjust the cursor position after compressing
      the page.
      
      btr_lift_page_up(): Return a pointer to the father page.
      
      BTR_KEEP_POS_FLAG: A new flag for btr_cur_pessimistic_update().
      
      btr_cur_pessimistic_update(): If *big_rec != NULL and flags &
      BTR_KEEP_POS_FLAG, keep the cursor positioned on the updated record.
      Also, do not release the index tree x-lock if *big_rec != NULL.
      
      btr_cur_mtr_commit_and_start(): Commits and restarts a
      mini-transaction so that it will retain an x-lock on index->lock and
      the page of the cursor. This is invoked when
      btr_cur_pessimistic_update() returns *big_rec != NULL.
      
      In all callers of btr_cur_pessimistic_update() that do not pass
      BTR_KEEP_POS_FLAG, assert that *big_rec == NULL.
      
      btr_cur_compress(): Unused function [in the built-in MySQL 5.1], remove.
      
      page_rec_get_nth(): Return the nth record on the page (an inverse
      function of page_rec_get_n_recs_before()). Refactored from
      page_get_middle_rec().
      
      page_get_middle_rec(): Invoke page_rec_get_nth().
      
      page_cur_insert_rec_zip_reorg(): Make use of the page directory
      shortcuts in page_rec_get_nth() instead of scanning the whole list of
      records.
      
      row_ins_clust_index_entry_by_modify(): Pass BTR_KEEP_POS_FLAG to
      btr_cur_pessimistic_update().
      
      row_ins_index_entry_low(): If row_ins_clust_index_entry_by_modify()
      returns a big_rec, invoke btr_cur_mtr_commit_and_start() in order to
      commit and start the mini-transaction without releasing the x-locks on
      index->lock and the cursor page, and write the big_rec. Releasing the
      page latch in mtr_commit() caused a race condition.
      
      row_upd_clust_rec(): Pass BTR_KEEP_POS_FLAG to
      btr_cur_pessimistic_update(). If it returns a big_rec, invoke
      btr_cur_mtr_commit_and_start() in order to commit and start the
      mini-transaction without releasing the x-locks on index->lock and the
      cursor page, and write the big_rec. Releasing the page latch in
      mtr_commit() caused a race condition.
      
      sync_thread_add_level(): Add the parameter ibool relock. When TRUE,
      bypass the latching order rules.
      
      rw_lock_add_debug_info(): For nested X-lock requests, pass relock=TRUE
      to sync_thread_add_level().
      
      rb:678 approved by Jimmy Yang
      5b4ceba5
  6. 23 Jun, 2010 1 commit
  7. 07 Aug, 2009 1 commit
    • Guilhem Bichot's avatar
      Renamed storage/innodb_plugin to storage/innobase, so that 1) it's the same · 7ceb29ff
      Guilhem Bichot authored
      layout as we always had in trees containing only the builtin
      2) win\configure.js WITH_INNOBASE_STORAGE_ENGINE still works.
      
      storage/innobase/CMakeLists.txt:
        fix to new directory name (and like 5.1)
      storage/innobase/Makefile.am:
        fix to new directory name (and like 5.1)
      storage/innobase/handler/ha_innodb.cc:
        fix to new directory name (and like 5.1)
      storage/innobase/plug.in:
        fix to new directory name (and like 5.1)
      7ceb29ff
  8. 27 May, 2009 1 commit