]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: don't pull if source osd is down
authorSage Weil <sage@newdream.net>
Thu, 6 Nov 2008 17:43:59 +0000 (09:43 -0800)
committerSage Weil <sage@newdream.net>
Thu, 6 Nov 2008 19:09:21 +0000 (11:09 -0800)
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h

index 775f5ef9aa02d77ec6db8b4f5c53048a7bda32ca..323595ed2d85017a20142106459c2e1bc2101b39 100644 (file)
@@ -1735,7 +1735,7 @@ void ReplicatedPG::calc_clone_subsets(SnapSet& snapset, pobject_t poid,
 
 /** pull - request object from a peer
  */
-void ReplicatedPG::pull(pobject_t poid)
+bool ReplicatedPG::pull(pobject_t poid)
 {
   assert(missing.loc.count(poid.oid));
   eversion_t v = missing.missing[poid.oid].need;
@@ -1746,6 +1746,11 @@ void ReplicatedPG::pull(pobject_t poid)
           << " from osd" << fromosd
           << dendl;
 
+  if (!osd->osdmap->is_up(fromosd)) {
+    dout(7) << " osd" << fromosd << " is down" << dendl;
+    return false;
+  }
+
   map<pobject_t, interval_set<__u64> > clone_subsets;
   interval_set<__u64> data_subset;
 
@@ -1762,7 +1767,7 @@ void ReplicatedPG::pull(pobject_t poid)
        pull(head);
       }
       waiting_for_head.insert(poid.oid);
-      return;
+      return false;
     }
 
     // check snapset
@@ -1801,6 +1806,7 @@ void ReplicatedPG::pull(pobject_t poid)
   assert(pulling.count(poid.oid) == 0);
   pulling[poid.oid].first = v;
   pulling[poid.oid].second = fromosd;
+  return true;
 }
 
 
@@ -2414,8 +2420,9 @@ int ReplicatedPG::recover_primary(int max)
        }
       }
 
-      pull(poid);
-      if (++started >= max)
+      if (pull(poid))
+       ++started;
+      if (started >= max)
        return started;
     }
     
index 7fcd8641c492f2415c7709dacd201d2d4852c8f2..a7f471704d43af88db88edb105ed2c2ce1c67491 100644 (file)
@@ -107,7 +107,7 @@ protected:
   void push(pobject_t oid, int dest);
   void push(pobject_t oid, int dest, interval_set<__u64>& data_subset, 
            map<pobject_t, interval_set<__u64> >& clone_subsets);
-  void pull(pobject_t oid);
+  bool pull(pobject_t oid);
 
   // modify
   void op_modify_commit(tid_t rep_tid, eversion_t pg_complete_thru);