osd/OSD: choose more heartbeat peers from different subtrees
We want to avoid a situation like:
- host.A consists of OSDs from 0 to 10
- cut off network of host.A from the rest of the cluster
- osd.1 is marked down when enough votes have been
collected by mon
- osd.1 re-selects osd.0,2,3,..., and two extra
osds from two different hosts as heartbeat peers
- osd.1 has more than 1/3 heartbeat peers becoming pingable,
e.g., because they belongs to the same host.A, and will
try to mark itself as up again
which as a result may cause a longer client op latency now.
Fix by (always) trying to select as many heartbeat peers
from different subtrees as possible instead.