• marko's avatar
    branches/zip: Clean up after a crash during DROP INDEX. · 64096ab5
    marko authored
    When InnoDB crashes while dropping an index, ensure that
    the index will be completely dropped during crash recovery.
    
    row_merge_drop_index(): Before dropping an index, rename the index to
    start with TEMP_INDEX_PREFIX_STR and commit the change, so that
    row_merge_drop_temp_indexes() will drop the index after crash
    recovery if the server crashes while dropping the index.
    
    fseg_inode_try_get(): New function, forked from fseg_inode_get().
    Return NULL if the file segment index node is free.
    
    fseg_inode_get(): Assert that the file segment index node is not free.
    
    fseg_free_step(): If the file segment index node is already free,
    print a diagnostic message and return TRUE.
    
    fsp_free_seg_inode(): Write a nonzero number to FSEG_MAGIC_N, so that
    allocated-and-freed file segment index nodes can be better
    distinguished from uninitialized ones.
    
    This is rb://174, addressing Issue #348.
    
    Tested by restarting mysqld upon the completion of the added
    log_write_up_to() invocation below, during DROP INDEX.  The index was
    dropped after crash recovery, and re-issuing the DROP INDEX did not
    crash the server.
    
      Index: btr/btr0btr.c
      ===================================================================
      --- btr/btr0btr.c	(revision 6026)
      +++ btr/btr0btr.c	(working copy)
      @@ -42,6 +42,7 @@ Created 6/2/1994 Heikki Tuuri
       #include "ibuf0ibuf.h"
       #include "trx0trx.h"
      +#include "log0log.h"
       
       /*
       Latching strategy of the InnoDB B-tree
       --------------------------------------
      @@ -873,6 +874,8 @@ leaf_loop:
       
       		goto leaf_loop;
       	}
      +
      +	log_write_up_to(mtr.end_lsn, LOG_WAIT_ALL_GROUPS, TRUE);
       top_loop:
       	mtr_start(&mtr);
    64096ab5
row0merge.c 66.4 KB