}
+
+void OSDMonitor::blacklist(entity_addr_t a, utime_t until)
+{
+ dout(10) << "blacklist " << a << " until " << until << dendl;
+ pending_inc.new_blacklist[a] = until;
+}
+
+
+
// TICK
if (!mon->is_leader()) return;
+
+ bool do_propose = false;
+
// mark down osds out?
utime_t now = g_clock.now();
list<int> mark_out;
down_pending_out.erase(*i);
pending_inc.new_weight[*i] = CEPH_OSD_OUT;
}
- if (!mark_out.empty()) {
- propose_pending();
+ if (!mark_out.empty())
+ do_propose = true;
+
+
+ // expire blacklisted items?
+ for (hash_map<entity_addr_t,utime_t>::iterator p = osdmap.blacklist.begin();
+ p != osdmap.blacklist.end();
+ p++) {
+ if (p->second < now) {
+ dout(10) << "expiring blacklist item " << p->first << " expired " << p->second << " < now " << now << dendl;
+ pending_inc.old_blacklist.push_back(p->first);
+ do_propose = true;
+ }
}
+ // ---------------
#define SWAP_PRIMARIES_AT_START 0
#define SWAP_TIME 1
-
- if (!SWAP_PRIMARIES_AT_START) return;
-
- // For all PGs that have OSD 0 as the primary,
- // switch them to use the first replca
-
-
- ps_t numps = osdmap.get_pg_num();
- int minrep = 1;
- int maxrep = MIN(g_conf.num_osd, g_conf.osd_max_rep);
- for (int pool=0; pool<1; pool++)
- for (int nrep = minrep; nrep <= maxrep; nrep++) {
- for (ps_t ps = 0; ps < numps; ++ps) {
- pg_t pgid = pg_t(pg_t::TYPE_REP, nrep, ps, pool, -1);
- vector<int> osds;
- osdmap.pg_to_osds(pgid, osds);
- if (osds[0] == 0) {
- pending_inc.new_pg_swap_primary[pgid] = osds[1];
- dout(3) << "Changing primary for PG " << pgid << " from " << osds[0] << " to "
- << osds[1] << dendl;
+ if (SWAP_PRIMARIES_AT_START) {
+ // For all PGs that have OSD 0 as the primary,
+ // switch them to use the first replca
+ ps_t numps = osdmap.get_pg_num();
+ int minrep = 1;
+ int maxrep = MIN(g_conf.num_osd, g_conf.osd_max_rep);
+ for (int pool=0; pool<1; pool++)
+ for (int nrep = minrep; nrep <= maxrep; nrep++) {
+ for (ps_t ps = 0; ps < numps; ++ps) {
+ pg_t pgid = pg_t(pg_t::TYPE_REP, nrep, ps, pool, -1);
+ vector<int> osds;
+ osdmap.pg_to_osds(pgid, osds);
+ if (osds[0] == 0) {
+ pending_inc.new_pg_swap_primary[pgid] = osds[1];
+ dout(3) << "Changing primary for PG " << pgid << " from " << osds[0] << " to "
+ << osds[1] << dendl;
+ do_propose = true;
+ }
}
}
- }
- propose_pending();
+ }
+ // ---------------
+
+ if (do_propose)
+ propose_pending();
}
}
out << std::endl;
+ for (hash_map<entity_addr_t,utime_t>::iterator p = blacklist.begin();
+ p != blacklist.end();
+ p++)
+ out << "blacklist " << p->first << " expires " << p->second << "\n";
+
// ignore pg_swap_primary
out << "max_snap " << get_max_snap() << "\n"
<< get_num_osds() << " osds: "
<< get_num_up_osds() << " up, "
<< get_num_in_osds() << " in";
+ if (blacklist.size())
+ out << ", " << blacklist.size() << " blacklisted";
}
map<pg_t,uint32_t> new_pg_swap_primary;
list<pg_t> old_pg_swap_primary;
- vector<entity_addr_t> new_blacklist;
+ map<entity_addr_t,utime_t> new_blacklist;
vector<entity_addr_t> old_blacklist;
snapid_t new_max_snap;
snapid_t max_snap;
interval_set<snapid_t> removed_snaps;
- hash_set<entity_addr_t> blacklist;
+ hash_map<entity_addr_t,utime_t> blacklist;
public:
CrushWrapper crush; // hierarchical map
removed_snaps.union_of(inc.removed_snaps);
// blacklist
- for (vector<entity_addr_t>::iterator p = inc.new_blacklist.begin();
+ for (map<entity_addr_t,utime_t>::iterator p = inc.new_blacklist.begin();
p != inc.new_blacklist.end();
p++)
- blacklist.insert(*p);
+ blacklist[p->first] = p->second;
for (vector<entity_addr_t>::iterator p = inc.old_blacklist.begin();
p != inc.old_blacklist.end();
p++)