Compare commits
3 Commits
266d038b11
...
fd83fef1d9
Author | SHA1 | Date |
---|---|---|
Vitaliy Filippov | fd83fef1d9 | |
Vitaliy Filippov | 8d1067971b | |
Vitaliy Filippov | ae5af04fde |
|
@ -86,7 +86,11 @@ Parent node reference is required for intermediate tree nodes.
|
||||||
Separate OSD settings are set in etc keys `/vitastor/config/osd/<number>`
|
Separate OSD settings are set in etc keys `/vitastor/config/osd/<number>`
|
||||||
in JSON format `{"<key>":<value>}`.
|
in JSON format `{"<key>":<value>}`.
|
||||||
|
|
||||||
As of now, two settings are supported:
|
As of now, the following settings are supported:
|
||||||
|
|
||||||
|
- [reweight](#reweight)
|
||||||
|
- [tags](#tags)
|
||||||
|
- [noout](#noout)
|
||||||
|
|
||||||
## reweight
|
## reweight
|
||||||
|
|
||||||
|
@ -109,6 +113,14 @@ subsets and then use a specific subset for pool instead of all OSDs.
|
||||||
For example you can mark SSD OSDs with tag "ssd" and HDD OSDs with "hdd" and
|
For example you can mark SSD OSDs with tag "ssd" and HDD OSDs with "hdd" and
|
||||||
such tags will work as device classes.
|
such tags will work as device classes.
|
||||||
|
|
||||||
|
## noout
|
||||||
|
|
||||||
|
- Type: boolean
|
||||||
|
- Default: false
|
||||||
|
|
||||||
|
If set to true, [osd_out_time](monitor.en.md#osd_out_time) is ignored for this
|
||||||
|
OSD and it's never removed from data distribution by the monitor.
|
||||||
|
|
||||||
# Pool parameters
|
# Pool parameters
|
||||||
|
|
||||||
## name
|
## name
|
||||||
|
|
|
@ -85,10 +85,11 @@
|
||||||
Настройки отдельных OSD задаются в ключах etcd `/vitastor/config/osd/<number>`
|
Настройки отдельных OSD задаются в ключах etcd `/vitastor/config/osd/<number>`
|
||||||
в JSON-формате `{"<key>":<value>}`.
|
в JSON-формате `{"<key>":<value>}`.
|
||||||
|
|
||||||
На данный момент поддерживаются две настройки:
|
На данный момент поддерживаются следующие настройки:
|
||||||
|
|
||||||
- [reweight](#reweight)
|
- [reweight](#reweight)
|
||||||
- [tags](#tags)
|
- [tags](#tags)
|
||||||
|
- [noout](#noout)
|
||||||
|
|
||||||
## reweight
|
## reweight
|
||||||
|
|
||||||
|
@ -112,6 +113,14 @@
|
||||||
всех. Можно, например, пометить SSD OSD тегом "ssd", а HDD тегом "hdd", в
|
всех. Можно, например, пометить SSD OSD тегом "ssd", а HDD тегом "hdd", в
|
||||||
этом смысле теги работают аналогично классам устройств.
|
этом смысле теги работают аналогично классам устройств.
|
||||||
|
|
||||||
|
## noout
|
||||||
|
|
||||||
|
- Тип: булево (да/нет)
|
||||||
|
- Значение по умолчанию: false
|
||||||
|
|
||||||
|
Если установлено в true, то [osd_out_time](monitor.ru.md#osd_out_time) для этого
|
||||||
|
OSD игнорируется и OSD не удаляется из распределения данных монитором.
|
||||||
|
|
||||||
# Параметры
|
# Параметры
|
||||||
|
|
||||||
## name
|
## name
|
||||||
|
|
21
mon/mon.js
21
mon/mon.js
|
@ -215,7 +215,7 @@ const etcd_tree = {
|
||||||
}, */
|
}, */
|
||||||
pools: {},
|
pools: {},
|
||||||
osd: {
|
osd: {
|
||||||
/* <id>: { reweight?: 1, tags?: [ 'nvme', ... ] }, ... */
|
/* <id>: { reweight?: 1, tags?: [ 'nvme', ... ], noout?: true }, ... */
|
||||||
},
|
},
|
||||||
/* pgs: {
|
/* pgs: {
|
||||||
hash: string,
|
hash: string,
|
||||||
|
@ -892,10 +892,11 @@ class Mon
|
||||||
for (const osd_num of this.all_osds().sort((a, b) => a - b))
|
for (const osd_num of this.all_osds().sort((a, b) => a - b))
|
||||||
{
|
{
|
||||||
const stat = this.state.osd.stats[osd_num];
|
const stat = this.state.osd.stats[osd_num];
|
||||||
if (stat && stat.size && (this.state.osd.state[osd_num] || Number(stat.time) >= down_time))
|
const osd_cfg = this.state.config.osd[osd_num];
|
||||||
|
if (stat && stat.size && (this.state.osd.state[osd_num] || Number(stat.time) >= down_time ||
|
||||||
|
osd_cfg && osd_cfg.noout))
|
||||||
{
|
{
|
||||||
// Numeric IDs are reserved for OSDs
|
// Numeric IDs are reserved for OSDs
|
||||||
const osd_cfg = this.state.config.osd[osd_num];
|
|
||||||
let reweight = osd_cfg == null ? 1 : Number(osd_cfg.reweight);
|
let reweight = osd_cfg == null ? 1 : Number(osd_cfg.reweight);
|
||||||
if (reweight < 0 || isNaN(reweight))
|
if (reweight < 0 || isNaN(reweight))
|
||||||
reweight = 1;
|
reweight = 1;
|
||||||
|
@ -1429,7 +1430,15 @@ class Mon
|
||||||
}
|
}
|
||||||
console.log(`Pool ${pool_id} (${pool_cfg.name || 'unnamed'}):`);
|
console.log(`Pool ${pool_id} (${pool_cfg.name || 'unnamed'}):`);
|
||||||
LPOptimizer.print_change_stats(optimize_result);
|
LPOptimizer.print_change_stats(optimize_result);
|
||||||
const pg_effsize = Math.min(pool_cfg.pg_size, Object.keys(pool_tree).length);
|
let pg_effsize = pool_cfg.pg_size;
|
||||||
|
for (const pg of optimize_result.int_pgs)
|
||||||
|
{
|
||||||
|
const this_pg_size = pg.filter(osd => osd != LPOptimizer.NO_OSD).length;
|
||||||
|
if (this_pg_size && this_pg_size < pg_effsize)
|
||||||
|
{
|
||||||
|
pg_effsize = this_pg_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
return {
|
return {
|
||||||
pool_id,
|
pool_id,
|
||||||
pgs: optimize_result.int_pgs,
|
pgs: optimize_result.int_pgs,
|
||||||
|
@ -1553,10 +1562,6 @@ class Mon
|
||||||
|
|
||||||
async apply_pool_pgs(results, up_osds, osd_tree, tree_hash)
|
async apply_pool_pgs(results, up_osds, osd_tree, tree_hash)
|
||||||
{
|
{
|
||||||
if (!results.length)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
for (const pool_id in (this.state.config.pgs||{}).items||{})
|
for (const pool_id in (this.state.config.pgs||{}).items||{})
|
||||||
{
|
{
|
||||||
// We should stop all PGs when deleting a pool or changing its PG count
|
// We should stop all PGs when deleting a pool or changing its PG count
|
||||||
|
|
Loading…
Reference in New Issue