From 9902383c690dca9ed5ba667800413daa8332157e Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Sun, 23 Nov 2014 18:50:51 -0800 Subject: [PATCH] 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 --- src/crush/CrushWrapper.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/crush/CrushWrapper.cc b/src/crush/CrushWrapper.cc index dd05b11c0ef..dc852ca2b08 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);