detail = 'No pools available'
self.log.info(detail)
return -errno.ENOENT, detail
+ # shuffle pool list so they all get equal (in)attention
+ random.shuffle(pools)
+ self.log.info('pools %s' % pools)
+ adjusted_pools = []
inc = plan.inc
total_did = 0
left = max_iterations
pools_with_pg_merge = [p['pool_name'] for p in osdmap_dump.get('pools', [])
if p['pg_num'] > p['pg_num_target']]
crush_rule_by_pool_name = dict((p['pool_name'], p['crush_rule']) for p in osdmap_dump.get('pools', []))
- pools_by_crush_rule = {} # group pools by crush_rule
for pool in pools:
if pool not in crush_rule_by_pool_name:
self.log.info('pool %s does not exist' % pool)
if pool in pools_with_pg_merge:
self.log.info('pool %s has pending PG(s) for merging, skipping for now' % pool)
continue
- crush_rule = crush_rule_by_pool_name[pool]
- if crush_rule not in pools_by_crush_rule:
- pools_by_crush_rule[crush_rule] = []
- pools_by_crush_rule[crush_rule].append(pool)
- classified_pools = list(pools_by_crush_rule.values())
+ adjusted_pools.append(pool)
# shuffle so all pools get equal (in)attention
- random.shuffle(classified_pools)
- for it in classified_pools:
- did = ms.osdmap.calc_pg_upmaps(inc, max_deviation, left, it)
+ random.shuffle(adjusted_pools)
+ for pool in adjusted_pools:
+ did = ms.osdmap.calc_pg_upmaps(inc, max_deviation, left, [pool])
total_did += did
left -= did
if left <= 0: