根据crushmap进行距离打分
-
首先,任何节点在启动时会通过main()->global_init()->crush_location.init_on_startup()
根据crushmap进行距离打分
-
获取自己节点的crush_location,然后在localize read时,拿pg的每个osd和自己的crush_location进行公共祖先最短距离比较
源码如下:
_calc_target ->int best = -1; int best_locality = 0; for (unsigned i = 0; i < acting.size(); ++i) { int locality = osdmap->crush->get_common_ancestor_distance( cct, acting[i], crush_location); ldout(cct, 20) << __func__ << " localize: rank " << i << " osd." << acting[i] << " locality " << locality << dendl; if (i == 0 || (locality >= 0 && best_locality >= 0 && locality < best_locality) || (best_locality < 0 && locality >= 0)) { best = i; best_locality = locality; if (i) t->used_replica = true; } } ceph_assert(best >= 0); osd = acting[best];