#include <map>
using namespace std;
+#include <ext/hash_set>
+using __gnu_cxx::hash_set;
+
+
/*
* some system constants
map<pg_t,uint32_t> new_pg_swap_primary;
list<pg_t> old_pg_swap_primary;
+ vector<entity_addr_t> new_blacklist;
+ vector<entity_addr_t> old_blacklist;
+
snapid_t new_max_snap;
interval_set<snapid_t> removed_snaps;
::encode(old_pg_swap_primary, bl);
::encode(new_max_snap, bl);
::encode(removed_snaps.m, bl);
+ ::encode(new_blacklist, bl);
+ ::encode(old_blacklist, bl);
}
void decode(bufferlist::iterator &p) {
// base
::decode(old_pg_swap_primary, p);
::decode(new_max_snap, p);
::decode(removed_snaps.m, p);
+ ::decode(new_blacklist, p);
+ ::decode(old_blacklist, p);
}
Incremental(epoch_t e=0) : epoch(e), new_flags(-1), new_max_osd(-1),
snapid_t max_snap;
interval_set<snapid_t> removed_snaps;
+ hash_set<entity_addr_t> blacklist;
+
public:
CrushWrapper crush; // hierarchical map
}
interval_set<snapid_t>& get_removed_snaps() { return removed_snaps; }
+ bool is_blacklisted(const entity_addr_t& a) {
+ return !blacklist.empty() && blacklist.count(a);
+ }
+
/***** cluster state *****/
/* osds */
int get_max_osd() const { return max_osd; }
i++)
pg_swap_primary.erase(*i);
+ // snaps
if (inc.new_max_snap > 0)
max_snap = inc.new_max_snap;
removed_snaps.union_of(inc.removed_snaps);
+ // blacklist
+ for (vector<entity_addr_t>::iterator p = inc.new_blacklist.begin();
+ p != inc.new_blacklist.end();
+ p++)
+ blacklist.insert(*p);
+ for (vector<entity_addr_t>::iterator p = inc.old_blacklist.begin();
+ p != inc.old_blacklist.end();
+ p++)
+ blacklist.erase(*p);
+
// do new crush map last (after up/down stuff)
if (inc.crush.length()) {
bufferlist::iterator blp = inc.crush.begin();
::encode(max_snap, blist);
::encode(removed_snaps.m, blist);
+ ::encode(blacklist, blist);
}
void decode(bufferlist& blist) {
::decode(max_snap, p);
::decode(removed_snaps.m, p);
+ ::decode(blacklist, p);
}