You need to sign in or sign up before continuing.
  • Filipe Manana's avatar
    btrfs: insert items in batches when logging a directory when possible · 086dcbfa
    Filipe Manana authored
    
    
    When logging a directory, we scan its directory items from the subvolume
    tree and then copy one by one into the log tree. This is not efficient
    since we generally are able to insert several items in a batch, using a
    single btree operation for adding several items at once. The reason we
    copy items one by one is that we must check if each item was previously
    logged in the current transaction, and if it was we either overwrite it
    or skip it in case its content did not change in the subvolume tree (this
    can happen only for dir item keys, but not for dir index keys), and doing
    such check makes it a bit cumbersome to attempt batch insertions.
    
    However the chances for doing batch insertions are very frequent and
    always happen when:
    
    1) Logging the directory for the first time in the current transaction,
       as none of the items exist in the log tree yet;
    
    2) Logging new dir index keys, because the offset for new dir index keys
       comes from a monotonically increasing counter. This means if we keep
       adding dentries to a directory, through creation of new files and
       sub-directories or by adding new links or renaming from some other
       directory into the one we are logging, all the new dir index keys
       have a new offset that is greater than the offset of any previously
       logged index keys, so we can insert them in batches into the log tree.
    
    For dir item keys, since their offset depends on the result of an hash
    function against the dentry's name, unless the directory is being logged
    for the first time in the current transaction, the chances being able to
    insert the items in the log using batches is pretty much random and not
    predictable, as it depends on the names of the dentries, but still happens
    often enough.
    
    So change directory logging to keep track of consecutive directory items
    that don't exist yet in the log and batch insert them.
    
    This patch is part of a patchset comprised of the following 5 patches:
    
      btrfs: remove root argument from btrfs_log_inode() and its callees
      btrfs: remove redundant log root assignment from log_dir_items()
      btrfs: factor out the copying loop of dir items from log_dir_items()
      btrfs: insert items in batches when logging a directory when possible
      btrfs: keep track of the last logged keys when logging a directory
    
    This is patch 4/5. The change log of the last patch (5/5) has performance
    results.
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    086dcbfa
tree-log.c 183 KB