From 55f7e567deaf652c80ef9b36ceef608e2c8e1cdc Mon Sep 17 00:00:00 2001 From: Colin Patrick McCabe Date: Wed, 24 Nov 2010 20:55:14 -0800 Subject: [PATCH] osd: mark_all_unfound_as_lost: set lost attr In mark_all_unfound_as_lost, we need to set the lost bit in the objects' object_info_t. Signed-off-by: Colin McCabe --- src/osd/OSD.cc | 2 +- src/osd/PG.cc | 41 +++++++++++++++++++++++++++++++---------- src/osd/PG.h | 5 ++++- src/osd/ReplicatedPG.cc | 5 +++++ 4 files changed, 41 insertions(+), 12 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 744e8a75e41..a7200de605c 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -3095,7 +3095,7 @@ void OSD::activate_map(ObjectStore::Transaction& t, list& tfin) if (pg->is_active() && pg->is_primary() && (pg->missing.num_missing() > pg->missing_loc.size())) { if (pg->all_unfound_are_lost(osdmap)) { - pg->mark_all_unfound_as_lost(); + pg->mark_all_unfound_as_lost(t); } } diff --git a/src/osd/PG.cc b/src/osd/PG.cc index a5ad656c643..543d9176b7b 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -994,6 +994,35 @@ bool PG::all_unfound_are_lost(const OSDMap* osdmap) const return true; } +/* Mark an object as lost + */ +void PG::mark_obj_as_lost(ObjectStore::Transaction& t, + const sobject_t &lost_soid) +{ + // Wake anyone waiting for this object. Now that it's been marked as lost, + // we will just return an error code. + hash_map >::iterator wmo = + waiting_for_missing_object.find(lost_soid); + if (wmo != waiting_for_missing_object.end()) { + osd->take_waiters(wmo->second); + } + + // Erase from the missing and missing_loc set. + missing.missing.erase(lost_soid); + missing_loc.erase(lost_soid); + + // Tell the object store that this object is lost. + bufferlist b1; + int r = osd->store->getattr(coll_t(info.pgid), lost_soid, OI_ATTR, b1); + assert(r >= 0); + object_info_t oi(b1); + oi.lost = true; + oi.version.version++; + bufferlist b2; + oi.encode(b2); + t.setattr(coll_t(info.pgid), lost_soid, OI_ATTR, b2); +} + class CompareSobjectPtrs { public: bool operator()(const sobject_t *a, const sobject_t *b) { @@ -1003,7 +1032,7 @@ public: /* Mark all unfound objects as lost. */ -void PG::mark_all_unfound_as_lost() +void PG::mark_all_unfound_as_lost(ObjectStore::Transaction& t) { dout(3) << __func__ << dendl; @@ -1051,15 +1080,7 @@ void PG::mark_all_unfound_as_lost() dout(10) << __func__ << ": created event " << e << dendl; - // Wake anyone waiting for this object. Now that it's been marked as lost, - // we will just return an error code. - hash_map >::iterator wmo = - waiting_for_missing_object.find(lost_soid); - if (wmo != waiting_for_missing_object.end()) { - osd->take_waiters(wmo->second); - } - - missing.missing.erase(lost_soid); + mark_obj_as_lost(t, lost_soid); del.erase(d++); } diff --git a/src/osd/PG.h b/src/osd/PG.h index dc93176da98..f07d4a1375d 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -805,8 +805,11 @@ public: void clear_prior(); bool prior_set_affected(OSDMap *map); + bool all_unfound_are_lost(const OSDMap* osdmap) const; - void mark_all_unfound_as_lost(); + void mark_obj_as_lost(ObjectStore::Transaction& t, + const sobject_t &lost_soid); + void mark_all_unfound_as_lost(ObjectStore::Transaction& t); bool calc_min_last_complete_ondisk() { eversion_t min = last_complete_ondisk; diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 0769ebd9ed2..d69e690b8f9 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -243,6 +243,7 @@ void ReplicatedPG::do_op(MOSDOp *op) dout(10) << "do_op " << *op << dendl; if (finalizing_scrub && op->may_write()) { + dout(20) << __func__ << ": waiting for scrub" << dendl; waiting_for_active.push_back(op); return; } @@ -268,9 +269,13 @@ void ReplicatedPG::do_op(MOSDOp *op) if ((op->may_read()) && (obc->obs.oi.lost)) { // This object is lost. Reading from it returns an error. + dout(20) << __func__ << ": object " << obc->obs.oi.soid + << " is lost" << dendl; osd->reply_op_error(op, -ENFILE); return; } + dout(25) << __func__ << ": object " << obc->obs.oi.soid + << " has oi of " << obc->obs.oi << dendl; bool ok; dout(10) << "do_op mode is " << mode << dendl; -- 2.47.3