Make OSD sort & sanitize PG history items
This commit is contained in:
@@ -871,19 +871,33 @@ void etcd_state_client_t::parse_state(const etcd_kv_t & kv)
|
||||
pg_cfg.target_history.clear();
|
||||
pg_cfg.all_peers.clear();
|
||||
// Refuse to start PG if any set of the <osd_sets> has no live OSDs
|
||||
for (auto hist_item: value["osd_sets"].array_items())
|
||||
for (auto & hist_item: value["osd_sets"].array_items())
|
||||
{
|
||||
std::vector<osd_num_t> history_set;
|
||||
for (auto pg_osd: hist_item.array_items())
|
||||
for (auto & pg_osd: hist_item.array_items())
|
||||
{
|
||||
history_set.push_back(pg_osd.uint64_value());
|
||||
osd_num_t pg_osd_num = pg_osd.uint64_value();
|
||||
if (pg_osd_num != 0)
|
||||
{
|
||||
auto it = std::lower_bound(history_set.begin(), history_set.end(), pg_osd_num);
|
||||
if (it == history_set.end() || *it != pg_osd_num)
|
||||
history_set.insert(it, pg_osd_num);
|
||||
}
|
||||
}
|
||||
pg_cfg.target_history.push_back(history_set);
|
||||
auto it = std::lower_bound(pg_cfg.target_history.begin(), pg_cfg.target_history.end(), history_set);
|
||||
if (it == pg_cfg.target_history.end() || *it != history_set)
|
||||
pg_cfg.target_history.insert(it, history_set);
|
||||
}
|
||||
// Include these additional OSDs when peering the PG
|
||||
for (auto pg_osd: value["all_peers"].array_items())
|
||||
{
|
||||
pg_cfg.all_peers.push_back(pg_osd.uint64_value());
|
||||
osd_num_t pg_osd_num = pg_osd.uint64_value();
|
||||
if (pg_osd_num != 0)
|
||||
{
|
||||
auto it = std::lower_bound(pg_cfg.all_peers.begin(), pg_cfg.all_peers.end(), pg_osd_num);
|
||||
if (it == pg_cfg.all_peers.end() || *it != pg_osd_num)
|
||||
pg_cfg.all_peers.insert(it, pg_osd_num);
|
||||
}
|
||||
}
|
||||
// Read epoch
|
||||
pg_cfg.epoch = value["epoch"].uint64_value();
|
||||
|
||||
Reference in New Issue
Block a user