• I
    libceph: fix non-default values check in apply_primary_affinity() · 92b2e751
    Ilya Dryomov 提交于
    osd_primary_affinity array is indexed into incorrectly when checking
    for non-default primary-affinity values.  This nullifies the impact of
    the rest of the apply_primary_affinity() and results in misdirected
    requests.
    
                    if (osds[i] != CRUSH_ITEM_NONE &&
                        osdmap->osd_primary_affinity[i] !=
                                                    ^^^
                                            CEPH_OSD_DEFAULT_PRIMARY_AFFINITY) {
    
    For a pool with size 2, this always ends up checking osd0 and osd1
    primary_affinity values, instead of the values that correspond to the
    osds in question.  E.g., given a [2,3] up set and a [max,max,0,max]
    primary affinity vector, requests are still sent to osd2, because both
    osd0 and osd1 happen to have max primary_affinity values and therefore
    we return from apply_primary_affinity() early on the premise that all
    osds in the given set have max (default) values.  Fix it.
    
    Fixes: http://tracker.ceph.com/issues/7954Signed-off-by: NIlya Dryomov <ilya.dryomov@inktank.com>
    Reviewed-by: NSage Weil <sage@inktank.com>
    92b2e751
osdmap.c 38.2 KB