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
'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({