<< dendl;
OSDMap::Incremental inc(m->incremental_maps[e]);
osdmap->apply_incremental(inc);
+
+ emit_blacklist_events(inc);
+
logger->inc(l_osdc_map_inc);
}
else if (m->maps.count(e)) {
ldout(cct, 3) << "handle_osd_map decoding full epoch " << e << dendl;
- osdmap->decode(m->maps[e]);
+ OSDMap *new_osdmap = new OSDMap();
+ new_osdmap->decode(m->maps[e]);
+
+ emit_blacklist_events(*osdmap, *new_osdmap);
+
+ osdmap = new_osdmap;
+
logger->inc(l_osdc_map_full);
}
else {
}
}
+void Objecter::enable_blacklist_events()
+{
+ unique_lock wl(rwlock);
+
+ blacklist_events_enabled = true;
+}
+
+void Objecter::consume_blacklist_events(std::set<entity_addr_t> *events)
+{
+ unique_lock wl(rwlock);
+
+ if (events->empty()) {
+ events->swap(blacklist_events);
+ } else {
+ for (const auto &i : blacklist_events) {
+ events->insert(i);
+ }
+ blacklist_events.clear();
+ }
+}
+
+void Objecter::emit_blacklist_events(const OSDMap::Incremental &inc)
+{
+ if (!blacklist_events_enabled) {
+ return;
+ }
+
+ for (const auto &i : inc.new_blacklist) {
+ blacklist_events.insert(i.first);
+ }
+}
+
+void Objecter::emit_blacklist_events(const OSDMap &old_osd_map,
+ const OSDMap &new_osd_map)
+{
+ if (!blacklist_events_enabled) {
+ return;
+ }
+
+ std::set<entity_addr_t> old_set;
+ std::set<entity_addr_t> new_set;
+
+ old_osd_map.get_blacklist(&old_set);
+ new_osd_map.get_blacklist(&new_set);
+
+ std::set<entity_addr_t> delta_set;
+ std::set_difference(
+ new_set.begin(), new_set.end(), old_set.begin(), old_set.end(),
+ std::inserter(delta_set, delta_set.begin()));
+ blacklist_events.insert(delta_set.begin(), delta_set.end());
+}
+
// op pool check
void Objecter::C_Op_Map_Latest::finish(int r)
bool honor_osdmap_full;
bool osdmap_full_try;
+ // If this is true, accumulate a set of blacklisted entities
+ // to be drained by consume_blacklist_events.
+ bool blacklist_events_enabled;
+ std::set<entity_addr_t> blacklist_events;
+
public:
void maybe_request_map();
+
+ void enable_blacklist_events();
private:
void _maybe_request_map();
osdmap(new OSDMap), initialized(0), last_tid(0), client_inc(-1),
max_linger_id(0), num_in_flight(0), global_op_flags(0),
keep_balanced_budget(false), honor_osdmap_full(true), osdmap_full_try(false),
+ blacklist_events_enabled(false),
last_seen_osdmap_version(0), last_seen_pgmap_version(0),
logger(NULL), tick_event(0), m_request_state_hook(NULL),
num_homeless_ops(0),
void handle_osd_map(class MOSDMap *m);
void wait_for_osd_map();
+ /**
+ * Get list of entities blacklisted since this was last called,
+ * and reset the list.
+ *
+ * Uses a std::set because typical use case is to compare some
+ * other list of clients to see which overlap with the blacklisted
+ * addrs.
+ *
+ */
+ void consume_blacklist_events(std::set<entity_addr_t> *events);
+
int pool_snap_by_name(int64_t poolid,
const char *snap_name,
snapid_t *snap) const;
int pool_snap_list(int64_t poolid, vector<uint64_t> *snaps);
private:
+ void emit_blacklist_events(const OSDMap::Incremental &inc);
+ void emit_blacklist_events(const OSDMap &old_osd_map,
+ const OSDMap &new_osd_map);
+
// low-level
void _op_submit(Op *op, shunique_lock& lc, ceph_tid_t *ptid);
void _op_submit_with_budget(Op *op, shunique_lock& lc,