]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
pybind/mgr/balancer/module.py: assign weight-sets to all buckets before balancing 40128/head
authorNeha Ojha <nojha@redhat.com>
Tue, 9 Mar 2021 00:48:58 +0000 (00:48 +0000)
committerNeha Ojha <nojha@redhat.com>
Mon, 15 Mar 2021 18:07:57 +0000 (18:07 +0000)
Add an additional check to make sure that the choose_args section has the same
number of buckets as the crushmap. If not, ensure that
get_compat_weight_set_weights assigns weight-sets to all buckets.

Without this change, if we end up with an orig_ws, which has fewer buckets
than the crushmap, the mgr will crash due a KeyError in do_crush_compat().

Fixes: https://tracker.ceph.com/issues/49576
Signed-off-by: Neha Ojha <nojha@redhat.com>
(cherry picked from commit 42c01f0c3932f7a9157797013e5db2e03d9c1fd9)

 Conflicts:
src/pybind/mgr/balancer/module.py - trivial resolution

src/pybind/mgr/balancer/module.py

index acca915dceda3511b9e0ff09ca18a97a01114ab3..503179b52747e648e2a5a5e280cc7e71e22b7bdc 100644 (file)
@@ -1180,8 +1180,13 @@ class Module(MgrModule):
                                 'change balancer mode and retry might help'
 
     def get_compat_weight_set_weights(self, ms):
-        if not CRUSHMap.have_default_choose_args(ms.crush_dump):
+        have_choose_args = CRUSHMap.have_default_choose_args(ms.crush_dump)
+        if have_choose_args:
+            # get number of buckets in choose_args
+            choose_args_len = len(CRUSHMap.get_default_choose_args(ms.crush_dump))
+        if not have_choose_args or choose_args_len != len(ms.crush_dump['buckets']):
             # enable compat weight-set first
+            self.log.debug('no choose_args or all buckets do not have weight-sets')
             self.log.debug('ceph osd crush weight-set create-compat')
             result = CommandResult('')
             self.send_command(result, 'mon', '', json.dumps({