]> git.proxmox.com Git - mirror_zfs.git/commit
Reimplement vdev_random_leaf and rename it
authorOlaf Faaland <faaland1@llnl.gov>
Fri, 22 Sep 2017 21:29:26 +0000 (14:29 -0700)
committerTony Hutter <hutter2@llnl.gov>
Mon, 20 Nov 2017 22:19:23 +0000 (16:19 -0600)
commitd3d20bf4428630e087041eb12e75c1f1f39deda8
tree82076554d4488546bdf02840be3ccc9bfc19307d
parent99598264fcb7ae16fbc3f2edc270eeffdb349e95
Reimplement vdev_random_leaf and rename it

Rename it as mmp_random_leaf() since it is defined in mmp.c.

The earlier implementation could end up spinning forever if a pool had a
vdev marked writeable, none of whose children were writeable.  It also
did not guarantee that if a writeable leaf vdev existed, it would be
found.

Reimplement to recursively walk the device tree to select the leaf.  It
searches the entire tree, so that a return value of (NULL) indicates
there were no usable leaves in the pool; all were either not writeable
or had pending mmp writes.

It still chooses the starting child randomly at each level of the tree,
so if the pool's devices are healthy, the mmp writes go to random leaves
with an even distribution.  This was verified by testing using
zfs_multihost_history enabled.

Reviewed by: Thomas Caputi <tcaputi@datto.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
Signed-off-by: Olaf Faaland <faaland1@llnl.gov>
Closes #6631
Closes #6665
module/zfs/mmp.c