• Filipe Manana's avatar
    btrfs: send: avoid unnecessary backref lookups when finding clone source · 22a3c0ac
    Filipe Manana authored
    
    
    At find_extent_clone(), unless we are given an inline extent, a file
    extent item that represents hole or an extent that starts beyond the
    i_size, we always do backref walking to look for clone sources, unless
    if we have more than SEND_MAX_EXTENT_REFS (64) known references on the
    extent.
    
    However if we know we only have one reference in the extent item and only
    one clone source (the send root), then it's pointless to do the backref
    walking to search for clone sources, as we can't clone from any other
    root. So skip the backref walking in that case.
    
    The following test was run on a non-debug kernel (Debian's default kernel
    config):
    
       $ cat test.sh
       #!/bin/bash
    
       DEV=/dev/sdi
       MNT=/mnt/sdi
    
       mkfs.btrfs -f $DEV
       mount $DEV $MNT
    
       # Create an extent tree that's not too small and none of the
       # extents is shared.
       for ((i = 1; i <= 50000; i++)); do
          xfs_io -f -c "pwrite 0 4K" $MNT/file_$i > /dev/null
          echo -ne "\r$i files created..."
       done
       echo
    
       btrfs subvolume snapshot -r $MNT $MNT/snap
    
       start=$(date +%s%N)
       btrfs send $MNT/snap > /dev/null
       end=$(date +%s%N)
    
       dur=$(( (end - start) / 1000000 ))
       echo -e "\nsend took $dur milliseconds"
    
       umount $MNT
    
    Before this change:
    
       send took 5389 milliseconds
    
    After this change:
    
       send took 4519 milliseconds  (-16.1%)
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    22a3c0ac
send.c 205 KB