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.80.8~7^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=465eedea9f7411b1e352dc3ccee60a3f1221541d;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 (cherry picked from commit 9902383c690dca9ed5ba667800413daa8332157e) --- diff --git a/src/crush/CrushWrapper.cc b/src/crush/CrushWrapper.cc index e25a898ffcefd..895c9ffa05443 100644 --- a/src/crush/CrushWrapper.cc +++ b/src/crush/CrushWrapper.cc @@ -585,7 +585,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);