From: Sage Weil Date: Fri, 11 Sep 2015 21:41:01 +0000 (-0400) Subject: osd: allow peek_map_epoch to return an error X-Git-Tag: v0.94.4~27^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f237ed97228839a1b412ad213945f0343df05bf5;p=ceph.git osd: allow peek_map_epoch to return an error Allow PG::peek_map_epoch to return an error indicating the PG should be skipped. Signed-off-by: Sage Weil (cherry picked from commit f15d9585edc5a12ac2d076951076247253b897c2) [fixed *pepoch default of 0] [fixed other return paths in peek_map_epoch] --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 9ca9279eee2df..0c01ba6168df6 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -2819,7 +2819,13 @@ void OSD::load_pgs() dout(10) << "pgid " << pgid << " coll " << coll_t(pgid) << dendl; bufferlist bl; - epoch_t map_epoch = PG::peek_map_epoch(store, pgid, &bl); + epoch_t map_epoch = 0; + int r = PG::peek_map_epoch(store, pgid, &map_epoch, &bl); + if (r < 0) { + derr << __func__ << " unable to peek at " << pgid << " metadata, skipping" + << dendl; + continue; + } PG *pg = NULL; if (map_epoch > 0) { diff --git a/src/osd/PG.cc b/src/osd/PG.cc index acafb4f3d864c..3abfc5a412598 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -2808,9 +2808,10 @@ bool PG::_has_removal_flag(ObjectStore *store, return false; } -epoch_t PG::peek_map_epoch(ObjectStore *store, - spg_t pgid, - bufferlist *bl) +int PG::peek_map_epoch(ObjectStore *store, + spg_t pgid, + epoch_t *pepoch, + bufferlist *bl) { coll_t coll(pgid); hobject_t legacy_infos_oid(OSD::make_infos_oid()); @@ -2855,7 +2856,8 @@ epoch_t PG::peek_map_epoch(ObjectStore *store, return 0; if (struct_v < 6) { ::decode(cur_epoch, bp); - return cur_epoch; + *pepoch = cur_epoch; + return 0; } // get epoch out of leveldb @@ -2870,7 +2872,8 @@ epoch_t PG::peek_map_epoch(ObjectStore *store, } else { assert(0 == "unable to open pg metadata"); } - return cur_epoch; + *pepoch = cur_epoch; + return 0; } #pragma GCC diagnostic pop diff --git a/src/osd/PG.h b/src/osd/PG.h index ac6494ba35e9e..41de9d6d14a6a 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -2146,7 +2146,8 @@ public: __u8 &); void read_state(ObjectStore *store, bufferlist &bl); static bool _has_removal_flag(ObjectStore *store, spg_t pgid); - static epoch_t peek_map_epoch(ObjectStore *store, spg_t pgid, bufferlist *bl); + static int peek_map_epoch(ObjectStore *store, spg_t pgid, + epoch_t *pepoch, bufferlist *bl); void update_snap_map( const vector &log_entries, ObjectStore::Transaction& t); diff --git a/src/tools/ceph_objectstore_tool.cc b/src/tools/ceph_objectstore_tool.cc index f9d5473d913f0..9e6894664ca8c 100644 --- a/src/tools/ceph_objectstore_tool.cc +++ b/src/tools/ceph_objectstore_tool.cc @@ -738,10 +738,14 @@ int mark_pg_for_removal(ObjectStore *fs, spg_t pgid, ObjectStore::Transaction *t ghobject_t pgmeta_oid(info.pgid.make_pgmeta_oid()); bufferlist bl; - PG::peek_map_epoch(fs, pgid, &bl); + epoch_t pg_epoch = 0; + int r = PG::peek_map_epoch(fs, pgid, &pg_epoch, &bl); + if (r < 0) + cerr << __func__ << " warning: peek_map_epoch fails" << std::endl; + map past_intervals; __u8 struct_v; - int r = PG::read_info(fs, pgid, coll, bl, info, past_intervals, struct_v); + r = PG::read_info(fs, pgid, coll, bl, info, past_intervals, struct_v); if (r < 0) { cerr << __func__ << " error on read_info " << cpp_strerror(-r) << std::endl; return r; @@ -3058,7 +3062,11 @@ int main(int argc, char **argv) } bufferlist bl; - map_epoch = PG::peek_map_epoch(fs, pgid, &bl); + map_epoch = 0; + r = PG::peek_map_epoch(fs, pgid, &map_epoch, &bl); + if (r < 0) + cerr << "peek_map_epoch returns an error" << std::endl; + if (debug) cerr << "map_epoch " << map_epoch << std::endl;