]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Merge branch 'wip-osdmap'
authorSage Weil <sage.weil@dreamhost.com>
Sat, 28 Apr 2012 22:25:20 +0000 (15:25 -0700)
committerSage Weil <sage.weil@dreamhost.com>
Sat, 28 Apr 2012 22:25:20 +0000 (15:25 -0700)
Conflicts:
src/mon/PGMonitor.cc
src/osd/OSDMap.h

1  2 
src/Makefile.am
src/common/config_opts.h
src/mon/OSDMonitor.cc
src/mon/PGMonitor.cc
src/osd/OSD.cc
src/osd/OSDMap.cc
src/osd/OSDMap.h
src/osdmaptool.cc

diff --cc src/Makefile.am
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc src/osd/OSD.cc
Simple merge
index e79264b0a77a695f9c22079045cfb3b5548cfb3a,f042dd74ab0d15e3de9699089fc45360bef36c06..8396111ceb80d871b2e0622707da75b73a33363e
@@@ -636,6 -744,147 +744,135 @@@ int OSDMap::apply_incremental(Increment
    return 0;
  }
  
 -  // mix in preferred osd, so we don't get the same peers for
 -  // all of the placement pgs (e.g. 0.0p*)
 -  if (loc.get_preferred() >= 0)
 -    ps += loc.get_preferred();
 -  pg = pg_t(ps, loc.get_pool(), loc.get_preferred());
+ // mapping
+ int OSDMap::object_locator_to_pg(const object_t& oid, const object_locator_t& loc, pg_t &pg) const
+ {
+   // calculate ps (placement seed)
+   const pg_pool_t *pool = get_pg_pool(loc.get_pool());
+   if (!pool)
+     return -ENOENT;
+   ps_t ps;
+   if (loc.key.length())
+     ps = ceph_str_hash(pool->object_hash, loc.key.c_str(), loc.key.length());
+   else
+     ps = ceph_str_hash(pool->object_hash, oid.name.c_str(), oid.name.length());
 -ceph_object_layout OSDMap::make_object_layout(object_t oid, int pg_pool, int preferred) const
++  pg = pg_t(ps, loc.get_pool(), -1);
+   return 0;
+ }
 -  loc.preferred = preferred;
++ceph_object_layout OSDMap::make_object_layout(object_t oid, int pg_pool) const
+ {
+   object_locator_t loc(pg_pool);
 -  {
 -    int preferred = pg.preferred();
 -    if (preferred >= max_osd || preferred >= crush->get_max_devices())
 -      preferred = -1;
+   ceph_object_layout ol;
+   pg_t pgid = object_locator_to_pg(oid, loc);
+   ol.ol_pgid = pgid.get_old_pg().v;
+   ol.ol_stripe_unit = 0;
+   return ol;
+ }
+ int OSDMap::_pg_to_osds(const pg_pool_t& pool, pg_t pg, vector<int>& osds) const
+ {
+   // map to osds[]
+   ps_t pps = pool.raw_pg_to_pps(pg);  // placement ps
+   unsigned size = pool.get_size();
 -    assert(get_max_osd() >= crush->get_max_devices());
 -
 -    // what crush rule?
 -    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);
 -  }
