From: Sage Weil Date: Wed, 14 Oct 2015 13:43:29 +0000 (-0400) Subject: Revert "osd: drop support for pre-hammer pg metadata" X-Git-Tag: v9.2.0~6^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=de97840a75285138467593ca6ac87b30bb7bdddc;p=ceph.git Revert "osd: drop support for pre-hammer pg metadata" This reverts commit cd4e676e6d45c8166290ef834d73c2a0bda98fa2. --- diff --git a/src/osd/PG.cc b/src/osd/PG.cc index a31739577e40..c0cc9e8714e2 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -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 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 *km, epoch_t epoch, pg_info_t &info, coll_t coll, @@ -2725,6 +2758,10 @@ void PG::prepare_write_info(map *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 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 km; diff --git a/src/osd/PG.h b/src/osd/PG.h index 3860ad885423..0ae3879f4fcd 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -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; }