• Sergey Vojtovich's avatar
    BUG#51868 - crash with myisam_use_mmap and partitioned · 222909b7
    Sergey Vojtovich authored
                myisam tables
    
    Queries following TRUNCATE of partitioned MyISAM table
    may crash server if myisam_use_mmap is true.
    
    Internally this is MyISAM bug, but limited to partitioned
    tables, because MyISAM doesn't use ::delete_all_rows()
    method for TRUNCATE, but goes via table recreate instead.
    
    MyISAM didn't properly fall back to non-mmaped I/O after
    mmap() failure. Was not repeatable on linux before, likely
    because (quote from man mmap):
      SUSv3  specifies  that  mmap() should fail if length is 0.
      However, in kernels before 2.6.12, mmap() succeeded in
      this case: no mapping was created and the call returned
      addr. Since kernel 2.6.12, mmap() fails with the error
      EINVAL for this case.
    
    mysql-test/r/partition.result:
      A test case for BUG#51868.
    mysql-test/t/partition.test:
      A test case for BUG#51868.
    storage/myisam/mi_delete_all.c:
      _mi_unmap_file() is compressed record format specific,
      which is read-only. As compressed MyISAM data files are
      read-only, we must never use _mi_unmap_file() in
      mi_delete_all_rows().
    storage/myisam/mi_dynrec.c:
      Make myisam mmap code more durable to errors:
      - set file_read/file_write handlers if mmap succeeded;
      - reset file_read/file_write handlers on unmap.
    storage/myisam/mi_extra.c:
      Moved file_read/file_write handlers initialization to
      mi_dynmap_file().
    storage/myisam/myisamdef.h:
      Added mi_munmap_file() declaration.
    222909b7
myisamdef.h 32.8 KB