From: Sage Weil Date: Thu, 21 Mar 2013 18:15:30 +0000 (-0700) Subject: crush: fix remove_item on bucket removal X-Git-Tag: v0.62~177^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b54db77ede57e6fa706cdad9fdf14bcaf69d2d0f;p=ceph.git crush: fix remove_item on bucket removal Remove the bucket if there are no references left. Remove the name from the map even if it is a bucket (not sure why that condition was there in the first place!). Signed-off-by: Sage Weil --- diff --git a/src/crush/CrushWrapper.cc b/src/crush/CrushWrapper.cc index 22b0524158ae..5a4a9107597c 100644 --- a/src/crush/CrushWrapper.cc +++ b/src/crush/CrushWrapper.cc @@ -55,7 +55,6 @@ int CrushWrapper::remove_item(CephContext *cct, int item) { ldout(cct, 5) << "remove_item " << item << dendl; - crush_bucket *was_bucket = 0; int ret = -ENOENT; for (int i = 0; i < crush->max_buckets; i++) { @@ -73,7 +72,6 @@ int CrushWrapper::remove_item(CephContext *cct, int item) << " items, not empty" << dendl; return -ENOTEMPTY; } - was_bucket = t; } adjust_item_weight(cct, item, 0); ldout(cct, 5) << "remove_item removing item " << item @@ -84,14 +82,18 @@ int CrushWrapper::remove_item(CephContext *cct, int item) } } - if (was_bucket) { - ldout(cct, 5) << "remove_item removing bucket " << item << dendl; - crush_remove_bucket(crush, was_bucket); - } - if (item >= 0 && name_map.count(item)) { - name_map.erase(item); - have_rmaps = false; - ret = 0; + // last instance? + if (!_search_item_exists(item)) { + if (item < 0) { + ldout(cct, 5) << "remove_item removing bucket " << item << dendl; + crush_bucket *t = get_bucket(item); + crush_remove_bucket(crush, t); + ret = 0; + } + if (name_map.count(item)) { + name_map.erase(item); + have_rmaps = false; + } } return ret; @@ -161,7 +163,7 @@ int CrushWrapper::remove_item_under(CephContext *cct, int item, int ancestor) crush_bucket *t = get_bucket(item); crush_remove_bucket(crush, t); } - if (item >= 0 && name_map.count(item)) { + if (name_map.count(item)) { name_map.erase(item); have_rmaps = false; }