]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: include a blacklist in the OSDMap
authorSage Weil <sage@newdream.net>
Mon, 24 Nov 2008 19:49:10 +0000 (11:49 -0800)
committerSage Weil <sage@newdream.net>
Mon, 24 Nov 2008 21:26:19 +0000 (13:26 -0800)
src/include/encoding.h
src/osd/OSDMap.h

index 9403619270588dcdc27e3753482fec93f45592b5..4f33696726533642f36ae3418fdd135d497b85fc 100644 (file)
@@ -93,6 +93,7 @@ WRITE_INTTYPE_ENCODER(s16, le16)
 #include <vector>
 #include <string>
 #include <ext/hash_map>
+#include <ext/hash_set>
 #include "triple.h"
 
 // pair
@@ -387,6 +388,28 @@ inline void decode(__gnu_cxx::hash_map<T,U>& m, bufferlist::iterator& p)
   }
 }
 
+// hash_set
+template<class T>
+inline void encode(const __gnu_cxx::hash_set<T>& m, bufferlist& bl)
+{
+  __u32 n = m.size();
+  encode(n, bl);
+  for (typename __gnu_cxx::hash_set<T>::const_iterator p = m.begin(); p != m.end(); ++p)
+    encode(*p, bl);
+}
+template<class T>
+inline void decode(__gnu_cxx::hash_set<T>& m, bufferlist::iterator& p)
+{
+  __u32 n;
+  decode(n, p);
+  m.clear();
+  while (n--) {
+    T k;
+    decode(k, p);
+    m.insert(k);
+  }
+}
+
 // string
 inline void encode(const std::string& s, bufferlist& bl) 
 {
index df782348714520bb3573431ba562677c542a3fbe..aef6ef285cb66da3ada3dfcf691c411c1700e20b 100644 (file)
 #include <map>
 using namespace std;
 
+#include <ext/hash_set>
+using __gnu_cxx::hash_set;
+
+
 
 /*
  * some system constants
@@ -143,6 +147,9 @@ public:
     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;
     
@@ -171,6 +178,8 @@ public:
       ::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
@@ -197,6 +206,8 @@ public:
       ::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), 
@@ -254,6 +265,8 @@ private:
   snapid_t max_snap;
   interval_set<snapid_t> removed_snaps;
 
+  hash_set<entity_addr_t> blacklist;
+
  public:
   CrushWrapper     crush;       // hierarchical map
 
@@ -312,6 +325,10 @@ private:
   }
   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; }
@@ -529,10 +546,21 @@ private:
         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();
@@ -570,6 +598,7 @@ private:
 
     ::encode(max_snap, blist);
     ::encode(removed_snaps.m, blist);
+    ::encode(blacklist, blist);
   }
   
   void decode(bufferlist& blist) {
@@ -604,6 +633,7 @@ private:
     
     ::decode(max_snap, p);
     ::decode(removed_snaps.m, p);
+    ::decode(blacklist, p);
   }