• Kristian Nielsen's avatar
    MDEV-27436: binlog corruption (/tmp no space left on device at the same moment) · 6fa69ad7
    Kristian Nielsen authored
    This commit fixes several bugs in error handling around disk full when
    writing the statement/transaction binlog caches:
    
    1. If the error occurs during a non-transactional statement, the code
    attempts to binlog the partially executed statement (as it cannot roll
    back). The stmt_cache->error was still set from the disk full error. This
    caused MYSQL_BIN_LOG::write_cache() to get an error while trying to read the
    cache to copy it to the binlog. This was then wrongly interpreted as a disk
    full error writing to the binlog file. As a result, a partial event group
    containing just a GTID event (no query or commit) was binlogged. Fixed by
    checking if an error is set in the statement cache, and if so binlog an
    INCIDENT event instead of a corrupt event group, as for other errors.
    
    2. For LOAD DATA LOCAL INFILE, if a disk full error occured while writing to
    the statement cache, the code would attempt to abort and read-and-discard
    any remaining data sent by the client. The discard code would however
    continue trying to write data to the statement cache, and wrongly interpret
    another disk full error as end-of-file from the client. This left the client
    connection with extra data which corrupts the communication for the next
    command, as well as again causing an corrupt/incomplete event to be
    binlogged. Fixed by restoring the default read function before reading any
    remaining data from the client connection.
    Reviewed-by: default avatarAndrei Elkin <andrei.elkin@mariadb.com>
    Signed-off-by: default avatarKristian Nielsen <knielsen@knielsen-hq.org>
    6fa69ad7
log.cc 328 KB