Oops - fix filter_by_root_node, add a test for it

This commit is contained in:
Vitaliy Filippov
2024-04-09 15:48:44 +03:00
parent 57bf84ddb2
commit c29bfe12eb
5 changed files with 83 additions and 11 deletions
+2 -2
View File
@@ -77,7 +77,7 @@ async function optimize_initial({ osd_weights, combinator, pg_count, pg_size = 3
{
if (osd !== NO_OSD)
{
let osd_pg_count = osd_weights[osd]/total_weight*pg_effsize*pg_count;
let osd_pg_count = (osd_weights[osd]||0)/total_weight*pg_effsize*pg_count;
lp += pg_per_osd[osd].join(' + ')+' <= '+osd_pg_count+';\n';
}
}
@@ -299,7 +299,7 @@ async function optimize_change({ prev_pgs: prev_int_pgs, osd_weights, combinator
)).join(' + ');
const rm_osd_pg_count = (prev_pg_per_osd[osd]||[])
.reduce((a, [ old_pg_name, space ]) => (a + (all_pgs_hash[old_pg_name] ? space : 0)), 0);
const osd_pg_count = osd_weights[osd]*pg_effsize/total_weight*pg_count - rm_osd_pg_count;
const osd_pg_count = (osd_weights[osd]||0)*pg_effsize/total_weight*pg_count - rm_osd_pg_count;
lp += osd_sum + ' <= ' + osd_pg_count + ';\n';
}
}
+30 -9
View File
@@ -1197,16 +1197,37 @@ class Mon
{
return;
}
pool_tree = pool_tree[root_node];
const cur = [ ...(pool_tree||{}).children||[] ];
for (let i = 0; i < cur.length; i++)
let included = [ ...(pool_tree[root_node] || {}).children||[] ];
for (let i = 0; i < included.length; i++)
{
if (cur.children)
if (included[i].children)
{
cur.splice(i+1, 1, ...cur.children);
included.splice(i+1, 0, ...included[i].children);
}
}
let cur = pool_tree[root_node] || {};
if (cur)
{
included.unshift(cur);
}
while (cur.id)
{
let parent = cur.parent||'';
if (pool_tree[parent])
{
included.unshift(pool_tree[parent]);
pool_tree[parent] = { ...pool_tree[parent], children: [ cur ] };
cur = pool_tree[parent];
}
}
included = included.reduce((a, c) => { a[c.id||''] = true; return a; }, {});
for (const item in pool_tree)
{
if (!included[item])
{
delete pool_tree[item];
}
}
return cur;
}
filter_osds_by_tags(orig_tree, tags)
@@ -1336,7 +1357,7 @@ class Mon
{
return null;
}
let pool_tree = osd_tree;
let pool_tree = { ...osd_tree };
this.filter_osds_by_root_node(pool_tree, pool_cfg.root_node);
this.filter_osds_by_tags(pool_tree, pool_cfg.osd_tags);
this.filter_osds_by_block_layout(
@@ -1364,9 +1385,9 @@ class Mon
osd_weights: Object.values(pool_tree).filter(item => item.level === 'osd').reduce((a, c) => { a[c.id] = c.size; return a; }, {}),
combinator: !this.config.use_old_pg_combinator || pool_cfg.level_placement || pool_cfg.raw_placement
// new algorithm:
? new RuleCombinator(osd_tree, this.get_pg_rules(pool_id, pool_cfg), pool_cfg.max_osd_combinations)
? new RuleCombinator(pool_tree, this.get_pg_rules(pool_id, pool_cfg), pool_cfg.max_osd_combinations)
// old algorithm:
: new SimpleCombinator(flatten_tree(osd_tree[''].children, levels, pool_cfg.failure_domain, 'osd'), pool_cfg.pg_size, pool_cfg.max_osd_combinations),
: new SimpleCombinator(flatten_tree(pool_tree[''].children, levels, pool_cfg.failure_domain, 'osd'), pool_cfg.pg_size, pool_cfg.max_osd_combinations),
pg_count: pool_cfg.pg_count,
pg_size: pool_cfg.pg_size,
pg_minsize: pool_cfg.pg_minsize,