]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: mark_all_unfound_as_lost: set lost attr
authorColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Thu, 25 Nov 2010 04:55:14 +0000 (20:55 -0800)
committerColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Tue, 30 Nov 2010 23:48:48 +0000 (15:48 -0800)
In mark_all_unfound_as_lost, we need to set the lost bit in the objects'
object_info_t.

Signed-off-by: Colin McCabe <colinm@hq.newdream.net>
src/osd/OSD.cc
src/osd/PG.cc
src/osd/PG.h
src/osd/ReplicatedPG.cc

index 744e8a75e41f13edf39834080d11de3de46c9042..a7200de605c7d86aecdf05925ed28fcde2aa1d27 100644 (file)
@@ -3095,7 +3095,7 @@ void OSD::activate_map(ObjectStore::Transaction& t, list<Context*>& 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);
       }
     }
 
index a5ad656c643d25106b3940bd72475e183c6944d4..543d9176b7b807a685ce0d476bacbab015f847a4 100644 (file)
@@ -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<sobject_t, list<class Message*> >::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<sobject_t, list<class Message*> >::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++);
   }
 
index dc93176da986a2258d2085ad29ac4bae08066367..f07d4a1375dfe5b532b13ce511d22a360912ca00 100644 (file)
@@ -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;
index 0769ebd9ed210ea8271677d98d43620496586525..d69e690b8f9bae8bcf13c448ebc5515bf8473d95 100644 (file)
@@ -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;