]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd_types: pg_t: add get_ancestor() method
authorSage Weil <sage@inktank.com>
Fri, 18 Apr 2014 04:05:49 +0000 (21:05 -0700)
committerSage Weil <sage@inktank.com>
Fri, 18 Apr 2014 04:17:40 +0000 (21:17 -0700)
Give us the ancestor for when the pool had a past value for pg_num.

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

index dca7bbf605f3b9128d237cfdd2d7de5ff5c8e358..33b1b9c345962c08231aa35bff915f36d14c206b 100644 (file)
@@ -393,6 +393,15 @@ ostream& operator<<(ostream& out, const spg_t &pg)
   return out;
 }
 
+pg_t pg_t::get_ancestor(unsigned old_pg_num) const
+{
+  int old_bits = pg_pool_t::calc_bits_of(old_pg_num);
+  int old_mask = (1 << old_bits) - 1;
+  pg_t ret = *this;
+  ret.m_seed = ceph_stable_mod(m_seed, old_pg_num, old_mask);
+  return ret;
+}
+
 bool pg_t::is_split(unsigned old_pg_num, unsigned new_pg_num, set<pg_t> *children) const
 {
   assert(m_seed < old_pg_num);
index 4154d42fcfba844c5702282115e1568236cbec8b..7874977ea92c3fcd4649ff3d2920a9eec08d1977 100644 (file)
@@ -311,6 +311,7 @@ struct pg_t {
   }
 
   pg_t get_parent() const;
+  pg_t get_ancestor(unsigned old_pg_num) const;
 
   int print(char *o, int maxlen) const;
   bool parse(const char *s);
index 6380211cf811c203db54d858d097614b6dd226ff..ac218fa80d3d878d6ffe2c9b58a81585a206d4b8 100644 (file)
@@ -558,6 +558,18 @@ TEST(pg_interval_t, check_new_interval)
   }
 }
 
+TEST(pg_t, get_ancestor)
+{
+  ASSERT_EQ(pg_t(0, 0, -1), pg_t(16, 0, -1).get_ancestor(16));
+  ASSERT_EQ(pg_t(1, 0, -1), pg_t(17, 0, -1).get_ancestor(16));
+  ASSERT_EQ(pg_t(0, 0, -1), pg_t(16, 0, -1).get_ancestor(8));
+  ASSERT_EQ(pg_t(16, 0, -1), pg_t(16, 0, -1).get_ancestor(80));
+  ASSERT_EQ(pg_t(16, 0, -1), pg_t(16, 0, -1).get_ancestor(83));
+  ASSERT_EQ(pg_t(1, 0, -1), pg_t(1321, 0, -1).get_ancestor(123).get_ancestor(8));
+  ASSERT_EQ(pg_t(3, 0, -1), pg_t(1323, 0, -1).get_ancestor(123).get_ancestor(8));
+  ASSERT_EQ(pg_t(3, 0, -1), pg_t(1323, 0, -1).get_ancestor(8));
+}
+
 TEST(pg_t, split)
 {
   pg_t pgid(0, 0, -1);