From: Sage Weil Date: Mon, 24 Nov 2014 02:50:51 +0000 (-0800) Subject: crush/CrushWrapper: fix create_or_move_item when name exists but item does not X-Git-Tag: v0.91~47^2~22^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F2986%2Fhead;p=ceph.git crush/CrushWrapper: fix create_or_move_item when name exists but item does not We were using item_exists(), which simply checks if we have a name defined for the item. Instead, use _search_item_exists(), which looks for an instance of the item somewhere in the hierarchy. This matches what get_item_weightf() is doing, which ensures we get a non-negative weight that converts properly to floating point. Backport: giant, firefly Fixes: #9998 Reported-by: Pawel Sadowski Signed-off-by: Sage Weil --- diff --git a/src/crush/CrushWrapper.cc b/src/crush/CrushWrapper.cc index dd05b11c0efc..dc852ca2b088 100644 --- a/src/crush/CrushWrapper.cc +++ b/src/crush/CrushWrapper.cc @@ -651,7 +651,7 @@ int CrushWrapper::create_or_move_item(CephContext *cct, int item, float weight, if (check_item_loc(cct, item, loc, &old_iweight)) { ldout(cct, 5) << "create_or_move_item " << item << " already at " << loc << dendl; } else { - if (item_exists(item)) { + if (_search_item_exists(item)) { weight = get_item_weightf(item); ldout(cct, 10) << "create_or_move_item " << item << " exists with weight " << weight << dendl; remove_item(cct, item, true);