• unknown's avatar
    Bug#8283 - OPTIMIZE TABLE causes data loss · 3109da77
    unknown authored
    OPTIMIZE TABLE with myisam_repair_threads > 1 performs a non-quick 
    parallel repair. This means that it does not only rebuild all 
    indexes, but also the data file.
    
    Non-quick parallel repair works so that there is one thread per 
    index. The first of the threads rebuilds also the new data file.
    
    The problem was that all threads shared the read io cache on the
    old data file. If there were holes (deleted records) in the table,
    the first thread skipped them, writing only contiguous, non-deleted
    records to the new data file. Then it built the new index so that
    its entries pointed to the correct record positions. But the other
    threads didn't know the new record positions, but put the positions
    from the old data file into the index.
    
    The new design is so that there is a shared io cache which is filled
    by the first thread (the data file writer) with the new contiguous
    records and read by the other threads. Now they know the new record
    positions.
    
    Another problem was that for the parallel repair of compressed
    tables a common bit_buff and rec_buff was used. I changed it so
    that thread specific buffers are used for parallel repair.
    
    A similar problem existed for checksum calculation. I made this
    multi-thread safe too.
    
    
    include/my_sys.h:
      Bug#8283 - OPTIMIZE TABLE causes data loss
      Redesign of io_cache_share.
    include/myisam.h:
      Bug#8283 - OPTIMIZE TABLE causes data loss
      Redesign of checksum calculation in mi_check.c.
      'calc_checksum' is now in myisamdef.h:st_mi_sort_param.
    myisam/mi_check.c:
      Bug#8283 - OPTIMIZE TABLE causes data loss
      Implemented a new parallel repair design.
      Using a synchronized shared read/write cache.
      Allowed for thread specific bit_buff, rec_buff, and calc_checksum.
    myisam/mi_open.c:
      Bug#8283 - OPTIMIZE TABLE causes data loss
      Added DBUG output.
    myisam/mi_packrec.c:
      Bug#8283 - OPTIMIZE TABLE causes data loss
      Allowed for thread specific bit_buff and rec_buff.
    myisam/myisamdef.h:
      Bug#8283 - OPTIMIZE TABLE causes data loss
      Commented on checksum calculation variables.
      Allowed for thread specific bit_buff.
      Added DBUG output for better table crash detection.
    myisam/sort.c:
      Bug#8283 - OPTIMIZE TABLE causes data loss
      Added implications of the new parallel repair design.
      Renamed 'info' -> 'sort_param'.
      Added DBUG output.
    mysql-test/r/myisam.result:
      Bug#8283 - OPTIMIZE TABLE causes data loss
      Added test results.
    mysql-test/t/myisam.test:
      Bug#8283 - OPTIMIZE TABLE causes data loss
      Added test cases.
    mysys/mf_iocache.c:
      Bug#8283 - OPTIMIZE TABLE causes data loss
      Redesign of io_cache_share.
      We do now allow a writer to synchronize himself with the
      readers of a shared cache. When all threads join in the lock,
      the writer copies the data from his write buffer to the shared
      read buffer.
    3109da77
mi_open.c 38.7 KB