]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: add object to missing if we find it missing on disk
authorSage Weil <sage.weil@dreamhost.com>
Tue, 1 Mar 2011 23:11:47 +0000 (15:11 -0800)
committerSage Weil <sage.weil@dreamhost.com>
Tue, 1 Mar 2011 23:11:47 +0000 (15:11 -0800)
If the recovery finds the object missing on disk during recovery, add it
to the local missing set so we can (hopefully) recover it from another
replica.

Signed-off-by: Sage Weil <sage.weil@dreamhost.com>
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h

index ee00a0099ee316753584e9d8afe30ae5e5a32a66..ab9b400e4da5b3233ef960633a22bb74a6584280 100644 (file)
@@ -137,7 +137,16 @@ void ReplicatedPG::wait_for_degraded_object(const sobject_t& soid, Message *m)
            << soid 
            << ", pushing"
            << dendl;
-    recover_object_replicas(soid);
+    eversion_t v;
+    for (unsigned i = 1; i < acting.size(); i++) {
+      int peer = acting[i];
+      if (peer_missing.count(peer) &&
+         peer_missing[peer].missing.count(soid)) {
+       v = peer_missing[peer].missing[soid].need;
+       break;
+      }
+    }
+    recover_object_replicas(soid, v);
   }
   waiting_for_degraded_object[soid].push_back(m);
 }
@@ -3453,7 +3462,7 @@ int ReplicatedPG::send_push_op(const sobject_t& soid, eversion_t version, int pe
   object_info_t oi(bv);
 
   if (oi.version != version) {
-    osd->clog.error() << "push " << soid << " v " << version << " to osd" << peer
+    osd->clog.error() << info.pgid << " push " << soid << " v " << version << " to osd" << peer
                      << " failed because local copy is " << oi.version << "\n";
     return -1;
   }
@@ -3578,9 +3587,8 @@ void ReplicatedPG::sub_op_pull(MOSDSubOp *op)
   struct stat st;
   int r = osd->store->stat(coll, soid, &st);
   if (r != 0) {
-    osd->clog.error() << op->get_source() << " tried to pull " << soid
-       << " in " << info.pgid << " but got "
-       << cpp_strerror(-r) << "\n";
+    osd->clog.error() << info.pgid << " " << op->get_source() << " tried to pull " << soid
+                     << " but got " << cpp_strerror(-r) << "\n";
     send_push_op_blank(soid, op->get_source().num());
   } else {
     uint64_t size = st.st_size;
@@ -4228,7 +4236,7 @@ int ReplicatedPG::recover_primary(int max)
   return started;
 }
 
-int ReplicatedPG::recover_object_replicas(const sobject_t& soid)
+int ReplicatedPG::recover_object_replicas(const sobject_t& soid, eversion_t v)
 {
   int started = 0;
 
@@ -4237,7 +4245,16 @@ int ReplicatedPG::recover_object_replicas(const sobject_t& soid)
   // NOTE: we know we will get a valid oloc off of disk here.
   ObjectContext *obc = get_object_context(soid, OLOC_BLANK, false);
   if (!obc) {
-    osd->clog.error() << "missing primary copy of " << soid << "\n";
+    osd->clog.error() << info.pgid << " missing primary copy of " << soid << "\n";
+    missing.add(soid, v, eversion_t());
+    for (unsigned i=1; i<acting.size(); i++) {
+      int peer = acting[i];
+      if (!peer_missing[peer].is_missing(soid, v)) {
+       dout(10) << info.pgid << " unexpectedly missing " << soid << " v" << v
+                << ", will use copy on osd" << peer << dendl;
+       missing_loc[soid].insert(peer);
+      }
+    }
     return 0;
   }
 
@@ -4284,6 +4301,7 @@ int ReplicatedPG::recover_replicas(int max)
           p != m.rmissing.end() && started < max;
           ++p) {
       const sobject_t soid(p->second);
+      eversion_t v = p->first;
       if (pushing.count(soid)) {
        dout(10) << __func__ << ": already pushing " << soid << dendl;
        continue;
@@ -4297,7 +4315,7 @@ int ReplicatedPG::recover_replicas(int max)
       }
 
       dout(10) << __func__ << ": recover_object_replicas(" << soid << ")" << dendl;
-      started += recover_object_replicas(soid);
+      started += recover_object_replicas(soid, v);
     }
   }
 
index ab73f7e99511394a0729f1a189309943185495ea..45147cbcc585c012f21449f2e45036aed8f4be7b 100644 (file)
@@ -511,7 +511,7 @@ protected:
   };
   map<sobject_t, map<int, push_info_t> > pushing;
 
-  int recover_object_replicas(const sobject_t& soid);
+  int recover_object_replicas(const sobject_t& soid, eversion_t v);
   void calc_head_subsets(SnapSet& snapset, const sobject_t& head,
                         Missing& missing,
                         interval_set<uint64_t>& data_subset,