From 6e12aca53b1be1cc29e71091f819eebf26555bd7 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Fri, 26 Nov 2021 23:05:37 +0300 Subject: [PATCH] Remove the total PG count restriction in optimize_change which was leading to unfeasible problems sometimes --- mon/lp-optimizer.js | 5 ----- mon/test-optimize-unfeasible.js | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 mon/test-optimize-unfeasible.js diff --git a/mon/lp-optimizer.js b/mon/lp-optimizer.js index 0d47af87..cd9a88cd 100644 --- a/mon/lp-optimizer.js +++ b/mon/lp-optimizer.js @@ -293,11 +293,6 @@ async function optimize_change({ prev_pgs: prev_int_pgs, osd_tree, pg_size = 3, lp += 'max: '+all_pg_names.map(pg_name => ( prev_weights[pg_name] ? `${pg_size+1}*add_${pg_name} - ${pg_size+1}*del_${pg_name}` : `${pg_size+1-move_weights[pg_name]}*${pg_name}` )).join(' + ')+';\n'; - lp += all_pg_names - .map(pg_name => (prev_weights[pg_name] ? `add_${pg_name} - del_${pg_name}` : `${pg_name}`)) - .join(' + ')+' = '+(pg_count - - Object.keys(prev_weights).reduce((a, old_pg_name) => (a + (all_pgs_hash[old_pg_name] ? prev_weights[old_pg_name] : 0)), 0) - )+';\n'; for (const osd in pg_per_osd) { if (osd !== NO_OSD) diff --git a/mon/test-optimize-unfeasible.js b/mon/test-optimize-unfeasible.js new file mode 100644 index 00000000..c632f9cc --- /dev/null +++ b/mon/test-optimize-unfeasible.js @@ -0,0 +1,33 @@ +// Copyright (c) Vitaliy Filippov, 2019+ +// License: VNPL-1.1 (see README.md for details) + +const LPOptimizer = require('./lp-optimizer.js'); + +const osd_tree = { + 100: { + 1: 0.1, + 2: 0.1, + 3: 0.1, + }, + 200: { + 4: 0.1, + 5: 0.1, + 6: 0.1, + }, +}; + +async function run() +{ + let res; + console.log('256 PGs, 3+3 OSDs, size=2'); + res = await LPOptimizer.optimize_initial({ osd_tree, pg_size: 2, pg_count: 256 }); + LPOptimizer.print_change_stats(res, false); + + // Should NOT fail with the "unfeasible or unbounded" exception + console.log('\nRemoving osd.2'); + delete osd_tree[100][2]; + res = await LPOptimizer.optimize_change({ prev_pgs: res.int_pgs, osd_tree, pg_size: 2 }); + LPOptimizer.print_change_stats(res, false); +} + +run().catch(console.error);