++  // what crush rule?
++  int ruleno = crush->find_rule(pool.get_crush_ruleset(), pool.get_type(), size);
++  if (ruleno >= 0)
++    crush->do_rule(ruleno, pps, osds, size, -1, osd_weight);
+   
+   return osds.size();
+ }
+ // pg -> (up osd list)
+ void OSDMap::_raw_to_up_osds(pg_t pg, vector<int>& raw, vector<int>& up) const
+ {
+   up.clear();
+   for (unsigned i=0; i<raw.size(); i++) {
+     if (!exists(raw[i]) || is_down(raw[i])) 
+       continue;
+     up.push_back(raw[i]);
+   }
+ }
+   
+ bool OSDMap::_raw_to_temp_osds(const pg_pool_t& pool, pg_t pg, vector<int>& raw, vector<int>& temp) const
+ {
+   pg = pool.raw_pg_to_pg(pg);
+   map<pg_t,vector<int> >::const_iterator p = pg_temp->find(pg);
+   if (p != pg_temp->end()) {
+     temp.clear();
+     for (unsigned i=0; i<p->second.size(); i++) {
+       if (!exists(p->second[i]) || is_down(p->second[i]))
+       continue;
+       temp.push_back(p->second[i]);
+     }
+     return true;
+   }
+   return false;
+ }
+ int OSDMap::pg_to_osds(pg_t pg, vector<int>& raw) const
+ {
+   const pg_pool_t *pool = get_pg_pool(pg.pool());
+   if (!pool)
+     return 0;
+   return _pg_to_osds(*pool, pg, raw);
+ }
+ int OSDMap::pg_to_acting_osds(pg_t pg, vector<int>& acting) const
+ {
+   const pg_pool_t *pool = get_pg_pool(pg.pool());
+   if (!pool)
+     return 0;
+   vector<int> raw;
+   _pg_to_osds(*pool, pg, raw);
+   if (!_raw_to_temp_osds(*pool, pg, raw, acting))
+     _raw_to_up_osds(pg, raw, acting);
+   return acting.size();
+ }
+ void OSDMap::pg_to_raw_up(pg_t pg, vector<int>& up)
+ {
+   const pg_pool_t *pool = get_pg_pool(pg.pool());
+   if (!pool)
+     return;
+   vector<int> raw;
+   _pg_to_osds(*pool, pg, raw);
+   _raw_to_up_osds(pg, raw, up);
+ }
+   
+ void OSDMap::pg_to_up_acting_osds(pg_t pg, vector<int>& up, vector<int>& acting) const
+ {
+   const pg_pool_t *pool = get_pg_pool(pg.pool());
+   if (!pool)
+     return;
+   vector<int> raw;
+   _pg_to_osds(*pool, pg, raw);
+   _raw_to_up_osds(pg, raw, up);
+   if (!_raw_to_temp_osds(*pool, pg, raw, acting))
+     acting = up;
+ }
+ int OSDMap::calc_pg_rank(int osd, vector<int>& acting, int nrep)
+ {
+   if (!nrep)
+     nrep = acting.size();
+   for (int i=0; i<nrep; i++) 
+     if (acting[i] == osd)
+       return i;
+   return -1;
+ }
+ int OSDMap::calc_pg_role(int osd, vector<int>& acting, int nrep)
+ {
+   if (!nrep)
+     nrep = acting.size();
+   return calc_pg_rank(osd, acting, nrep);
+ }
  // serialize, unserialize
  void OSDMap::encode_client_old(bufferlist& bl) const
  {
index ed3795c5fa31bb263a866ae5f9079ac3b67ccffd,a7a5cc2572d55338b8337123db80ea1bc578b07b..c7d1aba6729ba80408b462d8aff47115429bab75
@@@ -439,18 -378,11 +378,10 @@@ public
  
    // oid -> pg
    ceph_object_layout file_to_object_layout(object_t oid, ceph_file_layout& layout) const {
 -    return make_object_layout(oid, layout.fl_pg_pool,
 -                            layout.fl_pg_preferred);
 +    return make_object_layout(oid, layout.fl_pg_pool);
    }
  
-   ceph_object_layout make_object_layout(object_t oid, int pg_pool) const {
-     object_locator_t loc(pg_pool);
-     
-     ceph_object_layout ol;
-     pg_t pgid = object_locator_to_pg(oid, loc);
-     ol.ol_pgid = pgid.get_old_pg().v;
-     ol.ol_stripe_unit = 0;
-     return ol;
-   }
 -  ceph_object_layout make_object_layout(object_t oid, int pg_pool, int preferred=-1) const;
++  ceph_object_layout make_object_layout(object_t oid, int pg_pool) const;
  
    int get_pg_num(int pg_pool) const
    {
Simple merge