]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/OSDMap: implement propapage_snaps_to_tiers()
authorSage Weil <sage@inktank.com>
Thu, 19 Dec 2013 22:59:45 +0000 (14:59 -0800)
committerSage Weil <sage@inktank.com>
Sun, 22 Dec 2013 17:49:24 +0000 (09:49 -0800)
Tier pools mirror the base pool's snapshot metadata.

Signed-off-by: Sage Weil <sage@inktank.com>
src/osd/OSDMap.cc
src/osd/OSDMap.h

index 0204c1211328e8c332210d46dce214ee3012caf2..a09ccf072ed10663a26d847310f5ce74f0d95960 100644 (file)
@@ -172,6 +172,46 @@ int OSDMap::Incremental::identify_osd(uuid_d u) const
   return -1;
 }
 
+int OSDMap::Incremental::propagate_snaps_to_tiers(const OSDMap& osdmap)
+{
+  assert(epoch == osdmap.get_epoch() + 1);
+  for (map<int64_t,pg_pool_t>::iterator p = new_pools.begin();
+       p != new_pools.end(); ++p) {
+    if (!p->second.tiers.empty()) {
+      pg_pool_t& base = p->second;
+      for (set<uint64_t>::const_iterator q = base.tiers.begin();
+          q != base.tiers.end();
+          ++q) {
+       map<int64_t,pg_pool_t>::iterator r = new_pools.find(*q);
+       pg_pool_t *tier = 0;
+       if (r == new_pools.end()) {
+         const pg_pool_t *orig = osdmap.get_pg_pool(*q);
+         if (!orig)
+           return -EIO;
+
+         // skip update?
+         if (tier->snap_seq == base.snap_seq &&
+             tier->snap_epoch == base.snap_epoch)
+           continue;
+
+         tier = get_new_pool(*q, orig);
+       } else {
+         tier = &r->second;
+       }
+       if (tier->tier_of != p->first)
+         return -EIO;
+
+       tier->snap_seq = base.snap_seq;
+       tier->snap_epoch = base.snap_epoch;
+       tier->snaps = base.snaps;
+       tier->removed_snaps = base.removed_snaps;
+      }
+    }
+  }
+  return 0;
+}
+
+
 bool OSDMap::subtree_is_down(int id, set<int> *down_cache) const
 {
   if (id >= 0)
index bd8f09b682e315849d06d9e729fc153e125f8a02..d7c9c45442b19f40ed71750a79aac3f542d2b6f0 100644 (file)
@@ -171,6 +171,9 @@ public:
        new_pools[pool] = *orig;
       return &new_pools[pool];
     }
+
+    /// propage update pools' snap metadata to any of their tiers
+    int propagate_snaps_to_tiers(const OSDMap &base);
   };
   
 private: