• Marko Mäkelä's avatar
    MDEV-14244 MariaDB fails to run with O_DIRECT · 30a8764b
    Marko Mäkelä authored
    os_file_set_size(): If posix_fallocate() returns EINVAL, fall back
    to writing zero bytes to the file. Also, remove some error log output,
    and make it possible for a server shutdown to interrupt the fall-back
    code.
    
    MariaDB used to ignore any possible return value from posix_fallocate()
    ever since innodb_use_fallocate was introduced in MDEV-4338. If EINVAL
    was returned, the file would not be extended.
    
    Starting with MDEV-11520, MariaDB would treat EINVAL as a hard error.
    
    Why is the EINVAL returned? The GNU posix_fallocate() function
    would first try the fallocate() system call, which would return
    -EOPNOTSUPP for many file systems (notably, not ext4). Then, it
    would fall back to extending the file one block at a time by invoking
    pwrite(fd, "", 1, offset) where offset is 1 less than a multiple of
    the file block size. This would fail with EINVAL if the file is in
    O_DIRECT mode, because O_DIRECT requires aligned operation.
    30a8764b
os0file.cc 159 KB