]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osdmap: use shared_ptr for CrushWrapper
authorSage Weil <sage@newdream.net>
Wed, 25 Apr 2012 22:59:24 +0000 (15:59 -0700)
committerSage Weil <sage@newdream.net>
Fri, 27 Apr 2012 01:49:19 +0000 (18:49 -0700)
Signed-off-by: Sage Weil <sage@newdream.net>
src/mon/OSDMonitor.cc
src/mon/PGMonitor.cc
src/osd/OSDMap.cc
src/osd/OSDMap.h
src/osdmaptool.cc

index d49082f829c58e81230190f3d87472907171a693..08e5e0d88e35bc314deb5352bcc728adab94d26c 100644 (file)
@@ -1497,7 +1497,7 @@ bool OSDMonitor::preprocess_command(MMonCommand *m)
          ss << "got osdmap epoch " << p->get_epoch();
          r = 0;
        } else if (cmd == "getcrushmap") {
-         p->crush.encode(rdata);
+         p->crush->encode(rdata);
          ss << "got crush map from osdmap epoch " << p->get_epoch();
          r = 0;
        }
@@ -1752,7 +1752,7 @@ bool OSDMonitor::prepare_command(MMonCommand *m)
        if (pending_inc.crush.length())
          bl = pending_inc.crush;
        else
-         osdmap.crush.encode(bl);
+         osdmap.crush->encode(bl);
 
        CrushWrapper newcrush;
        bufferlist::iterator p = bl.begin();
@@ -1783,7 +1783,7 @@ bool OSDMonitor::prepare_command(MMonCommand *m)
        if (pending_inc.crush.length())
          bl = pending_inc.crush;
        else
-         osdmap.crush.encode(bl);
+         osdmap.crush->encode(bl);
 
        CrushWrapper newcrush;
        bufferlist::iterator p = bl.begin();
@@ -1812,7 +1812,7 @@ bool OSDMonitor::prepare_command(MMonCommand *m)
        if (pending_inc.crush.length())
          bl = pending_inc.crush;
        else
-         osdmap.crush.encode(bl);
+         osdmap.crush->encode(bl);
 
        CrushWrapper newcrush;
        bufferlist::iterator p = bl.begin();
