]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: log error instead of crashing on failed pull attempt
authorSage Weil <sage@newdream.net>
Tue, 7 Sep 2010 17:01:58 +0000 (10:01 -0700)
committerSage Weil <sage@newdream.net>
Wed, 6 Oct 2010 20:21:05 +0000 (13:21 -0700)
If peering screws up and the primary mistakenly tries to pull an object
from us we don't have, log an error instead of crashing.  This will still
throw off recovery (it will hang), but that's better than crashing
outright.

src/osd/ReplicatedPG.cc

index aba9a0c64ee71492dbefefcf3c4a914dadfaffca..b99476a4b7a807792838b256a3751163c981ac3d 100644 (file)
@@ -3377,14 +3377,24 @@ void ReplicatedPG::sub_op_pull(MOSDSubOp *op)
 
   struct stat st;
   int r = osd->store->stat(coll_t::build_pg_coll(info.pgid), soid, &st);
-  assert(r == 0);
-  uint64_t size = st.st_size;
+  if (r != 0) {
+    stringstream ss;
+    char buf[80];
+    ss << op->get_source() << " tried to pull " << soid << " in " << info.pgid
+       << " but got " << strerror_r(-r, buf, sizeof(buf));
+    osd->logclient.log(LOG_ERROR, ss);
+
+    // FIXME: do something more intelligent.. mark the pg as needing repair?
+
+  } else {
+    uint64_t size = st.st_size;
 
-  bool complete = false;
-  if (!op->data_subset.empty() && op->data_subset.end() >= size)
-    complete = true;
+    bool complete = false;
+    if (!op->data_subset.empty() && op->data_subset.end() >= size)
+      complete = true;
 
-  send_push_op(soid, op->get_source().num(), size, op->first, complete, op->data_subset, op->clone_subsets);
+    send_push_op(soid, op->get_source().num(), size, op->first, complete, op->data_subset, op->clone_subsets);
+  }
   op->put();
 }