Skip to content

Commit

Permalink
7843 get_clones_stat() is suboptimal for lots of clones
Browse files Browse the repository at this point in the history
Reviewed by: Pavel Zakharov <pavel.zakharov@delphix.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Approved by: Dan McDonald <danmcd@omniti.com>
  • Loading branch information
avg-I authored and ahrens committed Mar 1, 2017
1 parent 61e255c commit c5bde72
Showing 1 changed file with 12 additions and 1 deletion.
13 changes: 12 additions & 1 deletion usr/src/uts/common/fs/zfs/dsl_dataset.c
Expand Up @@ -1687,10 +1687,21 @@ get_clones_stat(dsl_dataset_t *ds, nvlist_t *nv)
zap_cursor_t zc;
zap_attribute_t za;
nvlist_t *propval = fnvlist_alloc();
nvlist_t *val = fnvlist_alloc();
nvlist_t *val;

ASSERT(dsl_pool_config_held(ds->ds_dir->dd_pool));

/*
* We use nvlist_alloc() instead of fnvlist_alloc() because the
* latter would allocate the list with NV_UNIQUE_NAME flag.
* As a result, every time a clone name is appended to the list
* it would be (linearly) searched for for a duplicate name.
* We already know that all clone names must be unique and we
* want avoid the quadratic complexity of double-checking that
* because we can have a large number of clones.
*/
VERIFY0(nvlist_alloc(&val, 0, KM_SLEEP));

/*
* There may be missing entries in ds_next_clones_obj
* due to a bug in a previous version of the code.
Expand Down

0 comments on commit c5bde72

Please sign in to comment.