]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Revert "osd: drop support for pre-hammer pg metadata"
authorSage Weil <sage@redhat.com>
Wed, 14 Oct 2015 13:43:29 +0000 (09:43 -0400)
committerSage Weil <sage@redhat.com>
Fri, 16 Oct 2015 18:08:42 +0000 (14:08 -0400)
This reverts commit cd4e676e6d45c8166290ef834d73c2a0bda98fa2.

src/osd/PG.cc
src/osd/PG.h

index a31739577e40599edd4a414f3741ed3145485903..c0cc9e8714e2b7cd8898cc56940189332d3d92e5 100644 (file)
@@ -2648,14 +2648,47 @@ void PG::init(
   write_if_dirty(*t);
 }
 
+#pragma GCC diagnostic ignored "-Wpragmas"
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+
 void PG::upgrade(ObjectStore *store)
 {
   assert(info_struct_v <= 8);
   ObjectStore::Transaction t;
 
-  assert(0 == "no support for pre v8");
+  assert(info_struct_v == 7);
+
+  // 7 -> 8
+  pg_log.mark_log_for_rewrite();
+  ghobject_t log_oid(OSD::make_pg_log_oid(pg_id));
+  ghobject_t biginfo_oid(OSD::make_pg_biginfo_oid(pg_id));
+  t.remove(coll_t::meta(), log_oid);
+  t.remove(coll_t::meta(), biginfo_oid);
+  t.collection_rmattr(coll, "info");
+
+  t.touch(coll, pgmeta_oid);
+  map<string,bufferlist> v;
+  __u8 ver = cur_struct_v;
+  ::encode(ver, v[infover_key]);
+  t.omap_setkeys(coll, pgmeta_oid, v);
+
+  dirty_info = true;
+  dirty_big_info = true;
+  write_if_dirty(t);
+
+  int r = store->apply_transaction(t);
+  if (r != 0) {
+    derr << __func__ << ": apply_transaction returned "
+        << cpp_strerror(r) << dendl;
+    assert(0);
+  }
+  assert(r == 0);
 }
 
+#pragma GCC diagnostic pop
+#pragma GCC diagnostic warning "-Wpragmas"
+
 int PG::_prepare_write_info(map<string,bufferlist> *km,
                            epoch_t epoch,
                            pg_info_t &info, coll_t coll,
@@ -2725,6 +2758,10 @@ void PG::prepare_write_info(map<string,bufferlist> *km)
   dirty_big_info = false;
 }
 
+#pragma GCC diagnostic ignored "-Wpragmas"
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+
 bool PG::_has_removal_flag(ObjectStore *store,
                           spg_t pgid)
 {
@@ -2739,6 +2776,10 @@ bool PG::_has_removal_flag(ObjectStore *store,
       values.size() == 1)
     return true;
 
+  // try old way.  tolerate EOPNOTSUPP.
+  char val;
+  if (store->collection_getattr(coll, "remove", &val, 1) > 0)
+    return true;
   return false;
 }
 
@@ -2764,26 +2805,55 @@ int PG::peek_map_epoch(ObjectStore *store,
   keys.insert(epoch_key);
   map<string,bufferlist> values;
   int r = store->omap_get_values(coll, pgmeta_oid, keys, &values);
-  if (r != 0) {
-    // probably bug 10617; see OSD::load_pgs()
-    return -1;
-  }
-  assert(values.size() == 2);
+  if (r == 0) {
+    assert(values.size() == 2);
 
-  // sanity check version
-  bufferlist::iterator bp = values[infover_key].begin();
-  __u8 struct_v = 0;
-  ::decode(struct_v, bp);
-  assert(struct_v >= 8);
+    // sanity check version
+    bufferlist::iterator bp = values[infover_key].begin();
+    __u8 struct_v = 0;
+    ::decode(struct_v, bp);
+    assert(struct_v >= 8);
 
-  // get epoch
-  bp = values[epoch_key].begin();
-  ::decode(cur_epoch, bp);
+    // get epoch
+    bp = values[epoch_key].begin();
+    ::decode(cur_epoch, bp);
+  } else if (r == -ENOENT) {
+    // legacy: try v7 or older
+    r = store->collection_getattr(coll, "info", *bl);
+    if (r <= 0) {
+      // probably bug 10617; see OSD::load_pgs()
+      return -1;
+    }
+    bufferlist::iterator bp = bl->begin();
+    __u8 struct_v = 0;
+    ::decode(struct_v, bp);
+    assert(struct_v >= 5);
+    if (struct_v < 6) {
+      ::decode(cur_epoch, bp);
+      *pepoch = cur_epoch;
+      return cur_epoch;
+    }
+
+    // get epoch out of leveldb
+    string ek = get_epoch_key(pgid);
+    keys.clear();
+    values.clear();
+    keys.insert(ek);
+    store->omap_get_values(coll_t::meta(), legacy_infos_oid, keys, &values);
+    assert(values.size() == 1);
+    bufferlist::iterator p = values[ek].begin();
+    ::decode(cur_epoch, p);
+  } else {
+    assert(0 == "unable to open pg metadata");
+  }
 
   *pepoch = cur_epoch;
   return 0;
 }
 
+#pragma GCC diagnostic pop
+#pragma GCC diagnostic warning "-Wpragmas"
+
 void PG::write_if_dirty(ObjectStore::Transaction& t)
 {
   map<string,bufferlist> km;
index 3860ad88542316bb4a7e815eaaee64f40b851e79..0ae3879f4fcd1b370e542fc083db08bf7aa5fec1 100644 (file)
@@ -286,9 +286,10 @@ public:
   // pg state
   pg_info_t        info;
   __u8 info_struct_v;
-  // v8 was pgmeta, first appeared in hammer.
   static const __u8 cur_struct_v = 8;
-  static const __u8 compat_struct_v = 8;
+  // v7 was SnapMapper addition in 86658392516d5175b2756659ef7ffaaf95b0f8ad
+  // (first appeared in cuttlefish).
+  static const __u8 compat_struct_v = 7;
   bool must_upgrade() {
     return info_struct_v < cur_struct_v;
   }