@@ -1839,10 +1839,10 @@ bool OSDMonitor::prepare_command(MMonCommand *m)
     }
     else if (m->cmd[1] == "setmaxosd" && m->cmd.size() > 2) {
       int newmax = atoi(m->cmd[2].c_str());
-      if (newmax < osdmap.crush.get_max_devices()) {
+      if (newmax < osdmap.crush->get_max_devices()) {
        err = -ERANGE;
        ss << "cannot set max_osd to " << newmax << " which is < crush max_devices "
-          << osdmap.crush.get_max_devices();
+          << osdmap.crush->get_max_devices();
        goto out;
       }
 
@@ -2301,7 +2301,7 @@ bool OSDMonitor::prepare_command(MMonCommand *m)
                return true;
              }
            } else if (m->cmd[4] == "crush_ruleset") {
-             if (osdmap.crush.rule_exists(n)) {
+             if (osdmap.crush->rule_exists(n)) {
                if (pending_inc.new_pools.count(pool) == 0)
                  pending_inc.new_pools[pool] = *p;
                pending_inc.new_pools[pool].crush_ruleset = n;
index 2778f883aba1f434f7aa08c2351a580597df79f3..c142cda519e00a327bae55825d104f480d8462fb 100644 (file)
@@ -676,7 +676,7 @@ bool PGMonitor::register_new_pgs()
     int64_t poolid = p->first;
     pg_pool_t &pool = p->second;
     int ruleno = pool.get_crush_ruleset();
-    if (!osdmap->crush.rule_exists(ruleno)) 
+    if (!osdmap->crush->rule_exists(ruleno)) 
       continue;
 
     if (pool.get_last_change() <= pg_map.last_pg_scan ||
@@ -712,7 +712,7 @@ bool PGMonitor::register_new_pgs()
     }
   }
 
-  int max = MIN(osdmap->get_max_osd(), osdmap->crush.get_max_devices());
+  int max = MIN(osdmap->get_max_osd(), osdmap->crush->get_max_devices());
   int removed = 0;
   for (set<pg_t>::iterator p = pg_map.creating_pgs.begin();
        p != pg_map.creating_pgs.end();
@@ -757,7 +757,7 @@ void PGMonitor::send_pg_creates()
   utime_t now = ceph_clock_now(g_ceph_context);
   
   OSDMap *osdmap = &mon->osdmon()->osdmap;
-  int max = MIN(osdmap->get_max_osd(), osdmap->crush.get_max_devices());
+  int max = MIN(osdmap->get_max_osd(), osdmap->crush->get_max_devices());
 
   for (set<pg_t>::iterator p = pg_map.creating_pgs.begin();
        p != pg_map.creating_pgs.end();
index 296ea65f9f30604e778c2c090074b1563ab2fdf9..f060b29fd4d9a28ef12ad37821b52562a4dae76d 100644 (file)
@@ -725,7 +725,8 @@ int OSDMap::apply_incremental(Incremental &inc)
   // do new crush map last (after up/down stuff)
   if (inc.crush.length()) {
     bufferlist::iterator blp = inc.crush.begin();
-    crush.decode(blp);
+    crush.reset(new CrushWrapper);
+    crush->decode(blp);
   }
 
   calc_num_osds();
@@ -772,15 +773,15 @@ int OSDMap::_pg_to_osds(const pg_pool_t& pool, pg_t pg, vector<int>& osds) const
   unsigned size = pool.get_size();
   {
     int preferred = pg.preferred();
-    if (preferred >= max_osd || preferred >= crush.get_max_devices())
+    if (preferred >= max_osd || preferred >= crush->get_max_devices())
       preferred = -1;
 
-    assert(get_max_osd() >= crush.get_max_devices());
+    assert(get_max_osd() >= crush->get_max_devices());
 
     // what crush rule?
-    int ruleno = crush.find_rule(pool.get_crush_ruleset(), pool.get_type(), size);
+    int ruleno = crush->find_rule(pool.get_crush_ruleset(), pool.get_type(), size);
     if (ruleno >= 0)
-      crush.do_rule(ruleno, pps, osds, size, preferred, osd_weight);
+      crush->do_rule(ruleno, pps, osds, size, preferred, osd_weight);
   }
   
   return osds.size();
@@ -938,7 +939,7 @@ void OSDMap::encode_client_old(bufferlist& bl) const
 
   // crush
   bufferlist cbl;
-  crush.encode(cbl);
+  crush->encode(cbl);
   ::encode(cbl, bl);
 }
 
@@ -973,7 +974,7 @@ void OSDMap::encode(bufferlist& bl, uint64_t features) const
 
   // crush
   bufferlist cbl;
-  crush.encode(cbl);
+  crush->encode(cbl);
   ::encode(cbl, bl);
 
   // extended
@@ -1062,7 +1063,7 @@ void OSDMap::decode(bufferlist::iterator& p)
   bufferlist cbl;
   ::decode(cbl, p);
   bufferlist::iterator cblp = cbl.begin();
-  crush.decode(cblp);
+  crush->decode(cblp);
 
   // extended
   __u16 ev = 0;
@@ -1298,10 +1299,10 @@ void OSDMap::print_tree(ostream& out) const
   out << "# id\tweight\ttype name\tup/down\treweight\n";
   set<int> touched;
   set<int> roots;
-  crush.find_roots(roots);
+  crush->find_roots(roots);
   for (set<int>::iterator p = roots.begin(); p != roots.end(); p++) {
     list<qi> q;
-    q.push_back(qi(*p, 0, crush.get_bucket_weight(*p) / (float)0x10000));
+    q.push_back(qi(*p, 0, crush->get_bucket_weight(*p) / (float)0x10000));
     while (!q.empty()) {
       int cur = q.front().item;
       int depth = q.front().depth;
@@ -1319,14 +1320,14 @@ void OSDMap::print_tree(ostream& out) const
        continue;
       }
 
-      int type = crush.get_bucket_type(cur);
-      out << crush.get_type_name(type) << " " << crush.get_item_name(cur) << "\n";
+      int type = crush->get_bucket_type(cur);
+      out << crush->get_type_name(type) << " " << crush->get_item_name(cur) << "\n";
 
       // queue bucket contents...
-      int s = crush.get_bucket_size(cur);
+      int s = crush->get_bucket_size(cur);
       for (int k=s-1; k>=0; k--)
-       q.push_front(qi(crush.get_bucket_item(cur, k), depth+1,
-                       (float)crush.get_bucket_item_weight(cur, k) / (float)0x10000));
+       q.push_front(qi(crush->get_bucket_item(cur, k), depth+1,
+                       (float)crush->get_bucket_item_weight(cur, k) / (float)0x10000));
     }
   }
 
@@ -1398,7 +1399,7 @@ void OSDMap::build_simple(CephContext *cct, epoch_t e, uuid_d &fsid,
     pool_name[pool] = p->second;
   }
 
-  build_simple_crush_map(cct, crush, rulesets, nosd);
+  build_simple_crush_map(cct, *crush, rulesets, nosd);
 
   for (int i=0; i<nosd; i++) {
     set_state(i, 0);
@@ -1514,7 +1515,7 @@ void OSDMap::build_simple_from_conf(CephContext *cct, epoch_t e, uuid_d &fsid,
     pool_name[pool] = p->second;
   }
 
-  build_simple_crush_map_from_conf(cct, crush, rulesets);
+  build_simple_crush_map_from_conf(cct, *crush, rulesets);
 
   for (int i=0; i<=maxosd; i++) {
     set_state(i, 0);
index edac29f055a4afa1948d37382b1d6d270179a006..9580ea8f5272bc1604280ecf1524390b8adc22cf 100644 (file)
@@ -192,7 +192,7 @@ private:
   string cluster_snapshot;
 
  public:
-  CrushWrapper     crush;       // hierarchical map
+  std::tr1::shared_ptr<CrushWrapper> crush;       // hierarchical map
 
   friend class OSDMonitor;
   friend class PGMonitor;
@@ -204,7 +204,8 @@ private:
             flags(0),
             num_osd(0), max_osd(0),
             osd_addrs(new addrs_s),
-            cluster_snapshot_epoch(0) { 
+            cluster_snapshot_epoch(0),
+            crush(new CrushWrapper) {
     memset(&fsid, 0, sizeof(fsid));
   }
 
index 3fe61d73974d5bc18f3fcef42e3cff9c3f301165..5a816eb3a5978e66a5e18cd5ce01cabccfc7f5cf 100644 (file)
@@ -232,7 +232,7 @@ int main(int argc, const char **argv)
 
   if (!export_crush.empty()) {
     bufferlist cbl;
-    osdmap.crush.encode(cbl);
+    osdmap.crush->encode(cbl);
     r = cbl.write_file(export_crush.c_str());
     if (r < 0) {
       cerr << me << ": error writing crush map to " << import_crush << std::endl;