• Filipe Manana's avatar
    btrfs: don't set the full sync flag when truncation does not touch extents · 0d7d3165
    Filipe Manana authored
    At btrfs_truncate() where we truncate the inode either to the same size
    or to a smaller size, we always set the full sync flag on the inode.
    
    This is needed in case the truncation drops or trims any file extent items
    that start beyond or cross the new inode size, so that the next fsync
    drops all inode items from the log and scans again the fs/subvolume tree
    to find all items that must be logged.
    
    However if the truncation does not drop or trims any file extent items, we
    do not need to set the full sync flag and force the next fsync to use the
    slow code path. So do not set the full sync flag in such cases.
    
    One use case where it is frequent to do truncations that do not change
    the inode size and do not drop any extents (no prealloc extents beyond
    i_size) is when running Microsoft's SQL Server inside a Docker container.
    One example workload is the one Philipp Fent reported recently, in the
    thread with a link below. In this workload a large number of fsyncs are
    preceded by such truncate operations.
    
    After this change I constantly get the runtime for that workload from
    Philipp to be reduced by about -12%, for example from 184 seconds down
    to 162 seconds.
    
    Link: https://lore.kernel.org/linux-btrfs/93c4600e-5263-5cba-adf0-6f47526e7561@in.tum.de/Tested-by: default avatarAnand Jain <anand.jain@oracle.com>
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    0d7d3165
ctree.h 127 KB