]> 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)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 22 Sep 2017 21:29:26 +0000 (14:29 -0700)
commitd410c6d9fd4db812a1009e1603c89f1e222e1875
treecebf0f6e030ea99eff0847d8e866217af0773b59
parent5df5d06a8d86af475e90fe7dd86ea044f937be66
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