size_t Server::apply_blacklist(const std::set<entity_addr_t> &blacklist)
{
- std::list<Session*> victims;
+ bool prenautilus = mds->objecter->with_osdmap(
+ [&](const OSDMap& o) {
+ return o.require_osd_release < CEPH_RELEASE_NAUTILUS;
+ });
+
+ std::vector<Session*> victims;
const auto& sessions = mds->sessionmap.get_sessions();
- for (const auto& p : sessions) {
+ for (const auto& p : sessions) {
if (!p.first.is_client()) {
// Do not apply OSDMap blacklist to MDS daemons, we find out
// about their death via MDSMap.
}
Session *s = p.second;
- if (blacklist.count(s->info.inst.addr)) {
+ auto inst_addr = s->info.inst.addr;
+ // blacklist entries are always TYPE_ANY for nautilus+
+ inst_addr.set_type(entity_addr_t::TYPE_ANY);
+ if (blacklist.count(inst_addr)) {
victims.push_back(s);
+ continue;
+ }
+ if (prenautilus) {
+ // ...except pre-nautilus, they were TYPE_LEGACY
+ inst_addr.set_type(entity_addr_t::TYPE_LEGACY);
+ if (blacklist.count(inst_addr)) {
+ victims.push_back(s);
+ }
}
}