}
void DaemonServer::_check_offlines_pgs(
- const std::set<int>& osds,
+ const ContainerType& osds,
const OSDMap& osdmap,
const PGMap& pgmap,
offline_pg_report *report)
}
if (q.second.state & PG_STATE_DEGRADED) {
for (auto& anm : q.second.avail_no_missing) {
- if (osds.count(anm.osd)) {
- found = true;
- continue;
- }
+ std::visit([anm, &found](auto& container) {
+ using T = std::decay_t<decltype(container)>;
+ if constexpr (std::is_same_v<T, std::set<int>>) {
+ found = container.count(anm.osd);
+ } else if constexpr (std::is_same_v<T, std::vector<int>>) {
+ auto it = std::find(container.begin(), container.end(), anm.osd);
+ found = (it != container.end());
+ }
+ }, osds);
+ if (found) {
+ continue;
+ }
if (anm.osd != CRUSH_ITEM_NONE) {
pg_acting.insert(anm.osd);
}
}
} else {
for (auto& a : q.second.acting) {
- if (osds.count(a)) {
- found = true;
- continue;
- }
+ std::visit([a, &found](auto& container) {
+ using T = std::decay_t<decltype(container)>;
+ if constexpr (std::is_same_v<T, std::set<int>>) {
+ found = container.count(a);
+ } else if constexpr (std::is_same_v<T, std::vector<int>>) {
+ auto it = std::find(container.begin(), container.end(), a);
+ found = (it != container.end());
+ }
+ }, osds);
+ if (found) {
+ continue;
+ }
if (a != CRUSH_ITEM_NONE) {
pg_acting.insert(a);
}
struct offline_pg_report {
- std::set<int> osds;
+ using ContainerType = std::variant<std::vector<int>, std::set<int>>;
+ ContainerType osds;
std::set<pg_t> ok, not_ok, unknown;
std::set<pg_t> ok_become_degraded, ok_become_more_degraded; // ok
std::set<pg_t> bad_no_pool, bad_already_inactive, bad_become_inactive; // not ok
void dump(Formatter *f) const {
f->dump_bool("ok_to_stop", ok_to_stop());
f->open_array_section("osds");
- for (auto o : osds) {
- f->dump_int("osd", o);
- }
+ std::visit([&f](auto&& container) {
+ for (const auto& o : container) {
+ f->dump_int("osd", o);
+ }
+ }, osds);
f->close_section();
f->dump_unsigned("num_ok_pgs", ok.size());
f->dump_unsigned("num_not_ok_pgs", not_ok.size());
class DaemonServerHook *asok_hook;
private:
+ using ContainerType = std::variant<std::vector<int>, std::set<int>>;
friend class ReplyOnFinish;
bool _reply(MCommand* m,
int ret, const std::string& s, const bufferlist& payload);
void _prune_pending_service_map();
void _check_offlines_pgs(
- const std::set<int>& osds,
+ const ContainerType& osds,
const OSDMap& osdmap,
const PGMap& pgmap,
offline_pg_report *report);