From f3a3180ccadea78d3ebf0353df50f74b5222e14e Mon Sep 17 00:00:00 2001 From: xie xingguo Date: Tue, 25 Jul 2017 14:15:24 +0800 Subject: [PATCH] crush: rebuild shadow tree on "crush create-or-move/move" This patch solves the problem below: ./bin/ceph osd crush move osd.0 root=foo rack=foo-rack host=foo-host moved item id 0 name 'osd.0' to location {host=foo-host,rack=foo-rack,root=foo} in crush map ./bin/ceph osd crush rule create-replicated foo-rule foo host ssd Error EINVAL: root foo has no devices with class ssd Signed-off-by: xie xingguo --- qa/standalone/crush/crush-classes.sh | 2 ++ src/crush/CrushWrapper.cc | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/qa/standalone/crush/crush-classes.sh b/qa/standalone/crush/crush-classes.sh index 93900f052f1..b6b38a9a9f0 100755 --- a/qa/standalone/crush/crush-classes.sh +++ b/qa/standalone/crush/crush-classes.sh @@ -162,6 +162,8 @@ function TEST_mon_classes() { if [ "$out" == "" ]; then return 1 fi + + ceph osd crush rule create-replicated foo-rule foo host abc || return 1 } main crush-classes "$@" diff --git a/src/crush/CrushWrapper.cc b/src/crush/CrushWrapper.cc index f11374ca09a..c9845e792cb 100644 --- a/src/crush/CrushWrapper.cc +++ b/src/crush/CrushWrapper.cc @@ -953,6 +953,12 @@ int CrushWrapper::insert_item( ldout(cct, 5) << "insert_item max_devices now " << crush->max_devices << dendl; } + r = rebuild_roots_with_classes(); + if (r < 0) { + ldout(cct, 0) << __func__ << " unable to rebuild roots with classes: " + << cpp_strerror(r) << dendl; + return r; + } return 0; } -- 2.39.5