• unknown's avatar
    BUG#25712 - insert delayed and check table run together report crashed · e1e83a8b
    unknown authored
                tables
    
    In case system doesn't have native pread/pwrite calls (e.g. Windows)
    and there is CHECK TABLE runs concurrently with another statement that
    reads from a table, the table may be reported as crashed.
    
    This is fixed by locking file descriptor when my_seek is executed on
    MyISAM index file and emulated pread/pwrite may be executed concurrently.
    
    Affects MyISAM tables on platforms that do not have native
    pread/pwrite calls (e.g. Windows).
    
    No deterministic test case for this bug.
    
    
    myisam/mi_check.c:
      Key file descriptor is shared among threads and mixed set of
      my_pread/my_pwrite and my_seek calls is possible. This is not
      a problem on systems that have native pread/pwrite calls.
      
      In case system doesn't have native pread/pwrite calls (e.g. Windows)
      we must ensure that my_pread/my_pwrite are not executed at the same
      time with my_seek. This is done by passing MY_THREADSAFE flag to
      my_seek.
    mysys/my_seek.c:
      On platforms that do not have native pread/pwrite calls (e.g. Windows)
      these calls are emulated as follow: lock fd, lseek, read, unlock fd.
      
      In case file descriptor is shared among threads, where one thread
      executes my_pread and another thread executes my_seek, we may read
      from a wrong position. This may happen because my_seek doesn't lock
      fd and thus may be executed by another thread after emulated pread
      has done lseek and before it has done read.
      
      To fix problem mentioned above we introduce new flag MY_THREADSAFE to
      my_seek, which is meaningful only in case pread/pwrite calls are
      emulated. If this flag is set, lseek operation is performed as follow:
      lock fd, seek, unlock fd.
    e1e83a8b
my_seek.c 3.16 KB