mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-24 03:08:51 +03:00
Add fast path for zfs_ioc_space_snaps() handling of empty_bpobj
When there are many snapshots, calls to zfs_ioc_space_snaps() (e.g. from `zfs destroy -nv pool/fs@snap1%snap10000`) can be very slow, resulting in poor performance because we are holding the dp_config_rwlock the entire time, blocking spa_sync() from continuing. With around ten thousand snapshots, we've seen up to 500 seconds in this ioctl, iterating over up to 50,000,000 bpobjs, ~99% of which are the empty bpobj. By creating a fast path for zfs_ioc_space_snaps() handling of the empty_bpobj, we can achieve a ~5x performance improvement of this ioctl (when there are many snapshots, and the deadlist is mostly empty_bpobj's). Reviewed-by: Pavel Zakharov <pavel.zakharov@delphix.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Paul Dagnelie <pcd@delphix.com> Signed-off-by: Matthew Ahrens <mahrens@delphix.com> External-issue: DLPX-58348 Closes #8744
This commit is contained in:
committed by
Brian Behlendorf
parent
3beb0a7694
commit
325d288c5d
@@ -413,6 +413,13 @@ dsl_destroy_snapshot_sync_impl(dsl_dataset_t *ds, boolean_t defer, dmu_tx_t *tx)
|
||||
/* Merge our deadlist into next's and free it. */
|
||||
dsl_deadlist_merge(&ds_next->ds_deadlist,
|
||||
dsl_dataset_phys(ds)->ds_deadlist_obj, tx);
|
||||
|
||||
/*
|
||||
* We are done with the deadlist tree (generated/used
|
||||
* by dsl_deadlist_move_bpobj() and dsl_deadlist_merge()).
|
||||
* Discard it to save memory.
|
||||
*/
|
||||
dsl_deadlist_discard_tree(&ds_next->ds_deadlist);
|
||||
}
|
||||
|
||||
dsl_deadlist_close(&ds->ds_deadlist);
|
||||
|
||||
Reference in New Issue
Block a user