• Filipe David Borba Manana's avatar
    Btrfs: reduce btree node locking duration on item update · eb653de1
    Filipe David Borba Manana authored
    If we do a btree search with the goal of updating an existing item
    without changing its size (ins_len == 0 and cow == 1), then we never
    need to hold locks on upper level nodes (even when slot == 0) after we
    COW their child nodes/leaves, as we won't have node splits or merges
    in this scenario (that is, no key additions, removals or shifts on any
    nodes or leaves).
    
    Therefore release the locks immediately after COWing the child nodes/leaves
    while navigating the btree, even if their parent slot is 0, instead of
    returning a path to the caller with those nodes locked, which would get
    released only when the caller releases or frees the path (or if it calls
    btrfs_unlock_up_safe).
    
    This is a common scenario, for example when updating inode items in fs
    trees and block group items in the extent tree.
    
    The following benchmarks were performed on a quad core machine with 32Gb
    of ram, using a leaf/node size of 4Kb (to generate deeper fs trees more
    quickly).
    
      sysbench --test=fileio --file-num=131072 --file-total-size=8G \
        --file-test-mode=seqwr --num-threads=512 --file-block-size=8192 \
        --max-requests=100000 --file-io-mode=sync [prepare|run]
    
    Before this change:  49.85Mb/s (average of 5 runs)
    After this change:   50.38Mb/s (average of 5 runs)
    Signed-off-by: default avatarFilipe David Borba Manana <fdmanana@gmail.com>
    Signed-off-by: default avatarJosef Bacik <jbacik@fb.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    eb653de1
ctree.c 153 KB