]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/: Add a shard parameter to SnapMapper to handle multiple pg shards
authorSamuel Just <sam.just@inktank.com>
Thu, 6 Feb 2014 02:42:34 +0000 (18:42 -0800)
committerSamuel Just <sam.just@inktank.com>
Tue, 18 Feb 2014 04:11:05 +0000 (20:11 -0800)
Signed-off-by: Samuel Just <sam.just@inktank.com>
src/osd/OSD.cc
src/osd/PG.cc
src/osd/SnapMapper.cc
src/osd/SnapMapper.h
src/test/test_snap_mapper.cc
src/tools/ceph-filestore-dump.cc

index e2b8353fff21cd3fe1152b20fcd7dd9f4203a253..22b1ad4215b3c56eaf47f26615c00a3981a5a079 100644 (file)
@@ -1698,13 +1698,17 @@ void OSD::recursive_remove_collection(ObjectStore *store, coll_t tmp)
     store,
     coll_t(),
     make_snapmapper_oid());
-  SnapMapper mapper(&driver, 0, 0, 0);
+
+  spg_t pg;
+  tmp.is_pg_prefix(pg);
+
+  ObjectStore::Transaction t;
+  SnapMapper mapper(&driver, 0, 0, 0, pg.shard);
 
   vector<ghobject_t> objects;
   store->collection_list(tmp, objects);
 
   // delete them.
-  ObjectStore::Transaction t;
   unsigned removed = 0;
   for (vector<ghobject_t>::iterator p = objects.begin();
        p != objects.end();
index 0ba7cadc652ab25829a31f0b1729ad7fded0361c..7046a6fcdcf7d91864bfdb204ee0f9c01fbb6053 100644 (file)
@@ -148,7 +148,8 @@ PG::PG(OSDService *o, OSDMapRef curmap,
     &osdriver,
     p.m_seed,
     p.get_split_bits(curmap->get_pg_num(_pool.id)),
-    _pool.id),
+    _pool.id,
+    p.shard),
   map_lock("PG::map_lock"),
   osdmap_ref(curmap), last_persisted_osdmap_ref(curmap), pool(_pool),
   _lock("PG::_lock"),
index 315e2e2fe8698d383a2c93cf3352e97e95811ac2..870fdd059829be0456f4a5a97b73966daa36eca3 100644 (file)
@@ -80,7 +80,7 @@ string SnapMapper::get_prefix(snapid_t snap)
 string SnapMapper::to_raw_key(
   const pair<snapid_t, hobject_t> &in)
 {
-  return get_prefix(in.first) + in.second.to_str();
+  return get_prefix(in.first) + shard_prefix + in.second.to_str();
 }
 
 pair<string, bufferlist> SnapMapper::to_raw(
@@ -110,7 +110,7 @@ bool SnapMapper::is_mapping(const string &to_test)
 
 string SnapMapper::to_object_key(const hobject_t &hoid)
 {
-  return OBJECT_PREFIX + hoid.to_str();
+  return OBJECT_PREFIX + shard_prefix + hoid.to_str();
 }
 
 void SnapMapper::object_snaps::encode(bufferlist &bl) const
index f0d0baa219082e9cee97f2fc8ff960252a6c5db6..5565e175bd120ce621e62ee03883f2f0636b3929 100644 (file)
@@ -115,10 +115,10 @@ private:
 
   static std::string get_prefix(snapid_t snap);
 
-  static std::string to_raw_key(
+  std::string to_raw_key(
     const std::pair<snapid_t, hobject_t> &to_map);
 
-  static std::pair<std::string, bufferlist> to_raw(
+  std::pair<std::string, bufferlist> to_raw(
     const std::pair<snapid_t, hobject_t> &to_map);
 
   static bool is_mapping(const std::string &to_test);
@@ -150,17 +150,29 @@ private:
     );
 
 public:
+  static string make_shard_prefix(shard_id_t shard) {
+    if (shard == ghobject_t::NO_SHARD)
+      return string();
+    char buf[20];
+    int r = snprintf(buf, sizeof(buf), ".%x", (int)shard);
+    assert(r < (int)sizeof(buf));
+    return string(buf, r) + '_';
+  }
   uint32_t mask_bits;
   const uint32_t match;
   string last_key_checked;
   const int64_t pool;
+  const shard_id_t shard;
+  const string shard_prefix;
   SnapMapper(
     MapCacher::StoreDriver<std::string, bufferlist> *driver,
     uint32_t match,  ///< [in] pgid
     uint32_t bits,   ///< [in] current split bits
-    int64_t pool     ///< [in] pool
+    int64_t pool,    ///< [in] pool
+    shard_id_t shard ///< [in] shard
     )
-    : backend(driver), mask_bits(bits), match(match), pool(pool) {
+    : backend(driver), mask_bits(bits), match(match), pool(pool),
+      shard(shard), shard_prefix(make_shard_prefix(shard)) {
     update_bits(mask_bits);
   }
 
@@ -171,10 +183,16 @@ public:
     ) {
     assert(new_bits >= mask_bits);
     mask_bits = new_bits;
-    prefixes = hobject_t::get_prefixes(
+    set<string> _prefixes = hobject_t::get_prefixes(
       mask_bits,
       match,
       pool);
+    prefixes.clear();
+    for (set<string>::iterator i = _prefixes.begin();
+        i != _prefixes.end();
+        ++i) {
+      prefixes.insert(shard_prefix + *i);
+    }
   }
 
   /// Update snaps for oid, empty new_snaps removes the mapping
index eaf308cbb5f9f30f1ccb4c9ffd63e6c4301da969..04db762b1a9003d65b22cf39c7d2450dfde7103e 100644 (file)
@@ -453,7 +453,8 @@ public:
     uint32_t mask,
     uint32_t bits)
     : driver(driver),
-      mapper(new SnapMapper(driver, mask, bits, 0)), mask(mask), bits(bits),
+      mapper(new SnapMapper(driver, mask, bits, 0, 1)),
+             mask(mask), bits(bits),
       lock("lock") {}
 
   hobject_t random_hobject() {
index b4220bae3072724f1a960558d8922e6471d671d0..60f4809500869bc4969f65149fe76c972af2282c 100644 (file)
@@ -374,11 +374,13 @@ int get_log(ObjectStore *fs, coll_t coll, pg_t pgid, const pg_info_t &info,
 //Based on RemoveWQ::_process()
 void remove_coll(ObjectStore *store, const coll_t &coll)
 {
+  spg_t pg;
+  coll.is_pg_prefix(pg);
   OSDriver driver(
     store,
     coll_t(),
     OSD::make_snapmapper_oid());
-  SnapMapper mapper(&driver, 0, 0, 0);
+  SnapMapper mapper(&driver, 0, 0, 0, pg.shard);
 
   vector<ghobject_t> objects;
   ghobject_t next;
@@ -856,7 +858,9 @@ int get_object(ObjectStore *store, coll_t coll, bufferlist &bl)
     store,
     coll_t(),
     OSD::make_snapmapper_oid());
-  SnapMapper mapper(&driver, 0, 0, 0);
+  spg_t pg;
+  coll.is_pg_prefix(pg);
+  SnapMapper mapper(&driver, 0, 0, 0, pg.shard);
 
   t->touch(coll, ob.hoid);